2012-06-05 14 views
28

Ich habe eine Android-App, die mit einem Programm auf einem PC spricht. Ich verwende die Android (Java) Socket-Klasse. Wenn ich die PC-App stoppe und neu starte, wenn ich das nächste Mal etwas von Android sende, bekomme ich eine IO-Ausnahme "Broken Pipe". Meine Frage ist nicht darüber. Hier ist die Frage:Was genau bedeutet eine "broken pipe" Ausnahme für den Socket?

Nach dem gebrochenen Rohr Ausnahme immer, wenn ich die isClosed der Socket-Abfrage() Methode es false zurückgibt (dh, es ist nicht geschlossen), und wenn ich die isConnected der Socket-Abfrage() Methode kehrt wahr, dh dass es verbunden ist. Könnte mir bitte jemand diese Ergebnisse erklären? Danke im Voraus!

+0

http://StackOverflow.com/a/3751722/776244 –

+0

Samir, dieser Link ist, was eine gebrochene Rohr Ausnahme bedeutet. Das verstehe ich schon; deshalb habe ich gesagt, meine Frage geht nicht darum. Ich möchte die Rückgabewerte verstehen, die ich von den beiden Socket-Methoden erhalte. Ich habe den Titel aktualisiert, um dies zu verdeutlichen. – user316117

Antwort

18

Broken Pipe bedeutet ziemlich genau das, worüber Sie hier reden. Das Programm auf Ihrer Seite hat immer noch seine Steckdose weit geöffnet, aber die Buchse auf der anderen Seite ist nicht mehr in Kommunikation und hat nicht die Standardmethode "Close Pipe" durchlaufen. Dies kann passieren, wenn die andere Seite plötzlich Strom verliert, wenn die physische Leitung unterbrochen wird oder was auch immer. Daher registriert sich der Socket lokal sowohl als offen als auch als verbunden - er ist nur mit einem unterbrochenen Rohr verbunden. Wünschten Sie hier einen praktischen Rat oder nur die Theorie?

+0

Ich wollte die Antwort des Sockets verstehen, um herauszufinden, ob es etwas gibt, das ich vom Socket abfragen kann, um zu wissen, wann ich meinen Kommunikationskanal verloren habe, und das schien mir zwei wahrscheinliche Methoden zu sein. Also bedeutet das, dass, wenn das Rohr bricht, der erste Hinweis, den ich haben werde, im "Fang" -Teil des "Versuch - Fang" -Blocks landet, wenn ich etwas sende? – user316117

+0

ziemlich viel. Der springende Punkt eines kaputten Rohrs ist, dass es nichts ist, was lokal passiert, und Ihr System wurde nicht informiert, dass es passierte, als es passierte. –

+0

Ich habe einen König von ähnlichen Problem, bitte werfen Sie einen Blick auf diesen Beitrag http://stackoverflow.com/questions/34728935/android-local-video-server – chandil03

1

Socket.isClosed() und Socket.isConnected() Ihnen nur sagen, was Sie haben zur Buchse erfolgen. Sie sind nicht da, um Ihnen etwas über den Zustand der Verbindung zu erzählen. Sie haben den Sockel nicht geschlossen: Er ist offen. Du hast den Socket verbunden: Er ist verbunden.

Wenn Sie IOException einen Socket anderen als SocketTimeoutException oder eine Verbindung Timeout erhalten, müssen Sie den Sockel schließen.