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