2

奇妙な動作が発生しています:

iPhoneデバイスから送信されるTCPリクエストを処理するJava ServerSocketに基づくサーバーがあります。iPhone を Wi-Fi 経由で接続して使用すると、ネットワークに問題がないことに気付きました。iphone は接続を開き、ストリームからの書き込みと読み取りを行う必要があり、顕著な遅延はありません。ここまでは順調ですね。ただし、3g を使用すると、最初のメッセージが送信されてから応答が完全に返されるまでに 1.5 秒の遅延が発生します。サーバーがメッセージをソケットにフラッシュした直後に、メッセージの最初のバイトが読み取られるようですが、残りのメッセージは約 1 秒間 (!) 遅延しています。

このネットワークの動作は、iPhone 側に到着するバッファ サイズを出力することと、サーバー側で Wireshark を使用してネットワークを監視することの両方で確認しました。 Wireshark もこれを示しています。最初のバイトは 1 バイトのメッセージ サイズ (常に 0 BTW) で送信され、残りのメッセージはその後、1 つまたは複数の大きなメッセージ (~1300 バイト) で送信されます。

メッセージは、8 バイトのヘッダー (2 つの整数 - タイプとサイズ) と、そのサイズの本文で構成されます。

本当に奇妙なことは、c ++で同じプロトコルを使用する同様のサーバーを(pocoサーバーを使用して)作成すると、完全に機能することです。

ソケットの DataOutputStream を使用して、2 つの writeInt 命令と本体を書き込む write(byte[]) を使用してヘッダーを書き込みます。次に、ストリームをフラッシュします。

この種の動作を引き起こす可能性のあるソケットオプション(Java)があるかどうかは誰にもわかりませんか?

どんな助けでも大歓迎です。

4

2 に答える 2

1

ソケット出力ストリームを BufferedOutputStream でラップすることで、この問題を解決しました。

DataOutputStream dos = new DataOutputStream(new BufferedOutputstream(sock.getOutputStrean()));

ありがとう、リオール

于 2011-05-20T23:03:38.733 に答える
0

サーバーの Wireshark トレースを投稿することをお勧めします。これにより、構成されている TCP ソケット オプションと、ハンドシェイクから最初のデータ転送までのタイムラインに関する洞察が得られる可能性があります。

于 2011-05-16T16:36:58.513 に答える