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
.
- WebSocket HTML5 en el teléfono para Android
- Grails 2.4 Spring Websocket SockJs Java Android Cliente
- Android con comunicación websocket (servidor Node Websocket y Android Java Client). No funciona en Android 4
- NodeJS + SocketIO empuja a la aplicación para móviles
- Biblioteca de Android para WSS (Secure Web Socket)
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
- Error de Firebase debido a una excepción de puntero nulo
- Método para enviar httpheaders desde android autobahn websocketconnection
- Java (Android) WebSocket Client Libraries
- Android websocket sockjs cliente para java primavera basada webserver
- Angularjs Phonegap Android usando Websockets
- La mejor manera de evitar los efectos del algoritmo Nagle usando webSockets?
- Servicios WebSocket de Android que realizan varias conexiones
- Detección de servicio en red local mediante WebSockets
Así es como empezaría a solucionar este problema:
-
¿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.
-
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.
-
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.
- Abrir el cuadro de diálogo de archivo en Android?
- Cheque del radiobutton del androide después de despejar el problema del cheque