2016-04-18 6 views
1

タイムアウトに達したかどうかに基づいて例外をスローする必要があり、次のコード:私はすべての可能なシナリオで試してみたと私は、パケットがさえそれとしてスローされることはありませんことを保証することができますてSocketTimeoutExceptionがスローされていない

public boolean isAlive(int workerNum) throws Exception 
{ 
    System.out.println("Checking worker #" + workerNum + " from " + 
     getWorkerAddress(workerNum) 
     + " at port " + getWorkerPort(workerNum)); 

    DatagramPacket packet = new DatagramPacket("__ping__".getBytes(), "__ping__".length(), 
       getWorkerAddress(workerNum), getWorkerPort(workerNum)); 
    socket.setSoTimeout(10000); 
    try { 
     System.out.println("Checking worker #" + workerNum); 
     socket.send(packet); 
    } catch (SocketTimeoutException e) { 
     e.printStackTrace(); 
     return false; 
    } 
    return true; 
} 

もう一方の側で決して受け取られません。どんな考え?どんな助けでも大歓迎です!

答えて

1

UDPはコネクションレスプロトコルです。 UDPを使用してパケットを送信した場合、パケットが受信されたかどうかはわかりません。受信側では、パケットが欠落していると、これが起こったのかどうかはわかりません。

、これらの状況を判断する唯一の方法は、あなたが注意されていない場合、あなただけのTCPを使用したほうが良いでしょうが、このような状況に対処するためにUDPの上にプロトコルを構築することです。

注:setSoTimeoutは、TCPの読み取りをブロックする際のタイムアウトです。

指定されたタイムアウト(ミリ秒単位)でSO_TIMEOUTを有効/無効にします。このオプションをゼロ以外のタイムアウトに設定すると、このSocketに関連付けられたInputStreamのread()呼び出しは、この時間だけブロックされます。タイムアウトが経過すると、Socketはまだ有効ですが、java.net.SocketTimeoutExceptionが発生します。有効にするには、ブロッキング操作を入力する前にオプションを有効にする必要があります。タイムアウトは> 0でなければなりません。ゼロのタイムアウトは無限のタイムアウトとして解釈されます。

相手側で決して受信されません。どんな考え?

ランダムに受信されない場合、パケットが廃棄されるネットワークに問題があります。ネットワークを改善することで、これを少なくすることができますが、決して遠ざけることはありません。

受信されない場合は、設定に問題があります。トラフィックがそのホストにルーティングされていないか(多くの組織がネットワーク上でUDPをどのように渡すかを制御します)、ファイアウォールによってブロックされているか、ホストとポートが正しく設定されていません。 TCPとは異なり、送信者には何も返ってこないので、エラーメッセージの意味でこれがなぜ起こっているかに関する情報は得られません。

+0

意味があります。ありがとう。 – mjr

+0

実際には、一定時間後にsocket.recieve(パケット)から抜け出す方法がありますか? – mjr

+1

@mjrはい、私は、これはあなたがhttp://stackoverflow.com/questions/10055913/set-timeout-for-socket-receive探しているものだと思います –

1

DatagramSocket.setSoTimeout()タイムアウトに設定します。それは書き方に影響しません。