El zócalo no se desconecta cuando cambia la conectividad
Mi aplicación de chat se conecta a un servidor y la información es enviada / recibida por el usuario. 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 siglos antes de desconectarse. Durante este tiempo, es imposible saber si la conexión sigue activa, parece como si los mensajes se envían muy bien. Otras veces, al enviar un mensaje, lanzará un error de E / S y se desconectará.
Aparte de implementar código para detectar cambios de conexión y reconectarse correctamente, ¿es posible que el socket lance inmediatamente una excepción de E / S cuando cambia la conectividad?
- El botón de retroceso de Android no funciona
- ¿Cómo configuro una imagen de fondo para cada elemento de ListView en Android?
- ¿Cómo pasar la referencia (no serializable) de una actividad a otra?
- Escribir enum con String a paquete
- XPathExpression no evaluatng en el contexto adecuado?
Edit: Estoy conectando usando 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 ya que los datos no pueden ser transferidos por largos períodos de tiempo dependiendo de la configuración del servidor remoto.
- SetMaxDate () no funciona perfectamente en Lollipop 5.0.1 android y necesita una solución adecuada
- Error al descifrar en java
- ¿Cómo asigno un dibujable a ImageView
- Dagger 2 Dependency Injection en Android TestCase
- ArrayList que agrega artículos nulos automáticamente
- Cómo detectar si es el botón Recents, el modo Multi Window o el botón home onUserLeaveHint ()
- La URL no se puede emitir a String
- Cadena que contiene caracteres especiales convertidos a la representación de escape en Android - cómo evitar esto?
¿Estás hablando de una conexión java.net.Socket ? A continuación, intente setSoTimeout () . De lo contrario, especifique cómo se está conectando.
Este es un viejo problema que he visto algunas veces antes en el mundo de la base de datos.
La solución que usé allí era administrar la conexión en el nivel de la aplicación. Yo explícitamente enviar un mensaje de no-op de algún tipo (es decir, SELECT 1 WHERE FALSE
) a través de la conexión de vez en cuando como un ping, y si esto falla yo derribar y restablecer la conexión, posiblemente a un servidor de conmutación por error Si el original no estaba aceptando conexiones.
Como las respuestas anteriores ya señalaron, este es un problema común. Incluso después de enviar un "ping" personalizado, puede que necesite algo de tiempo hasta que el socket comprenda que la conexión subyacente está rota. Además, pings regulares son muy exigentes de energía utilizando 3-4G redes móviles, debido a sus estados de cola. ¡No hagas eso!
Sin embargo, lo que puede hacer es solicitar información cuando cambie la conectividad (última sección) y cerrar / volver a conectar el socket manualmente en el receptor de emisión correspondiente. (EDIT: Ya veo que ya se enteró de esto, sólo mantener aquí para completar)
- ¿Cómo liberar el recurso de micrófono cuando otra aplicación de Android lo necesita?
- ¿Por qué se recomienda llamar a MultiDex.install () en attachBaseContext (Context)?