0

クライアントサーバープログラムを実装しようとしています。サーバーは、次のコードを使用してリッスン ソケットをセットアップします。

gen_tcp:listen(ポート、[バイナリ、{アクティブ、真}])

問題は、クライアントが大きなメッセージ (タプルのリスト) をサーバーに送信すると、サーバーが代わりにいくつかのメッセージを受信することです。TCP が長いメッセージをいくつかのメッセージに分割しているようです。

長いメッセージ全体を一度に取得するにはどうすればよいでしょうか?

4

1 に答える 1

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

サーバー.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()と、結果が表示されます。

于 2014-02-27T04:45:04.373 に答える