2011-09-21 7 views
2

を続け:フィールドでのアウトJavaのソケット遅延は、私がこのようなソケットの上にASCIIを送信しています

outputStreamWriter(s + (char) 13); 
outputStreamWriter.flush(); 

、そこにフラッシュの間に10〜30秒の遅延(可能)、データがネットワークを介して送信されます(wiresharkを使用して検証済み)。

私はsendUrgentDataを取り除くだけをisConnectedにtrueを返します
public final boolean isConnected() { 
    try { 
    socket.sendUrgentData(32); 
    return true; 
    } catch (IOException e) { 
    return false; 
    } 

()、遅延が消える:

は、ソケット接続をテストするために、私は、これは使用しています。

プロトコルアナライザを使用して、送信しているデータの大部分が、ソケットをテストするために送信する1バイトのように緊急としてマークされることに気付きました。直感的には、遅れてしまう大きな緊急パケットです。

アイデア? ありがとう、 アンドリュー

答えて

0

nagle(Socket.setTcpNoDelay())をオフにすることはできますが、この遅延はOSによって通常最大40〜200ミリ秒です。私は、このようなソケットの上にASCIIを送信しています(原因はここにある疑うフルGCを除く)、マルチ秒の遅延の原因となる何か

+0

申し訳ありませんが、私はsetTcpNoDelay(true)を実行しましたが、遅延はまだあります。 – andrewmara

3

を見たことがありません:

outputStreamWriter(s + (char) 13); 

ありませんあなたはそうではありません。そのコードはコンパイルされません。私はこの

無駄を使用するソケット接続をテストするために

。それはソケット接続をテストしません。ちょうど出力を送信します。これは、ソケット送信バッファ、再試行、タイムアウト、受信側のソケット受信バッファ、および受信ウィンドウという、出力への書き込みと同じ問題が発生します。接続がまだ良いかどうかはわかりません。接続に書き込みをしてIOExceptionをキャッチするだけでなく、切断後の最初の書き込みでは間違いなく起こることはありません。

任意の間隔でスペースを送信することに関するもう1つの問題は、受信者がそれらを理解して無視する必要があることです。それは?

+0

+1:AFAIKは、もう一方の端が自分のデータを受け取っていることを確認する唯一の方法は、もう一方の端が持っていることを示すデータを返すことです。 –

+0

受信機はスペースをうまく処理しますが、私のisConnected()関数もうまく動作します(何らかの理由で遅延が発生する場合を除く)。 – andrewmara

+0

小さなコードの断片については申し訳ありませんが、私は分類されたドメインに属しており、分類されていないコードのみを再入力できます。 – andrewmara

関連する問題