English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Puerto (Port) de Erlang

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).

Tipo de protocolo utilizado en el puerto

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.

Instancia

-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")]).

Salida

La salida del programa anterior es la siguiente.

#Puerto<0.376>ok

Recibir mensajes en el puerto

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.

Sintaxis

recv(Socket, longitud)

Parámetros

  • Socket −Este es el socket creado con la orden gen_udp:open.

  • Longitud −Este es el largo de la mensaje que necesita recibir.

Valor de retorno

Si el mensaje se envía correctamente, devuelve un mensaje de confirmación.

Por ejemplo

-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)]).

Programa completo

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.

Instancia

-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.

Salida

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">>