2012-04-18 6 views
0

私は1440byteのペイロードを持つTCPパケットをWindows XP OSに非常に高速に送信するデバイスを持っています。 TcpAckFrequencyを0に設定します。つまり、パッケージを受信した直後にACKを送信します。 私はスレッドでソケットを読んでJavaアプリケーションを書いた:私の問題は、それが遅くなりDUP ACKを送信した後、いくつかの(50-60)パケットは、受信した後、WindowsのバッファがいっぱいになるということであるTCP受信ウィンドウサイズは常に完全

in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
in.read(charArray, 0, 720); 

コミュニケーション。

私はいつもバッファを読んでいるので、それがいっぱいになるのはなぜわかりませんか?

答えて

0

可能な説明の1つは、Javaアプリケーションが追いつくことができないということです。つまり、デバイスが送信しているときにデータを高速で処理することはできません。それが問題であれば、アプリケーションがデータをより迅速に処理できるソリューションを考え出す必要があります。

複数のコアを使用している場合は、ソケットからデータを読み取るために1つのスレッドを使用し、処理を実行する別のスレッドを使用するようにJavaアプリケーションをリファクタリングすることにより、より良い結果を得ることができます。

もう1つの解決策は、チューニングの最適化の有効範囲があるかどうかをJavaアプリケーションにプロファイルすることです。

最後に、BufferedReaderのバッファサイズを大きくすることでスループットを向上させることができます。

+0

問題は、私がパケットを受け取った後にグラフを描くことであり、描画プロセスにより、ウィンドウにバッファを割り当て解除するのに十分な時間がないことがありました。今、私は描画関数をスキップし、正常に動作します。 ありがとうございました! – Tomi

関連する問題