2010-01-05 19 views
7

Meine Chat-Anwendung verbindet sich mit einem Server und Informationen werden vom Benutzer gesendet/empfangen. Wenn die Verbindung ändert, wie 3g-> wifi, wifi-> 3g, eine Datenverbindung zu verlieren, usw., bleibt die socket manchmal für lange vor dem Trennen verbunden. Während dieser Zeit ist es unmöglich zu sagen, ob die Verbindung noch aktiv ist, es scheint, als ob Nachrichten gerade gesendet werden. Zu anderen Zeiten wird beim Senden einer Nachricht ein IO-Fehler ausgelöst und die Verbindung getrennt.Socket wird nicht getrennt, wenn sich die Konnektivität ändert

Neben dem Implementieren von Code zum Erkennen von Verbindungsänderungen und erneutem Verbinden ist es möglich, dass der Socket sofort eine IO-Ausnahme auslöst, wenn sich die Konnektivität ändert?

Edit: Ich verbinde mit dem folgenden Code:

Socket sock = new Socket(); 
sock.connect(new InetSocketAddress(getAddress(), getPort())), getTimeout()); 
//get bufferedReader and read until BufferedReader#readLine() returns null 

Ich verwende setSoTimeout nicht als Daten nicht für längere Zeit auf dem Remote-Server-Konfiguration abhängig übertragen werden können.

+0

Dann siehe http://stackoverflow.com/questions/969866/java-detect-lost-connection http://stackoverflow.com/questions/155243/why-is-it-implove-ohne-versuchen-io-to-detect-das-tcp-socket-was-grace –

Antwort

1

Sprechen Sie über eine java.net.Socket Verbindung? Dann versuchen Sie setSoTimeout(). Andernfalls geben Sie an, wie Sie eine Verbindung herstellen.

0

Dies ist ein altes Problem, das ich ein paar Mal zuvor in der Datenbank-Welt gesehen habe.

Die Lösung, die ich dort verwendete, war, die Verbindung auf Anwendungsebene zu verwalten. Ich würde explizit eine No-Op-Nachricht irgendeiner Art (dh SELECT 1 WHERE FALSE) über die Verbindung hin und wieder als ein Ping senden, und wenn dies fehlschlug, würde ich die Verbindung abbrechen und wiederherstellen, möglicherweise zu einem Failover-Server, wenn das Original akzeptierte keine Verbindungen.

0

Wie bereits in früheren Antworten erwähnt, ist dies ein häufiges Problem. Auch nach dem Senden eines benutzerdefinierten "Ping" kann es einige Zeit dauern, bis der Socket erkennt, dass die zugrunde liegende Verbindung unterbrochen ist. Plus, regelmäßige Pings sind ziemlich energieintensiv mit 3-4G Mobilfunknetze, aufgrund ihrer Schwanz Staaten. Tu das nicht!

Was Sie jedoch tun können, ist requesting to get informed when the connectivity changes (last section), und schließen/erneut die Buchse manuell in den entsprechenden Broadcast-Empfänger. (BEARBEITEN: Ich sehe, dass Sie schon davon erfahren haben; halten Sie es hier für die Vollständigkeit)

Verwandte Themen