1

メッセージをサーバーに送信し、応答を受信する単純なクライアントを作成したいと考えています。接続されているすべてのクライアントに同じメッセージをブロードキャストするサーバーがあり、telnet でテストしているときに動作します。Erlang シェルを使用して実行しようとすると、ソケットを閉じるまで gen_tcp:send はメッセージを送信しません。

これは私がやろうとしていることです:

{ok, S} = gen_tcp:connect(IP, Port, []).
gen_tcp:send(S, "Test").
flush().

Telnet クライアントを見ると、ソケットを閉じるとメッセージが送信されることがわかります。

Erlang バージョン:R14B01 (erts-5.8.2)

アップデート

hdima はコメントし、サーバーがストリームからメッセージを抽出する方法が間違っている可能性があると述べました。これは、クライアントが期待どおりに動作するように見える独自のサーバーを作成しようとした場合の原因のようです。サーバーのソースコードを取得してみます。サーバーはところで Java で書かれています。

4

3 に答える 3

4

データの小さなチャンクを送信するとき、ソケットはそれらをバッファリングして、TCPパケットの最大ペイロードを埋めようとします。

ソケットを閉じると、割り当てが解除される前にフラッシュされるため、これが発生している可能性があります。

設定してみてください

{nodelay, true}

ソケットのオプション。

詳細はこちら: http ://www.erlang.org/doc/man/inet.html#setopts-2

于 2011-09-12T07:14:56.473 に答える
3

主な問題は、Universal Message Formatがないことです。したがって、最初のステップは、サーバーが使用しているメッセージ形式を見つけることです。別の言語でサーバーと話すことはできません。

一部のメッセージ形式は次のとおりです。

  • ストリーム全体がメッセージです。
  • 固定サイズのメッセージ。
  • マーカーで区切られたメッセージ。たとえば、SMTPPOPHTTP、および他の多くのプロトコルがこのタイプのメッセージを使用します。
  • サイズ フィールドを持つメッセージ。たとえば、TLV (Type-Length-Value)メッセージ形式。IPUDPErlangおよび他の多くのプロトコルがこのタイプのメッセージを使用します。

たとえば、サーバーが改行文字で区切られたメッセージを理解する場合、次のコードで 2 つの異なるメッセージを送信できます。

1> {ok, S} = gen_tcp:connect(IP, Port, []).
2> gen_tcp:send(S, "Test\n").
3> gen_tcp:send(S, "Test2\n").
于 2011-09-09T21:20:29.340 に答える
1

Erlang サーバーでこれを試して、サーバー側に問題があるのか​​クライアント側に問題があるのか​​を確認できます。

シェル A:

1> {ok, L} = gen_tcp:listen(12345, [{active, false}]).
{ok,#Port<0.601>}
2> {ok, S} = gen_tcp:accept(L), {ok, P} = gen_tcp:recv(S, 0), gen_tcp:send(S, P).
... % Server will block here until a message comes
ok

シェル B:

1> {ok, S} = gen_tcp:connect(localhost, 12345, []), gen_tcp:send(S, "hello").
ok
2> flush().
Shell got {tcp,#Port<0.607>,"hello"}

これが機能する場合、Java 側の問題である可能性が最も高いです。

于 2011-09-09T07:12:27.487 に答える