Quiero agregar un Servicio a mi aplicación de Android que se ejecuta en segundo plano con una conexión WebSocket (posiblemente durante varias horas o incluso días) y envía regularmente algunos datos a un servidor.
Ahora parece que hay un montón de bibliotecas WebSocket para Java, y no estoy seguro de cuál debo usar:
TooTallNate / Java-WebSocket Descripción de GitHub: Una implementación de cliente y servidor WebSocket básica escrita en Java al 100%. http://java-websocket.org/ - Este está vinculado en mi primer resultado de googlear "android websocket" . Sin embargo, tiene bastantes problemas abiertos, especialmente sobre las conexiones SSL, y no parece mantenerse activamente en este momento.
koush / AndroidAsync Descripción de GitHub: socket asíncrono, http (cliente + servidor), websocket y biblioteca socket.io para Android. Basado en nio, no hilos. - Nuevamente muchos problemas abiertos, pero parece ser activiley mantenido / trabajado.
Descripción del proyecto Tyrus del sitio web: JSR 356: API de Java para WebSocket - Implementación de referencia - Esto es hecho por Oracle. No estoy seguro si funciona en Android.
Información de la API del cliente Jetty WebSocket del sitio web: Jetty también proporciona una biblioteca del cliente Jetty WebSocket para escribir y facilitar la conversación con los servidores WebSocket. - Nuevamente: no estoy seguro si funciona en Android.
codebutler / android-websockets Descripción de GitHub: Cliente mínimo desnudo de websockets (hybi13 / RFC) para Android: este se usa en schwiz / android-websocket-example , que es la respuesta aceptada para la pregunta StackOverflow " Cómo hacer el ¿El dispositivo Android tiene una conexión TCP a Internet sin bloqueo de activación? ".
Atmosphere / wasync Descripción de GitHub: WebSockets con biblioteca de cliente de transporte de respaldo para Node.js, Android y Java http://async-io.org
TakahikoKawasaki / nv-websocket-client Descripción de GitHub: Implementación de cliente WebSocket de alta calidad en Java.
square / okhttp Descripción de GitHub: un cliente HTTP + SPDY para aplicaciones Android y Java. http://square.github.io/okhttp/ -
Tiene un módulo Websocket .Según lo mencionado por scorpiodawg , OkHttp tiene soporte incorporado de websocket desde la versión 3.5.Descripción de firebase / TubeSock de GitHub: una biblioteca de cliente WebSocket implementada en Java
Autobahn | Android ( GitHub ) Descripción del sitio web: Autobahn | Android es una biblioteca de red de código abierto para Java / Android creada por el proyecto Autobahn que implementa el Protocolo WebSocket y el Protocolo de mensajería de aplicaciones web (WAMP) para crear WebSocket / WAMP móvil nativo clientela. - cloudsurfin señaló que esto no tiene soporte para wss.
Además, hay una biblioteca de cliente socket.io nativa para Android:
- nkzawa / socket.io-client.java Descripción de GitHub: Biblioteca de cliente Socket.IO con todas las funciones para Java, que es compatible con Socket.IO v1.0 y posterior.
Usar el cliente socket.io de Android sería útil para mí, porque de todos modos planeo usar nodejs / socket.io para la interfaz web. Pero el cliente nativo es bastante joven y tiene varios problemas abiertos. Y además de eso, tengo entendido que una aplicación de Android no tiene ningún beneficio de usar la biblioteca del cliente socket.io (además de ser compatible con el servidor socket.io 1.0), porque el soporte de WebSocket puede garantizarse en el lado del cliente .
Mis requisitos son los siguientes:
- Compatibilidad con Android API 9 y superior
- Posibilidad de conectarse a través de SSL
- Mantenga la conexión durante mucho tiempo sin tener que mantener un wakelock permanente
- Compatibilidad con una implementación de servidor websocket nodejs disponible o con socket.io
¿Alguna sugerencia sobre cuál es la biblioteca adecuada para estos requisitos?
Respuestas:
Algunas notas.
koush / AndroidAsync no realiza el apretón de manos de cierre requerido por RFC 6455 . Vea esto para más detalles.
Project Tyrus funciona en Android, pero asegúrese de que su licencia ( CDDL 1.1 y GPL 2 con CPE ) y su tamaño ( Reducción del tamaño de jar del cliente WebSocket con ProGuard ) cumplan con sus requisitos. También tenga en cuenta que Tyrus puede lanzar una excepción cuando el tamaño del texto es grande (probablemente sea un error). Vea esto para más detalles.
Jetty : un hilo de correo electrónico de hace 2 años en la lista de correo de usuarios de embarcaderos dice: "Actualmente no tenemos un cliente JetS 9 WebSocket compatible con Android. Hay planes para intentar hacer una copia de respaldo del cliente Jetty WebSocket de JDK 7 a JDK 5/6 para Android uso, pero es una prioridad menor que terminar nuestra implementación de la API JSR-356 Java WebSocket (javax.websocket) ". El documento actual de Jetty sobre su API de cliente WebSocket no menciona nada sobre Android.
codebutler / android-websocket no realiza el apretón de manos de cierre requerido por RFC 6455 y puede lanzar una excepción al cerrar. Mira esto .
Atmosphere / wasync usa AsyncHttpClient / async-http-client como su implementación de WebSocket. Entonces, más bien, debería mencionarse AsyncHttpClient / async-http-client.
firebase / TubeSock no verifica
Sec-WebSocket-Accept
. Esta es una violación contra RFC 6455 . Además, TubeSock tiene un error al crear un mensaje de texto. Encontrará el error tarde o temprano si utiliza caracteres UTF-8 de varios bytes para mensajes de texto. Consulte el número 3 en delight-im / Android-DDP para obtener una larga lista sobre los problemas de TubeSock.Puntos de consideración
Puntos de consideración al seleccionar una implementación de cliente WebSocket escrita en Java:
SSLSocketFactory
ySSLContext
debe poder utilizarse sin restricciones innecesarias.Socket.connect(SocketAddress endpoint, int timeout)
nv-websocket-client cubre todo lo anterior excepto los dos últimos. Además, una de sus características pequeñas pero convenientes es enviar periódicamente cuadros de ping / pong. Se puede lograr simplemente llamando
setPingInterval
/setPongInterval
métodos (ver JavaDoc ).Descargo de responsabilidad: Takahiko Kawasaki es el autor de nv-websocket-client.
fuente
onDisconnected
método y elonError
método de WebSocketListener .onError
El método te da unaWebSocketException
instancia. Llame a sugetError()
método para ver cuál es el problema.Algunas otras consideraciones:
Tyrus funciona en Android. Sin embargo, las bibliotecas SSL que usa en Android 5.0 tienen errores y fallan los protocolos de enlace SSL . Se supone que esto se arregla en las versiones más recientes de Android, pero con la forma en que Android no se actualiza en muchos dispositivos, esto puede ser un problema para usted.
Dependiendo de cómo se implemente SSL para otras implementaciones de websocket, esto también puede ser un problema.
AndroidAsync no tiene este problema de SSL. Tiene otros problemas, como no poder establecer tiempos de espera .
fuente
a) Agregue este archivo en el archivo gradle
compile 'com.github.nkzawa:socket.io-client:0.3.0'
b) Agregue estas líneas en la Actividad de la aplicación:
c) Agregue esta función a su actividad, donde llamó a WebSocket:
fuente