リアルタイムのマルチプレイヤー ゲーム用のゲーム サーバーを作成することを期待して、Erlang の学習を開始しています。現在、Erlang が Scala に対して引き起こす作業量と頭痛の量を見積もろうとしています。まず、単純な Erlang サーバー プロセスを作成します。Jesse Farmerによる素敵なチュートリアルを見つけました。これを修正して、詳細を学びました。私の変更されたコードは、彼のエコー サーバーと似ていることを意図していますが、英語の単語を取り込んでロジバンに相当するものを返すだけです。ただし、ワイルドカード ケースのみが選択されます。コードは次のとおりです。
-module(translate).
-export([listen/1]).
-import(string).
-define(TCP_OPTIONS, [binary, {packet, 0}, {active, false}, {reuseaddr, true}]).
% Call echo:listen(Port) to start the service.
listen(Port) ->
{ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
accept(LSocket).
% Wait for incoming connections and spawn the echo loop when we get one.
accept(LSocket) ->
{ok, Socket} = gen_tcp:accept(LSocket),
spawn(fun() -> loop(Socket) end),
accept(LSocket).
% Echo back whatever data we receive on Socket.
loop(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
case Data of
"Hello" -> gen_tcp:send(Socket, "coi\n");
"Hello\n" -> gen_tcp:send(Socket, "coi\n");
'Hello' -> gen_tcp:send(Socket, "coi\n");
<<"Hello">> -> gen_tcp:send(Socket, "coi\n");
<<"Hello\n">> -> gen_tcp:send(Socket, "coi\n");
_ -> gen_tcp:send(Socket, "I don't understand")
end,
loop(Socket);
{error, closed} ->
ok
end.
私の現在のテストは、2 つのターミナル ウィンドウを開いて実行することです
[CONSOLE 1]
erl
c(translate).
translate:listen(8888).
[CONSOLE 2]
telnet localhost 8888
whatever
Hello
出力は次のようになります。
I don't understand
I don't understand
受信データを解析するにはどうすればよいですか? このスタイルのパターン マッチングは完全に失敗しているようです。ありがとう!