Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Qué biblioteca WebSocket utilizar en la aplicación para Android?

Quiero agregar un servicio a mi aplicación para 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 de WebSocket para Java, y no estoy seguro de cuál debo usar:

  • Descripción de TooTallNate / Java-WebSocket desde GitHub: Un cliente WebSocket barebones y una implementación de servidor escrita en Java 100%. Http://java-websocket.org/ – Este es un enlace en mi primer resultado de google "android websocket" . Sin embargo, tiene bastantes problemas abiertos, especialmente sobre conexiones SSL, y no parece que se mantenga activamente en este momento.

  • Koush / AndroidAsync Descripción de GitHub: Socket asíncrono, http (cliente + servidor), websocket, y la biblioteca socket.io para android. Basado en nio, no en hilos. – Nuevamente muchas cuestiones abiertas, pero parece ser activiley mantenido / trabajado.

  • Proyecto Tyrus Descripción del sitio web: JSR 356: Java API para WebSocket – Implementación de Referencia – Esto es hecho por Oracle. No estoy seguro si funciona en Android.

  • Jetty WebSocket Client API Información desde el sitio web: Jetty también proporciona una biblioteca de clientes Jetty WebSocket para escribir, facilita la conversación con los servidores WebSocket. – Nuevamente: No estoy seguro si funciona en Android.

  • Codebutler / android-websockets Descripción de GitHub: Bare websockets mínimo (hybi13 / RFC) cliente para Android – Este se utiliza en schwiz / android-websocket-ejemplo , que es la respuesta aceptada para el StackOverflow-pregunta " Cómo hacer el Dispositivo Android mantener una conexión TCP a Internet sin bloqueo de la sesión? ".

  • Atmosphere / wasync Descripción de GitHub: WebSockets con la biblioteca de cliente de transportes de fallback 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 . Como se mencionó por scorpiodawg , OkHttp ha incorporado soporte websocket desde la versión 3.5.

  • Firebase / TubeSock Descripción de GitHub: Una biblioteca cliente de WebSocket implementada en Java

  • Android es una biblioteca de redes 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 la creación de WebSocket / WAMP nativo en la Web ( GitHub ) clientela. – cloudsurfin señaló que esto no tiene soporte para wss.

Además, hay una librería nativa de socket.io 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 versiones posteriores.

Para usar el cliente Android de socket.io sería útil para mí, porque planeo usar nodejs / socket.io para el frontend web de todos modos. Pero el cliente nativo es bastante joven y tiene varios problemas abiertos. Y además de eso, entiendo que una aplicación para Android no tiene ningún beneficio de usar la librería de cliente socket.io (aparte de ser compatible con el servidor socket.io 1.0), porque la compatibilidad con WebSocket puede estar asegurada en el lado del cliente .

Mis requisitos son los siguientes:

  • Compatibilidad con Android API 9 y superior
  • Posibilidad de conexión vía SSL
  • Mantenga la conexión durante mucho tiempo sin tener que mantener un wakelock permanente
  • Compatibilidad con una implementación de servidor websocket de nodejs disponible o con socket.io

¿Alguna sugerencia de cuál es la biblioteca adecuada para estos requisitos?

2 Solutions collect form web for “¿Qué biblioteca WebSocket utilizar en la aplicación para Android?”

