Posts Tagged ‘Erlang’

ErlangでTCPプログラム

日曜日, 2月 9th, 2014

「プログラミングErlang」(オーム社)この本を読むと、Erlangでいろいろと作ってみたくなります。
文法的にとっつきにくいところがあるのですが、実例が豊富にあり読み進めるにつれこの言語の魅力に引き込まれます。
私は関数型言語ということよりも、小さなプログラム同士を通信させながら大きなものをつくっていくという疎結合の特徴が魅力です。
そこでまず基本となる、TCPクライアント、サーバ通信のテストをしてみました。
本のサンプルを参考に、わかりやすくするためこれ以上ないくらいに余計な部分をそぎ落としました。

環境:Erlang R16B03(erts-5.10.4)[64-bit] Eshell V5.10.4 (otp_win64_R16B03.exe)/ Windows7

-module(socket_test).
-compile(export_all).
-import(lists, [reverse/1]).

start_client(Str) ->
    {ok, Socket} = 
	gen_tcp:connect("localhost", 1234,
			[binary, {packet, 4}]),
    ok = gen_tcp:send(Socket, Str),
    receive
	{tcp,Socket,Bin} ->
	    io:format("Client received = ~p~n",[Bin]),
	    gen_tcp:close(Socket)
    end.

start_server() ->
    {ok, Listen} = gen_tcp:listen(1234, [binary, {packet, 4},
					 {reuseaddr, true},
					 {active, true}]),
    {ok, Socket} = gen_tcp:accept(Listen),
    gen_tcp:close(Listen),
    loop(Socket).

loop(Socket) ->
    receive
	{tcp, Socket, Str} ->
	    io:format("Server received  = ~p~n",[Str]),
	    gen_tcp:send(Socket, [Str]),
	    loop(Socket);
	{tcp_closed, Socket} ->
	    io:format("Server socket closed~n")
    end.

クライアントとサーバは同じプログラムを使います。コンソールを二つ立ち上げてそれぞれErlangシェルで実行します。
[サーバ側]

c(socket_test).
socket_test:start_server().

[クライアント側]

socket_test:start_client(“TestMessage”).

“TestMessage”がサーバ側のコンソールに表示されます。

それぞれの言語、それをとりまく環境の得意なところを知っておくことによって、より効率のよいソリューションを生み出すことができると常々思っています。このErlang、強力に創造性を刺激してくれそうです。