2010-01-05 20 views
7

Mi aplicación de chat se conecta a un servidor y el usuario envía o recibe información. Cuando la conexión cambia, como 3g-> wifi, wifi-> 3g, la pérdida de una conexión de datos, etc., el socket a veces permanece conectado durante años antes de desconectarse. Durante este tiempo, es imposible saber si la conexión aún está activa, parece que los mensajes se envían correctamente. Otras veces, al enviar un mensaje, lanzará un error de IO y se desconectará.El zócalo no se desconecta cuando cambia la conectividad

Además de implementar código para detectar cambios de conexión y volver a conectarlos de manera apropiada, ¿es posible que el socket arroje inmediatamente una excepción de IO cuando cambia la conectividad?

Editar: Estoy conectando con el siguiente código:

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

no estoy usando setSoTimeout como datos no pueden ser transferidos durante largos períodos de tiempo dependiendo de la configuración del servidor remoto.

+0

Luego vea http://stackoverflow.com/questions/969866/java-detect-lost-connection http://stackoverflow.com/questions/155243/why-is-it-impossible-without-trying-io-to-detect-that-tcp-socket-was-grace –

Respuesta

0

Este es un viejo problema que he visto algunas veces en el mundo de la base de datos.

La solución que utilicé allí fue para administrar la conexión en el nivel de la aplicación. Enviaría explícitamente un mensaje no operativo de algún tipo (es decir, SELECT 1 WHERE FALSE) sobre la conexión cada cierto tiempo como un ping, y si esto falla, demoraría y restablecería la conexión, posiblemente a un servidor de conmutación por error si el original no estaba aceptando conexiones.

0

Como ya se señaló en las respuestas anteriores, este es un problema común. Incluso después de enviar un "ping" personalizado, puede necesitar algún tiempo hasta que el socket se da cuenta de que la conexión subyacente está rota. Además, pings regulares son bastante exigentes de energía utilizando redes móviles 3-4G, debido a sus estados de cola. ¡No hagas eso!

Lo que puede hacer, sin embargo, es requesting to get informed when the connectivity changes (last section), y cierre/vuelva a conectar el zócalo manualmente en el receptor de difusión correspondiente. (EDITAR: veo que ya se enteró de esto, simplemente manteniéndolo aquí para que esté completo)

Cuestiones relacionadas