English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Erlang ポート(Port)

Erlangでは、ポートは異なるプログラム間の通信に使用されます。ソケットは通信の端点であり、コンピュータがインターネットプロトコル(IP)を通じてインターネットを介して通信を行うことを許可するものです。

ポートで使用されるプロトコルのタイプ

通信に使用されるプロトコルには二種類あります。一つはUDP、もう一つはTCPです。UDPはアプリケーション間で短いメッセージ(データグラムと呼ばれます)を相互に送信することができますが、これらのメッセージの伝達を保証しません。また、故障も発生する可能性があります。一方、TCPは接続が確立されると、バイトが順序通りに伝達される信頼性の高いバイトストリームを提供します。

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, 長さ)

パラメータ

  • ソケット 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}]), 
   サーバーがソケットを開いた:~p~nと表示する [Socket]), 
   loop(Socket). 
loop(Socket) ->
   inet:setopts(Socket, [{active, once}]), 
   receive 
      {udp, Socket, Host, Port, Bin} -> 
      サーバーが受信した:~p~nと表示する [Bin]), 
      gen_udp:send(Socket, Host, Port, Bin), 
      loop(Socket) 
   end. 
client(N) -> 
   {ok, Socket} = gen_udp:open(0, [binary]), 
   クライアントがソケットを開いた:~p~nと表示する [Socket]), 
   ok = gen_udp:send(Socket, "localhost", 4000, N), Value = receive 
      {udp, Socket, _, _, Bin} ->
         クライアントが受信した:~p~nと表示する [Bin] が後で 2000 ->
      0 
   end, 
   
gen_udp:close(Socket), 
Value.

上記のプログラムについて、以下の点に注意してください。

  • 私たちは二つの関数を定義しました。一つはサーバー関数で、ポートをリスンするために使用されます。4000。二つめはクライアントで、サーバーコンポーネントに「Hello」メッセージを送信するために使用されます。

  • 受け取りループは、定義されたループ内に送信されたメッセージを読み取るために使用されます。

出力

今、二つのウィンドウでプログラムを実行する必要があります。最初のウィンドウは、以下のコードを実行してサーバーコンポーネントを実行します。

helloworld:start().

これにより、コマンドラインウィンドウに以下の出力が表示されます。

server opened socket:#Port<0.2314>

今、二つめのerlコマンドラインウィンドウで以下のコマンドを実行します。

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

このコマンドを実行すると、以下の出力が最初のコマンドラインウィンドウに表示されます。

server received:<<"Hello">>