English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En Erlang, les ports sont utilisés pour la communication entre différentes programmes. Un socket est un point de terminaison de communication qui permet aux ordinateurs de communiquer via les protocoles IP (Internet Protocol) sur Internet.
Deux protocoles peuvent être utilisés pour la communication. L'un est UDP, et l'autre est TCP. UDP permet aux applications d'échanger des messages courts (appelés datagrammes), mais ne garantit pas la transmission de ces messages. Ils peuvent également échouer. D'un autre côté, TCP fournit un flux de bytes fiable, où les bytes sont transmis en ordre tant que la connexion est établie.
Voyons un exemple simple d'ouverture d'un port 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")]).
La sortie du programme ci-dessus est la suivante.
#Port<0.376>ok
Après avoir ouvert le port, il est encore possible de recevoir un message sur ce port. Cela est réalisé par la méthode recv. Voyons la syntaxe et l'exemple suivant.
recv(Socket, length)
Socket C'est le socket créé en utilisant la commande gen_udp:open.
Length −这是需要接收的消息的长度。
如果消息发送正确,则返回确定消息。
-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)]).
现在显然我们不能在同一程序中具有相同的发送和接收消息。您需要在不同的程序中定义它们。因此,让我们创建以下代码,该代码创建一个侦听消息的服务器组件和一个发送消息的客户端组件。
-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.
Pour le programme ci-dessus, il est important de noter les points suivants.
Nous avons défini deux fonctions, la première étant la fonction serveur. Cela sera utilisé pour écouter le port4000. Deuxième est le client, qui sera utilisé pour envoyer le message "Hello" au composant serveur.
Boucle de réception pour lire les messages envoyés dans la boucle définie.
Maintenant, vous devez exécuter le programme dans les deux fenêtres. La première fenêtre exécutera le composant serveur en exécutant le code suivant dans la fenêtre de ligne de commande erl.
helloworld:start().
Cela affichera le suivant dans la fenêtre de ligne de commande.
server opened socket:#Port<0.2314>
Maintenant, dans la deuxième fenêtre de ligne de commande erl, exécutez la commande suivante.
Helloworld:client(“<<Hello>>”).
Lorsque vous exécutez cette commande, le suivant affichage apparaîtra dans la première fenêtre de ligne de commande.
server received:<<"Hello">>