English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En Erlang, los puertos se utilizan para la comunicación entre diferentes programas. Un socket es un punto de comunicación, que permite a las computadoras comunicarse a través de Internet utilizando el protocolo de Internet (IP).
Hay dos protocolos disponibles para la comunicación. Uno es UDP, y el otro es TCP. UDP permite que las aplicaciones envíen mensajes cortos entre sí (llamados datagramas), pero no garantiza la transmisión de estos mensajes. También pueden fallar. Por otro lado, TCP proporciona un flujo de bytes confiable, siempre que se establezca la conexión, estos bytes se transmiten en orden.
Vamos a ver un ejemplo simple de cómo abrir un puerto usando UDP.
-module(helloworld). -export([start/0]). start() -> {ok, Socket} = gen_udp:open(8789), fwrite("~p",[Socket]), io:fwrite("~p",[gen_udp:send (Socket,"localhost",8789,"Hola")]).
La salida del programa anterior es la siguiente.
#Puerto<0.376>ok
Después de abrir el puerto, también se puede recibir un mensaje en el puerto. Esto se realiza mediante el método recv. Vamos a ver la sintaxis y el siguiente ejemplo.
recv(Socket, longitud)
Socket −Este es el socket creado con la orden gen_udp:open.
Longitud −Este es el largo de la mensaje que necesita recibir.
Si el mensaje se envía correctamente, devuelve un mensaje de confirmación.
-module(helloworld). -export([start/0]). start() -> {ok, Socket} = gen_udp:open(8789), fwrite("~p",[Socket]), fwrite("~p",[gen_udp:send(Socket,"localhost",8789,"Hello")]), fwrite("~p",[gen_udp:recv(Socket, 20)]).
Ahora es obvio que no podemos tener el mismo mensaje de envío y recepción en el mismo programa. Necesita definirlos en programas diferentes. Por lo tanto, creamos el siguiente código, que crea un componente de servidor de escucha de mensajes y un componente de cliente de envío de mensajes.
-module(helloworld). -export([start/0,client/1]). start() -> spawn(fun() -> server(4000) end). server(Port) -> {ok, Socket} = gen_udp:open(Port, [binary, {active, false}]), format("server opened socket:~p~n",[Socket]), loop(Socket). loop(Socket) -> inet:setopts(Socket, [{active, once}]), receive {udp, Socket, Host, Port, Bin} -> format("server received:~p~n",[Bin]), gen_udp:send(Socket, Host, Port, Bin), loop(Socket) end. client(N) -> {ok, Socket} = gen_udp:open(0, [binary]), format("client opened socket=~p~n",[Socket]), ok = gen_udp:send(Socket, "localhost", 4000, N), Value = receive {udp, Socket, _, _, Bin} -> format("client received:~p~n",[Bin]) after 2000 -> 0 end, gen_udp:close(Socket), Valor.
Con respecto a este programa, hay algunos puntos que destacar.
Definimos dos funciones, la primera es la función del servidor. Esto se utilizará para escuchar el puerto4000. La segunda es el cliente, que se utilizará para enviar el mensaje "Hello" al componente del servidor.
El bucle de recepción se utiliza para leer los mensajes enviados dentro del bucle definido.
Ahora necesita ejecutar el programa desde las dos ventanas. La primera ventana ejecutará el componente del servidor mediante la ejecución del siguiente código en la ventana de comandos erl.
helloworld:start().
Esto mostrará el siguiente output en la ventana de comandos.
El servidor abrió el socket:#Port<0.2314>
Ahora, en la segunda ventana de comandos erl, ejecute el siguiente comando.
Helloworld:client(“<<Hello>>”).
Cuando se emite este comando, el siguiente output se mostrará en la primera ventana de comandos.
El servidor recibió: <<"Hello">>