tcp - Erlang TCP 服务器处理

标签 tcp erlang

我开始学习 Erlang,希望能够创建一个实时多人游戏的游戏服务器。目前,我正在尝试估计 Erlang 与 Scala 相比会造成的工作量和头痛。因此,首先,我创建一个简单的 Erlang 服务器进程。我发现了一个很好的教程 Jesse Farmer我对其进行了修改以了解更多信息。我修改后的代码与他的 echo 服务器类似,只不过它接受英文单词并简单地返回 Lojban 等效项。但是,仅选择通配符大小写。这是代码:

-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.

我当前的测试是打开两个终端窗口并执行

[CONSOLE 1]
erl
c(translate).
translate:listen(8888).

[CONSOLE 2]
telnet localhost 8888
whatever
Hello

输出变为:

I don't understand
I don't understand

如何解析传入的数据?这种模式匹配风格似乎完全失败了。谢谢!

最佳答案

试试这个:

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,

关于tcp - Erlang TCP 服务器处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12132941/

相关文章:

http - TCP "Connection"是如何维护的,HTTP Keep-Alive 对其有何影响?

Android 在 Activity 被销毁时停止 Activity 中的线程

concurrency - Erlang消息接收顺序

haskell - 如何让 Haskell 的 TChan 像 Erlang 的消息队列一样延迟消息?

c++ - Qt TCP 服务器不从客户端读取数据

c# - tcp/ip 接受不返回,但客户端返回

erlang - 大文件的写入会阻止 Erlang VM 吗?

erlang - 将数百万条记录写入 mnesia 表会占用大量内存(RAM)并且即使删除这些记录也不会回收

erlang - Erlang 中仅订购应用程序依赖项

c - 通过 TCP 发送结构(C 编程)