2014-02-26 44 views
0

我试图实现一个客户端服务器程序。 服务器建立一个侦听套接字用下面的代码:向Erlang的gen_tcp服务器发送大量消息

调用gen_tcp:听(端口,[二进制,{活性,真}])

的问题是,当客户端发送大量消息的(列表元组)到服务器,服务器接收几条消息。似乎TCP将长信息分成几个信息。

我们应该如何处理一次才能得到整个长信息?

+2

TCP没有消息的概念。您需要像ØMQ,HTTP或'{packet,4}'这样的更高级别的协议。 – rightfold

回答

0

我不认为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(),你可以看到结果。