Erlang - 埠



在 Erlang 中,埠用於不同程式之間的通訊。套接字是一個通訊端點,允許機器透過使用網際網路協議 (IP) 在網際網路上進行通訊。

埠中使用的協議型別

有兩種型別的協議可用於通訊。一個是 UDP,另一個是 TCP。UDP 允許應用程式相互發送短訊息(稱為資料報),但無法保證這些訊息的交付。它們也可能無序到達。另一方面,TCP 提供可靠的位元組流,只要連線建立,這些位元組流就會按順序傳遞。

讓我們看一個使用 UDP 開啟埠的簡單示例。

示例

-module(helloworld). 
-export([start/0]). 

start() -> 
   {ok, Socket} = gen_udp:open(8789), 
   io:fwrite("~p",[Socket]).

關於上述程式需要注意以下幾點

  • gen_udp 包含 Erlang 中用於 UDP 通訊的模組。

  • 這裡 8789 是在 Erlang 中開啟的埠號。您需要確保此埠號可用且可以使用。

上述程式的輸出為 -

#Port<0.376>

在埠上傳送訊息

開啟埠後,可以在埠上傳送訊息。這是透過 send 方法完成的。讓我們看看語法和以下示例。

語法

send(Socket, Address, Port, Packet)

引數

  • Socket - 這是使用 gen_udp:open 命令建立的套接字。

  • Address - 這是要將訊息傳送到的機器地址。

  • port - 這是需要傳送訊息的埠號。

  • Packet - 這是需要傳送的資料包或訊息詳細資訊。

返回值

如果訊息傳送成功,則返回 ok 訊息。

例如

-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 命令建立的套接字。

  • Length - 這是需要接收的訊息的長度。

返回值

如果訊息傳送成功,則返回 ok 訊息。

例如

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

關於上述程式需要注意以下幾點。

  • 我們定義了兩個函式,第一個是 server。這將用於偵聽埠 4000。第二個是 client,它將用於向伺服器元件傳送訊息“Hello”。

  • receive 迴圈用於在定義的迴圈中讀取傳送的訊息。

輸出

現在您需要從兩個視窗執行程式。第一個視窗將用於透過在erl 命令列視窗中執行以下程式碼來執行伺服器元件。

helloworld:start().

這將在命令列視窗中顯示以下輸出。

server opened socket:#Port<0.2314>

現在在第二個 erl 命令列視窗中,執行以下命令。

Helloworld:client(“<<Hello>>”).

當您發出此命令時,第一個命令列視窗將顯示以下輸出。

server received:<<"Hello">>
廣告

© . All rights reserved.