2016-04-18 3 views
1
geworfen

Der folgende Code sollte eine Ausnahme basierend auf werfen, ob ein Timeout erreicht wurde:SocketTimeoutException nicht

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; 
} 

Ich habe in jedem möglichen Szenario versucht, und ich kann garantieren, dass das Paket nicht einmal, wie es ausgelöst wird, wird nie auf der anderen Seite empfangen. Irgendeine Idee warum? Jede Hilfe wird sehr geschätzt!

Antwort

1

UDP ist ein verbindungsloses Protokoll. Wenn Sie ein Paket mit UDP senden, haben Sie keine Ahnung, ob das Paket empfangen wurde oder nicht. Auf der Empfängerseite wird es, wenn es ein Paket verpasst, keine Ahnung haben, dass dies passiert ist.

Der einzige Weg, um diese Situationen zu bestimmen, ist ein Protokoll auf UDP zu bauen, diese Situationen zu handhaben, aber wenn Sie nicht vorsichtig sind, werden Sie nur besser sein TCP.

Hinweis: setSoTimeout ist ein Timeout auf Blockierung für TCP liest.

Aktivieren/Deaktivieren von SO_TIMEOUT mit dem angegebenen Timeout in Millisekunden. Wenn diese Option auf ein Zeitlimit ungleich Null gesetzt ist, wird ein Aufruf von read() auf dem InputStream, der diesem Socket zugeordnet ist, nur für diesen Zeitraum blockiert. Wenn das Zeitlimit abläuft, wird eine java.net.SocketTimeoutException ausgelöst, obwohl der Socket noch gültig ist. Die Option muss aktiviert sein, bevor der Sperrvorgang wirksam werden kann. Das Timeout muss> 0 sein. Ein Timeout von Null wird als unendliches Timeout interpretiert.

es wird nie auf der anderen Seite empfangen. Irgendeine Idee warum?

Wenn es nicht zufällig empfangen wird, liegt ein Netzwerkproblem vor, bei dem das Paket gelöscht wird. Sie können dies durch Verbesserung Ihres Netzwerks seltener erreichen, aber es wird niemals verschwinden.

Wenn es nie empfangen wird, dann haben Sie ein Konfigurationsproblem. Entweder wird der Datenverkehr nicht an diesen Host weitergeleitet (viele Organisationen steuern, wie UDP in ihrem Netzwerk weitergeleitet wird) oder sie werden von einer Firewall blockiert oder der Host und der Port sind falsch konfiguriert. Im Gegensatz zu TCP erhalten Sie keine Informationen darüber, warum dies im Hinblick auf eine Fehlermeldung geschieht, da nichts zum Absender zurückkommt.

+0

Sinn macht. Vielen Dank. – mjr

+0

Gibt es tatsächlich eine Möglichkeit, sich von einem Socket zu lösen? (Paket) in UDP nach einer bestimmten Zeit zu akzeptieren? – mjr

+1

@mjr ja, ich denke, das ist, was Sie suchen http://stackoverflow.com/questions/10055913/set-timeout-for-socket-receive –

1

DatagramSocket.setSoTimeout() setzt lesen Timeout. Es hat keine Auswirkung auf das Schreiben.