Erlang - Häfen
In Erlang werden Ports für die Kommunikation zwischen verschiedenen Programmen verwendet. Ein Socket ist ein Kommunikationsendpunkt, über den Computer mithilfe des Internet Protocol (IP) über das Internet kommunizieren können.
In Ports verwendete Protokolltypen
Für die Kommunikation stehen zwei Arten von Protokollen zur Verfügung. Einer ist UDP und der andere ist TCP. Mit UDP können Anwendungen Kurznachrichten (sogenannte Datagramme) aneinander senden, es gibt jedoch keine Garantie für die Zustellung dieser Nachrichten. Sie können auch außer Betrieb ankommen. TCP hingegen liefert einen zuverlässigen Strom von Bytes, die in der Reihenfolge geliefert werden, in der die Verbindung hergestellt wird.
Schauen wir uns ein einfaches Beispiel für das Öffnen eines Ports mit UDP an.
Beispiel
-module(helloworld).
-export([start/0]).
start() ->
{ok, Socket} = gen_udp:open(8789),
io:fwrite("~p",[Socket]).
Die folgenden Dinge müssen über das obige Programm beachtet werden
Das gen_udp enthält die Module in Erlang, die für die UDP-Kommunikation verwendet werden.
Hier ist 8789 die Portnummer, die in Erlang geöffnet wird. Sie müssen sicherstellen, dass diese Portnummer verfügbar ist und verwendet werden kann.
Die Ausgabe des obigen Programms ist -
#Port<0.376>
Senden einer Nachricht am Port
Sobald der Port geöffnet wurde, kann eine Nachricht an den Port gesendet werden. Dies erfolgt über die Sendemethode. Schauen wir uns die Syntax und das folgende Beispiel an.
Syntax
send(Socket, Address, Port, Packet)
Parameter
Socket - Dies ist der Socket, der mit dem Befehl gen_udp: open erstellt wurde.
Address - Dies ist die Maschinenadresse, an die die Nachricht gesendet werden muss.
port - Dies ist die Portnummer, an die die Nachricht gesendet werden muss.
Packet - Dies sind die Paket- oder Nachrichtendetails, die gesendet werden müssen.
Rückgabewerte
Eine OK-Nachricht wird zurückgegeben, wenn die Nachricht ordnungsgemäß gesendet wurde.
Zum Beispiel
-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")]).
Ausgabe
Die Ausgabe des obigen Programms ist wie folgt.
#Port<0.376>ok
Empfangen einer Nachricht am Port
Sobald der Port geöffnet wurde, kann auch eine Nachricht am Port empfangen werden. Dies erfolgt über dierecv method. Schauen wir uns die Syntax und das folgende Beispiel an.
Syntax
recv(Socket, length)
Parameter
Socket - Dies ist der Socket, der mit dem Befehl gen_udp: open erstellt wurde.
Length - Dies ist die Länge der Nachricht, die empfangen werden muss.
Rückgabewerte
Eine OK-Nachricht wird zurückgegeben, wenn die Nachricht ordnungsgemäß gesendet wurde.
Zum Beispiel
-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)]).
Das komplette Programm
Jetzt können wir natürlich nicht dieselbe Sende- und Empfangsnachricht im selben Programm haben. Sie müssen in verschiedenen Programmen definiert sein. Erstellen Sie also den folgenden Code, der eine Serverkomponente erstellt, die Nachrichten abhört, und eine Clientkomponente, die Nachrichten sendet.
Beispiel
-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.
Die folgenden Dinge müssen über das obige Programm beachtet werden.
Wir definieren 2 Funktionen, die erste ist Server. Dies wird verwendet, um den Port 4000 abzuhören. Der zweite ist der Client, der verwendet wird, um die Nachricht "Hallo" an die Serverkomponente zu senden.
Die Empfangsschleife wird verwendet, um die innerhalb einer Definitionsschleife gesendeten Nachrichten zu lesen.
Ausgabe
Jetzt müssen Sie das Programm unter 2 Fenstern ausführen. Das erste Fenster wird verwendet, um die Serverkomponente auszuführen, indem der folgende Code in ausgeführt wirderl command line window.
helloworld:start().
Dadurch wird die folgende Ausgabe im Befehlszeilenfenster angezeigt.
server opened socket:#Port<0.2314>
Führen Sie nun im zweiten erl-Befehlszeilenfenster den folgenden Befehl aus.
Helloworld:client(“<<Hello>>”).
Wenn Sie diesen Befehl eingeben, wird die folgende Ausgabe im ersten Befehlszeilenfenster angezeigt.
server received:<<"Hello">>