2010-01-05 1 views
7

La mia applicazione di chat si collega a un server e le informazioni vengono inviate/ricevute dall'utente. Quando la connessione cambia, ad esempio 3g-> wifi, wifi-> 3g, perdendo una connessione dati, ecc., Lo socket rimane collegato per periodi di tempo prima della disconnessione. Durante questo periodo, è impossibile stabilire se la connessione è ancora attiva, sembra che i messaggi vengano inviati correttamente. Altre volte, quando si invia un messaggio, si genera un errore IO e si disconnette.La presa non si interrompe quando la connettività cambia

Oltre esecuzione codice per rilevare cambiamenti di connessione e ricollegare appropriato, è possibile avere la presa immediatamente un'eccezione IO quando cambia la connettività?

Edit: sto collegamento utilizzando il codice seguente:

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

non utilizzo setSoTimeout come dati non possono essere trasferiti per lunghi periodi di tempo a seconda della configurazione del server remoto.

+0

Poi vedere http://stackoverflow.com/questions/969866/java-detect-lost-connection http://stackoverflow.com/domande/155243/why-è-da-impossibile-senza-tentare-io da rilevare-che-tcp-socket-era-grace –

risposta

0

Questo è un vecchio problema che ho visto un paio di volte prima che nel mondo dei database.

La soluzione che ho usato quello che c'era da gestire la connessione a livello di applicazione. Mi piacerebbe invii un messaggio no-op di qualche tipo (cioè SELECT 1 WHERE FALSE) tramite la connessione di tanto in tanto come un rumore metallico, e se questo non è riuscito avrei abbattere e ristabilire il collegamento, possibilmente a un server di failover se l'originale non stava accettando connessioni.

0

Come già sottolineato in precedenza, questo è un problema comune. Anche dopo aver inviato un "ping" personalizzato potrebbe essere necessario un po 'di tempo prima che il socket si accorga che la connessione sottostante è rotta. Inoltre, ping regolari sono abbastanza utilizzando 3-4g reti mobili, chiedendo di energia a causa della loro stati di coda. Non farlo!

Ciò che è possibile fare, tuttavia, è requesting to get informed when the connectivity changes (last section) e chiudere/riconnettere manualmente il socket nel ricevitore broadcast corrispondente. (EDIT: Vedo che già scoperto su questo, basta tenerlo qui per completezza)