Tiempo de espera del cliente websocket android

¡Gracias por leer!

Antecedentes: Estoy desarrollando un cliente Android para un servidor donde el requisito es una aplicación que requiere el intercambio continuo de mensajes de ida y vuelta con un servidor basado en WebSockets .

Implementación: Para el cliente, utilizo la biblioteca cliente de WebSocket de weberknecht para Android mientras el servidor está basado en Tornado .

Problema: Por el momento, invoco initWebSocketClient en onCreate generando una AsyncTask . Pero, sigo recibiendo una excepción de tiempo de espera del cliente.

Cliente Android:

 private void initWebSocketClient() { Log.e(TAG, "initWebSocketClient"); try { URI url = new URI("ws://192.168.207.84:8080/"); WebSocket websocket = new WebSocketConnection(url); // Register Event Handlers websocket.setEventHandler(new WebSocketEventHandler() { public void onOpen() { Log.e(TAG, "--open"); } public void onMessage(WebSocketMessage message) { Log.e(TAG, "--received message: " + message.getText()); } public void onClose() { Log.e(TAG, "--close"); } }); // Establish WebSocket Connection websocket.connect(); // Send UTF-8 Text websocket.send("hello world"); // Close WebSocket Connection websocket.close(); } catch (WebSocketException wse) { wse.printStackTrace(); } catch (URISyntaxException use) { use.printStackTrace(); } } 

Tornado Server:

 #!/usr/bin/env python import tornado.ioloop import tornado.web import tornado.websocket class EchoWebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): print "WebSocket opened" def on_message(self, message): self.write_message(u"You said: " + message) def on_close(self): print "WebSocket closed" application = tornado.web.Application([ (r"/", EchoWebSocketHandler), ]) if __name__ == "__main__": application.listen(8080) tornado.ioloop.IOLoop.instance().start() 

Excepción de tiempo de espera del cliente:

 01-31 19:28:01.367: W/System.err(5668): de.roderick.weberknecht.WebSocketException: error while creating socket to ws://192.168.207.84:8080/ 01-31 19:28:01.386: W/System.err(5668): at de.roderick.weberknecht.WebSocketConnection.createSocket(WebSocketConnection.java:244) 01-31 19:28:01.386: W/System.err(5668): at de.roderick.weberknecht.WebSocketConnection.connect(WebSocketConnection.java:83) 01-31 19:28:01.386: W/System.err(5668): at com.sagar.websockclient.MainActivity.initWebSocketClient(MainActivity.java:55) 01-31 19:28:01.390: W/System.err(5668): at com.sagar.websockclient.MainActivity.access$0(MainActivity.java:30) 01-31 19:28:01.390: W/System.err(5668): at com.sagar.websockclient.MainActivity$WebSocketTask.doInBackground(MainActivity.java:75) 01-31 19:28:01.390: W/System.err(5668): at com.sagar.websockclient.MainActivity$WebSocketTask.doInBackground(MainActivity.java:1) 01-31 19:28:01.390: W/System.err(5668): at android.os.AsyncTask$2.call(AsyncTask.java:264) 01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 01-31 19:28:01.390: W/System.err(5668): at java.lang.Thread.run(Thread.java:856) 01-31 19:28:01.390: W/System.err(5668): Caused by: java.net.ConnectException: failed to connect to /192.168.207.84 (port 8080): connect failed: ETIMEDOUT (Connection timed out) 01-31 19:28:01.390: W/System.err(5668): at libcore.io.IoBridge.connect(IoBridge.java:114) 01-31 19:28:01.394: W/System.err(5668): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 01-31 19:28:01.394: W/System.err(5668): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.startupSocket(Socket.java:566) 01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.tryAllAddresses(Socket.java:127) 01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.(Socket.java:177) 01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.(Socket.java:149) 01-31 19:28:01.394: W/System.err(5668): at de.roderick.weberknecht.WebSocketConnection.createSocket(WebSocketConnection.java:238) 01-31 19:28:01.394: W/System.err(5668): ... 11 more 01-31 19:28:01.394: W/System.err(5668): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out) 01-31 19:28:01.398: W/System.err(5668): at libcore.io.Posix.connect(Native Method) 01-31 19:28:01.398: W/System.err(5668): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 01-31 19:28:01.398: W/System.err(5668): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 01-31 19:28:01.398: W/System.err(5668): at libcore.io.IoBridge.connect(IoBridge.java:112) 01-31 19:28:01.398: W/System.err(5668): ... 18 more 

¿Podría alguien ayudarme por favor aquí?

Actualización: Agregar detalles de la implementación de AutoBahn (biblioteca cliente de WebSocket para Android):

Cliente AutoBahn

 private void connect2() { mConnection = new WebSocketConnection(); final String wsuri = "ws://192.168.0.137:8888/"; String TAG = "ArticlesListActivity"; try { mConnection.connect(wsuri, new WebSocketHandler() { @Override public void onOpen() { Log.e(TAG, "Connected to: " + wsuri); } @Override public void onTextMessage(String payload) { Log.e(TAG, "Message recieved = " + payload); } @Override public void onClose(int code, String reason) { Log.e(TAG, "Connection Lost."); } }); } catch (WebSocketException e) { Log.d(TAG, e.toString()); } } 

Con esta biblioteca – puedo conectarme al servidor pero al instante, la conexión se pierde. (Consulte el "AutoBahn Client Log" a continuación.Cambiar de nuevo a weberknecht funciona muy bien.No estoy llamando explícitamente mConnection.disconnect() cualquier mConnection.disconnect() que no sé cómo se termina la conexión.

Registro del cliente de AutoBahn

 02-27 14:27:36.605: D/de.tavendo.autobahn.WebSocketConnection(27701): created 02-27 14:27:36.656: D/dalvikvm(27701): GC_FOR_ALLOC freed 164K, 4% free 9247K/9543K, paused 17ms 02-27 14:27:36.671: D/dalvikvm(27701): GC_FOR_ALLOC freed 7K, 4% free 9368K/9735K, paused 14ms 02-27 14:27:36.671: D/de.tavendo.autobahn.WebSocketReader(27701): created 02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketConnection(27701): WS reader created and started 02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketReader(27701): running 02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketWriter(27701): created 02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketConnection(27701): WS writer created and started 02-27 14:27:36.769: D/de.tavendo.autobahn.WebSocketReader(27701): run() : ConnectionLost 02-27 14:27:36.773: D/de.tavendo.autobahn.WebSocketReader(27701): ended 02-27 14:27:36.777: D/de.tavendo.autobahn.WebSocketConnection(27701): opening handshake received 02-27 14:27:36.777: E/ArticlesListActivity(27701): Connected to: ws://192.168.0.137:8888/ 02-27 14:27:36.781: D/de.tavendo.autobahn.WebSocketConnection(27701): fail connection [code = 3, reason = WebSockets connection lost 02-27 14:27:36.784: D/de.tavendo.autobahn.WebSocketReader(27701): quit 02-27 14:27:36.788: D/de.tavendo.autobahn.WebSocketWriter(27701): ended 02-27 14:27:36.792: E/ArticlesListActivity(27701): Connection Lost. 02-27 14:27:36.792: D/de.tavendo.autobahn.WebSocketConnection(27701): worker threads stopped 

Así es como empezaría a solucionar este problema:

  1. ¿Está intentando hacer esto en su teléfono (dispositivo) o en el emulador? Si está intentando hacer esto en su teléfono y está conectado a través de 3G, no va a suceder. En este escenario, intenta conectarse a una dirección IP interna de la WAN que no funciona.

  2. Una vez más asumiendo que estás haciendo esto en un dispositivo, si estás conectado a través de Wifi, entonces es otra historia. Asegúrese de que el servidor se puede llegar a 192.168.207.84:8080 . Una forma rápida de probar la conectividad (desde su PC):

     telnet 192.168.207.84 8080 

    Si se agota, usted sabe que su servidor no responde. Por supuesto, esto supone que su PC está en la misma subred que su red Wifi.

  3. Si intenta hacer esto desde su emulador, siga los pasos de [2] para asegurarse de que el servidor esté accesible y también asegúrese de que su emulador esté en modo puenteado (IP).

En resumen, la razón principal de los tiempos de espera suele ocurrir debido a la falta de disponibilidad del servidor (es decir, falta de conectividad). Usted no mencionó los detalles de su red así que hice algunos supuestos aquí basados ​​en la IP que usted intentaba conectar con (192.168.207.84).

Por lo que puedo ver, Weberknecht sólo soporta Hybi-10, no la especificación final RFC6455, y más problemático, es la creación de redes en el hilo principal (UI). Eso es generalmente una mala idea, y fallará en Android> 2.

Para las aplicaciones nativas de Android, hay Autobahn WebSockets para Android

https://github.com/oberstet/AutobahnAndroid

Soporta la RFC6455 final, se integra bien con la interfaz de usuario y aplicaciones de servicio, proporciona RPC y PubSub sobre WebSockets, y más. Echa un vistazo al README del proyecto en GitHub.

Descargo de responsabilidad: Soy el autor de Autobahn.

  • Spring pedalea cliente web sockets para android
  • WebSockets para Android y aplicaciones de iOS
  • Emitir mensajes socket.io en Android
  • Web Sockets en el navegador Samsung Galaxy S3 Android?
  • Biblioteca WebSocket para Android, iOS y Flash
  • WebSockets para Android en la aplicación Phonegap con Node.js / Socket.IO server & client
  • ¿Alguien ha escrito una librería de Android para Pusher?
  • Enviar flujo de audio de Android (cliente) a C # (servidor) mediante Websocket
  • ¿Es la mejor práctica para las conexiones móviles persistentes en Android?
  • Conexión de cliente a servidor en aplicaciones de chat como Viber o Telegram
  • Error de conexión de Web Socket desde el cliente Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.