2

リアルタイムのマルチプレイヤー ゲーム用のゲーム サーバーを作成することを期待して、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

受信データを解析するにはどうすればよいですか? このスタイルのパターン マッチングは完全に失敗しているようです。ありがとう!

4

1 に答える 1

2

これを試してください:

case binary_to_list(Data) of
    "Hello\r\n" -> gen_tcp:send(Socket, "this will be good variant\n");
    _ -> gen_tcp:send(Socket, "I don't understand")
end,

または明示的な変換なし:

case Data of
    <<"Hello\r\n">> -> gen_tcp:send(Socket, "this will be good variant\n");
    _ -> gen_tcp:send(Socket, "I don't understand")
end,

コメントから更新

より複雑なマッチングを使用するには、"\r\n"最初にサフィックスを削除します。

Content = list_to_binary(lists:subtract(binary_to_list(Data), "\r\n")),
case Content of
    <<"Hello">> -> gen_tcp:send(Socket, <<"Good day!\n">>);
    <<"My name is, ", Name/binary>> -> gen_tcp:send(Socket, <<"Hello ", Name/binary, "!\n">>);
    _ -> gen_tcp:send(Socket, "I don't understand")
end,
于 2012-08-26T19:48:12.550 に答える