2016-06-03 26 views
1

Die Antwort, here, von Stephen C beschreibt sehr gut das Problem. Er sagt, dass die Ausnahme für unterbrochene Pipes von etwas verursacht wird, das die Verbindung zum Schließen verursacht, und es ist nicht die Anwendung. Ich möchte wissen, was all dieses "Etwas" im Allgemeinen sein könnte, was die Verbindung zum Schließen bringt? Und welche Möglichkeiten gibt es, damit umzugehen?Java NIO SocketChannel IOException: Gebrochenes Rohr

Meine Nutzungsumgebung: Ich verwende meine Anwendung auf einer Reihe von Maschinen auf Azure, und alle von ihnen sprechen mit einem der Maschine. Ich bekomme diesen Fehler fast immer.

Könnte TCP-Timeout einer der Gründe sein? Wenn ja, dann wie Socket Channels (in Affekt Socket hinter ihnen ausgeführt) nie zu TCP-Timeout zu schließen?

Antwort

1

Sie können den mit SocketChannel verknüpften Socket abrufen und dann die Eigenschaft keepAlive festlegen. Etwas wie das.

SocketChannel sockChannel; 
/* 
connect here 
*/  
sockChannel.socket().setKeepAlive(true); 
1

Die Ausnahme für defekte Pipes kommt immer dann, wenn sich der Client von dem Socket entfernt, auf dem er gehört. Dies liegt möglicherweise daran, dass das Socket-Timeout auf der Clientseite erreicht wurde, da der Server langsam reagierte. Nehmen wir an, im Fall eines Browsers, wenn eine HTTP-Anfrage lange dauert und der Benutzer den Browser schließt, wird in den Anwendungsprotokollen eine Ausnahme für unterbrochene Pipes angezeigt.

Jetzt, um dies zu beheben, erhöhen Sie entweder Socket-Timeout oder beheben Sie die Serverantwort.

+0

Dank @VineetKasat Wie kann ich das Socket-Timeout erhöhen? Ich habe versucht, in [java doc] [1] zu suchen, konnte aber nichts passendes finden. [1] https://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html – PHcoDer

+0

Wie kommunizieren Sie auf mehreren Rechnern? In Java ist es nur eine einfache Eigenschaft, die geändert werden muss. –

+0

Danke @Vineet. Ich verwende SocketChannels und Lese-Schreib-Operation auf diesen Kanälen. Welche Eigenschaft ist das? Sprechen Sie über SetSoTimeout() (die für normale Sockets verwendet wird?) – PHcoDer