Erlang 端口(Port)

在Erlang中,端口用于不同程序之間的通信。套接字是一種通信端點(diǎn),它允許計(jì)算機(jī)使用Internet協(xié)議(IP)通過(guò)Internet進(jìn)行通信。

端口中使用的協(xié)議類(lèi)型

有兩種協(xié)議可用于通信。一個(gè)是UDP,另一個(gè)是TCP。UDP允許應(yīng)用程序相互發(fā)送短消息(稱(chēng)為數(shù)據(jù)報(bào)),但不能保證這些消息的傳遞。它們也可能出現(xiàn)故障。另一方面,TCP提供了一個(gè)可靠的字節(jié)流,只要建立了連接,這些字節(jié)就按順序傳遞。

讓我們看一個(gè)使用UDP打開(kāi)端口的簡(jiǎn)單示例。

實(shí)例

-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

在端口上接收消息

打開(kāi)端口后,端口上還可以接收到一條消息。這是通過(guò) recv 方法完成的。讓我們看一下語(yǔ)法和下面的示例。

語(yǔ)法

recv(Socket, length)

參數(shù)

  • Socket ?這是使用gen_udp:open命令創(chuàng)建的套接字。

  • Length ?這是需要接收的消息的長(zhǎng)度。

返回值

如果消息發(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)建一個(gè)偵聽(tīng)消息的服務(wù)器組件和一個(gè)發(fā)送消息的客戶端組件。

實(shí)例

-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)于上述程序,需要注意以下幾點(diǎn)。

  • 我們定義了兩個(gè)函數(shù),第一個(gè)是服務(wù)器函數(shù)。這將用于監(jiān)聽(tīng)端口4000。第二個(gè)是客戶端,它將用于向服務(wù)器組件發(fā)送消息“ Hello”。

  • 接收循環(huán)用于讀取在定義循環(huán)內(nèi)發(fā)送的消息。

輸出

現(xiàn)在你需要從兩個(gè)窗口運(yùn)行程序。第一個(gè)窗口將通過(guò)在 erl 命令行窗口中運(yùn)行以下代碼來(lái)運(yùn)行服務(wù)器組件。

helloworld:start().

這將在命令行窗口中顯示以下輸出。

server opened socket:#Port<0.2314>

現(xiàn)在,在第二個(gè)erl命令行窗口中,運(yùn)行以下命令。

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

發(fā)出此命令時(shí),以下輸出將顯示在第一個(gè)命令行窗口中。

server received:<<"Hello">>
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清