English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
No Erlang, as portas são usadas para comunicação entre diferentes programas. Um soquete é um ponto de comunicação que permite que um computador use o protocolo de Internet (IP) para se comunicar através da Internet.
Existem dois protocolos disponíveis para comunicação. Um é UDP e o outro é TCP. O UDP permite que aplicações enviem mensagens curtas (conhecidas como datagramas) entre si, mas não garante a entrega dessas mensagens. Elas também podem falhar. Por outro lado, o TCP oferece um fluxo de bytes confiável, onde os bytes são transmitidos em ordem desde que a conexão seja estabelecida.
Vamos ver um exemplo simples de como abrir uma porta usando UDP.
-module(helloworld). -export([start/0]). start() -> {ok, Socket} = gen_udp:open(8789), io:fwrite("~p",[Socket]), io:fwrite("~p",[gen_udp:send (Socket,"localhost",8789,"Hello")]).
A saída do programa acima é a seguinte.
#Port<0.376>ok
Após abrir a porta, ainda é possível receber uma mensagem na porta. Isso é feito através do método recv. Vamos ver a sintaxe e o exemplo a seguir.
recv(Socket, length)
Socket −É um soquete criado usando o comando gen_udp:open.
Length −É o comprimento da mensagem que precisa ser recebida.
Se a mensagem for enviada corretamente, retornará uma mensagem de confirmação.
-module(helloworld). -export([start/0]). start() -> {ok, Socket} = gen_udp:open(8789), io:fwrite("~p",[Socket]), io:fwrite("~p",[gen_udp:send(Socket,"localhost",8789,"Hello")]), io:fwrite("~p",[gen_udp:recv(Socket, 20)]).
Agora, claramente, não podemos ter a mesma mensagem de envio e recebimento no mesmo programa. Você precisa defini-las em programas diferentes. Portanto, vamos criar o seguinte código, que cria um componente de servidor de escuta de mensagens e um componente de cliente de envio de mensagens.
-module(helloworld). -export([start/0,client/1]). start() -> spawn(fun() -> server(4000) end). server(Port) -> {ok, Socket} = gen_udp:open(Port, [binary, {active, false}]), io:format("server opened socket:~p~n",[Socket]), loop(Socket). loop(Socket) -> inet:setopts(Socket, [{active, once}]), receive {udp, Socket, Host, Port, Bin} -> io: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]), io:format("client opened socket=~p~n",[Socket]), ok = gen_udp:send(Socket, "localhost", 4000, N), Value = receive {udp, Socket, _, _, Bin} -> io:format("client received:~p~n",[Bin]) after 2000 -> 0 end, gen_udp:close(Socket), Value.
A respeito do programa acima, há alguns pontos a serem notados.
Definimos duas funções, a primeira é a função do servidor. Isso será usado para ouvir a porta4000. O segundo é o cliente, que será usado para enviar a mensagem "Hello" para o componente do servidor.
O loop de recebimento é usado para ler mensagens enviadas dentro do loop definido.
Agora você precisa executar o programa nas duas janelas. A primeira janela executará o componente do servidor, digitando o seguinte código na janela de linha de comando do erl.
helloworld:start().
Isso exibirá a seguinte saída na janela de linha de comando.
server opened socket:#Port<0.2314>
Agora, na segunda janela de linha de comando do erl, execute o seguinte comando.
Helloworld:client(“<<Hello>>”).
Quando você emitir este comando, a seguinte saída será exibida na primeira janela de linha de comando.
server received:<<"Hello">>