【问题标题】:Sending large messages to gen_tcp server in Erlang [duplicate]在 Erlang 中向 gen_tcp 服务器发送大消息 [重复]
【发布时间】:2014-03-29 13:44:36
【问题描述】:

我正在尝试实现一个客户端服务器程序。 服务端设置监听socket,代码如下:

gen_tcp:listen(Port, [binary, {active, true}])

问题是当客户端向服务器发送大消息(元组列表)时,服务器会收到几条消息。似乎 TCP 正在将长消息拆分为多个消息。

我们如何处理一次得到整个长消息?

【问题讨论】:

  • TCP 没有消息的概念。您需要更高级别的协议,例如 ØMQ、HTTP 或 { packet, 4 }

标签: sockets erlang listen gen-tcp


【解决方案1】:

我不认为tcp包被拆分,我使用以下程序测试它。

client.erl

-module(client).
-compile(export_all).

send(Message) ->
    {ok, Socket} = gen_tcp:connect("localhost", 1234, [binary, {packet, 4}]),
    ok = gen_tcp:send(Socket, list_to_binary(Message)),
    gen_tcp:close(Socket).


main() ->
    Message = ["atom" ++ integer_to_list(X) || X <- lists:seq(1, 1000)],
    send(Message).

server.erl

-module(server).
-compile(export_all).

start()->
    {ok, ListenSocket} = gen_tcp:listen(1234, [binary, {packet, 4}, 
                     {active, true}, {reuseaddr, true}]),
    spawn(fun() -> per_connect(ListenSocket) end).

per_connect(ListenSocket) ->
    {ok, Socket} = gen_tcp:accept(ListenSocket),
    spawn(fun() -> per_connect(ListenSocket) end),
    loop(Socket).

loop(Socket) ->
    receive
        {tcp, Socket, Data} ->
            io:format("~p~n", [binary_to_list(Data)]),
            loop(Socket);
        {tcp_closed, Socket} ->
            io:format("closed~n"),
            gen_tcp:close(Socket)
    end.

你可以先运行server:start().,再运行client:main(),就可以看到结果了。

【讨论】:

    猜你喜欢
    • 2017-11-02
    • 2012-04-02
    • 2012-09-21
    • 2013-04-29
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多