Algunas notas.

  • Koush / AndroidAsync no realiza el apretón de manos de cierre que es requerido por RFC 6455 . Vea esto para más detalles.

  • El proyecto Tyrus funciona en Android, pero asegúrese de que su licencia ( CDDL 1.1 y GPL 2 con CPE ) y su tamaño ( reduciendo el tamaño del frasco cliente de WebSocket con ProGuard ) satisfagan sus necesidades. También tenga en cuenta que Tyrus puede lanzar una excepción cuando un tamaño de texto es grande (es probablemente un error). Vea esto para más detalles.

  • Jetty : Un hilo de correo electrónico hace 2 años en la lista de correo de jetty-users dice: "Actualmente no tenemos un cliente Jetty 9 WebSocket compatible con Android. Hay planes para intentar backport el Jetty WebSocket Client de JDK 7 a JDK 5/6 para android , Pero es una prioridad menor que terminar nuestra implementación de JSR-356 Java WebSocket API (javax.websocket) ". El documento actual de Jetty sobre su WebSocket Client API no menciona nada sobre Android.

  • Codebutler / android-websocket no realiza el apretón de manos de cierre que es requerido por RFC 6455 y puede lanzar una excepción al cerrar. Vea esto .

  • Atmosphere / wasync utiliza AsyncHttpClient / async-http-client como su implementación de WebSocket. AsyncHttpClient / async-http-client debe ser mencionado en su lugar.

  • Firebase / TubeSock no verifica Sec-WebSocket-Accept . Esto es una violación contra RFC 6455 . Además, TubeSock tiene un error en la construcción de un mensaje de texto. Usted encontrará el error tarde o temprano si utiliza caracteres UTF-8 de varios bytes para mensajes de texto. Vea el número 3 en delight-im / Android-DDP para 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:

  1. Cumplimiento . No un pequeño número de implementaciones no implementan el apretón de manos de cierre requerido por RFC 6455 . (¿Qué sucede si el apretón de manos de cierre no está implementado?).
  2. Versión Java requerida . Java SE 5, 6, 7, 8 o Java EE? ¿Funciona incluso en Android?
  3. Tamaño . Algunas implementaciones tienen muchas dependencias.
  4. Wss apoyo.
  5. Soporte de proxy HTTP .
  6. Wss a través de soporte de proxy HTTP . Consulte la Figura 2 en cómo interactúan los sockets Web HTML5 con servidores proxy acerca de lo que debe tener una biblioteca cliente WebSocket para admitir wss a través del proxy HTTP.
  7. Flexibilidad en la configuración SSL . SSLSocketFactory y SSLContext deben poder utilizarse sin restricciones innecesarias.
  8. Cabeceras HTTP personalizadas en el apretón de manos de apertura , incluida la Autenticación básica.
  9. Cabeceras HTTP personalizadas en la negociación de proxy HTTP , incluida la autenticación en el servidor proxy.
  10. Capaz de enviar todos los tipos de tramas (continuación, binario, texto, cierre, ping y pong) o no. La mayoría de las implementaciones no proporcionan a los desarrolladores medios para enviar cuadros fragmentados y fotogramas no solicitados manualmente.
  11. Interfaz de escucha para recibir varios eventos de WebSocket. Una interfaz deficiente hace que los desarrolladores se sientan frustrados. Una interfaz rica ayuda a los desarrolladores a escribir aplicaciones robustas.
  12. Capaz de consultar el estado de WebSocket o no. El RFC 6455 define los estados CONNECTING, OPEN, CLOSING y CLOSED, pero pocas implementaciones mantienen su transición de estado interna de la manera definida.
  13. Capaz de establecer un valor de tiempo de espera para la conexión de socket . (Equivalente al segundo argumento del método Socket. connect (SocketAddress endpoint, int timeout) )
  14. Capaz de acceder al socket subyacente .
  15. API intuitiva fácil de usar o no.
  16. Bien documentado o no.
  17. RFC 7692 (extensiones de compresión para WebSocket) apoyo (aka permessage-deflate).
  18. Redirección (3xx).
  19. Soporte de Autenticación Digest .

Nv-websocket-client cubre todo lo anterior excepto los dos últimos. Además, una de sus características pequeñas pero convenientes es enviar cuadros de ping / pong periódicamente. Puede lograrse simplemente llamando a los métodos setPingInterval / setPongInterval (Ver JavaDoc ).

Descargo de responsabilidad: Takahiko Kawasaki es el autor de nv-websocket-cliente.

Algunas otras consideraciones:

Tyrus trabaja en Android. Sin embargo, las bibliotecas SSL que utiliza en Android 5.0 son buggy y fallan los apretones de manos SSL . Esto se supone que se fijará 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 .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.