1

手伝っていただけませんか?gen_tcp send 関数に関連する問題があります。私は、amf オブジェクトにデコードされた約 10 ~ 15 個のアイテムのいくつかのタプルを、erlang サーバーからフラッシュ クライアントに送信しようとしました。

case get_tcp:send(Socket, Msg) of
ok -> io:format("sent~n");
{erorr, Err} -> io:format("~w~n", [Err])
end

エラーはありませんが、フラッシュ クライアントは約 8 ~ 11 項目のデータ全体を受信しません。ソケットのオプションは [binary, {active, true}, {reuseaddr, true}] です。クライアントを使用しているネットワークを確認しました。送信されたパケットは、大小の 2 つのフラグメントにフラグメント化されていました。大きなものはパケットの最初のフラグメントで、小さなものは次のフラグメントです。ビッグの量は送信されたメッセージの量と同じですが、スモールははるかに少なく、フラッシュ クライアントによって受信されたメッセージの数とほぼ同じです。

データを高速で送信した場合にのみ再現しますが、ゆっくりと送信すると問題ないようです。なぜそれが起こるのか誰か知っていますか?とても役に立ちます。

4

3 に答える 3

1

1 msg(タプル) を送信する前に、term_to_binary(Msg) を使用してバイナリを取得し、次にバイナリのサイズを取得し、クライアントがメッセージを受信した後、binary_to_term を使用してタプルを取得します。2 クライアントとサーバーの両方で、ソケット オプション{パケット、2 または 4} を設定する必要があります。

于 2012-03-21T03:49:59.597 に答える
1

私の推測では、これはフレーミングの問題です。

TCP はストリーミング プロトコルであるため、フラッシュで読み取る場合、すべてのメッセージをすぐに取得できるとは限りません。むしろ、ある種のフレーミング設定、たとえばソケットオプションが{packet, 2}必要です。{packet, 4}これにより、TCP がストリーミング プロトコルからメッセージング プロトコルに効果的に変わります。そして、あなたは後者を望んでいると思います。

于 2012-03-19T14:56:29.623 に答える
0
  1. amf は試していませんが、amf の代わりに erlang+flash と json を使用しています
  2. ソケットのパケットオプションは? (たとえば、{packet, 2} を使用します)
  3. クライアント側でどのようにデータを読みましたか? すべてのデータを最後まで読み取らず、新しいイベントが発生しないのではないでしょうか?
于 2012-03-17T16:39:53.727 に答える