在Erlang中,端口用于不同程序之間的通信。套接字是一種通信端點,它允許計算機使用Internet協(xié)議(IP)通過Internet進行通信。
有兩種協(xié)議可用于通信。一個是UDP,另一個是TCP。UDP允許應(yīng)用程序相互發(fā)送短消息(稱為數(shù)據(jù)報),但不能保證這些消息的傳遞。它們也可能出現(xiàn)故障。另一方面,TCP提供了一個可靠的字節(jié)流,只要建立了連接,這些字節(jié)就按順序傳遞。
讓我們看一個使用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")]).以上程序的輸出如下。
#Port<0.376>ok
打開端口后,端口上還可以接收到一條消息。這是通過 recv 方法完成的。讓我們看一下語法和下面的示例。
recv(Socket, length)
Socket ?這是使用gen_udp:open命令創(chuàng)建的套接字。
Length ?這是需要接收的消息的長度。
如果消息發(fā)送正確,則返回確定消息。
-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)]).現(xiàn)在顯然我們不能在同一程序中具有相同的發(fā)送和接收消息。您需要在不同的程序中定義它們。因此,讓我們創(chuàng)建以下代碼,該代碼創(chuàng)建一個偵聽消息的服務(wù)器組件和一個發(fā)送消息的客戶端組件。
-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.關(guān)于上述程序,需要注意以下幾點。
我們定義了兩個函數(shù),第一個是服務(wù)器函數(shù)。這將用于監(jiān)聽端口4000。第二個是客戶端,它將用于向服務(wù)器組件發(fā)送消息“ Hello”。
接收循環(huán)用于讀取在定義循環(huán)內(nèi)發(fā)送的消息。
現(xiàn)在你需要從兩個窗口運行程序。第一個窗口將通過在 erl 命令行窗口中運行以下代碼來運行服務(wù)器組件。
helloworld:start().
這將在命令行窗口中顯示以下輸出。
server opened socket:#Port<0.2314>
現(xiàn)在,在第二個erl命令行窗口中,運行以下命令。
Helloworld:client(“<<Hello>>”).
發(fā)出此命令時,以下輸出將顯示在第一個命令行窗口中。
server received:<<"Hello">>