read - ¿Qué biblioteca de WebSocket usar en la aplicación de Android?
socket io kotlin (3)
Algunas notas.
-
koush / AndroidAsync no realiza el apretón de manos de cierre requerido por RFC 6455 . Vea this 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 this para más detalles.
-
Jetty : un hilo de correo electrónico de hace 2 años en la lista de correo de usuarios de embarcadero dice "Actualmente no tenemos un cliente de JetS 9 WebSocket compatible con Android. Hay planes para intentar hacer una copia de respaldo del cliente de 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 document 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 this .
-
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:
- Cumplimiento No pocas implementaciones no implementan el apretón de manos de cierre requerido por RFC 6455 . (¿Qué sucede si no se implementa el apretón de manos de cierre? Vea this ).
- Se requiere la versión de Java . Java SE 5, 6, 7, 8 o Java EE? Funciona incluso en Android?
- Tamaño . Algunas implementaciones tienen muchas dependencias.
- soporte de wss .
- Soporte de proxy HTTP .
- wss sobre soporte de proxy HTTP . Consulte la Figura 2 en Cómo interactúan los sockets web HTML5 con los servidores proxy acerca de lo que debe hacer una biblioteca cliente WebSocket para admitir wss a través del proxy HTTP.
-
Flexibilidad en la configuración SSL
.
SSLSocketFactory
ySSLContext
deberían poder utilizarse sin restricciones innecesarias. - Encabezados HTTP personalizados en el protocolo de enlace inicial , incluida la autenticación básica.
- Encabezados HTTP personalizados en la negociación de proxy HTTP , incluida la autenticación en el servidor proxy.
- Capaz de enviar todos los tipos de trama (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 cuadros pong no solicitados manualmente.
- Interfaz de escucha para recibir varios eventos de WebSocket. Una interfaz pobre hace que los desarrolladores se sientan frustrados. Una interfaz rica ayuda a los desarrolladores a escribir aplicaciones robustas.
- Capaz de consultar el estado de WebSocket o no. RFC 6455 define los estados de CONEXIÓN, ABIERTO, CIERRE y CERRADO, pero pocas implementaciones mantienen su transición de estado interno de la manera definida.
-
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)
) - Capaz de acceder al zócalo sin procesar subyacente .
- API intuitiva fácil de usar o no.
- Bien documentado o no.
- Compatibilidad con RFC 7692 (Extensiones de compresión para WebSocket) (también conocido como permessage-deflate).
- Redirección (3xx) de apoyo.
- Soporte de autenticación de resumen .
TakahikoKawasaki/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 a los métodos
setPingInterval
/
setPongInterval
(consulte
JavaDoc
).
Descargo de responsabilidad: Takahiko Kawasaki es el autor de nv-websocket-client.
Quiero agregar un Service 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 TooTallNate/Java-WebSocket escrita en 100% Java. http://java-websocket.org/ - Este está vinculado en mi primer resultado de googlear "android websocket" . Sin embargo, tiene bastantes problemas abiertos, especialmente sobre conexiones SSL, y no parece mantenerse activamente en este momento.
-
Descripción de koush/AndroidAsync de GitHub: socket asíncrono, http (cliente + servidor), websocket y biblioteca socket.io para Android. Basado en nio, no hilos. - Una vez más, muchos temas 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 está 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?
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 .
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:
public class MyApplication extends Application {
private Socket mSocket;
{
try {
mSocket = IO.socket(Config.getBaseURL());
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
public Socket getSocket() {
return mSocket;
}
}
c) Agregue esta función a su actividad, donde llamó a WebSocket:
private void websocketConnection() {
//Get websocket from application
MyApplication app = (MyApplication ) getApplication();
mSocket = app.getSocket();
mSocket.on(Socket.EVENT_CONNECT, onConnect);
mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
mSocket.on("messageFromServer", onNewLocation);
mSocket.connect();
}
private Emitter.Listener onConnect = new Emitter.Listener() {
@Override
public void call(Object... args) {
runOnUiThread(() -> {
if (!isConnected) {
RequestSocket mRequestSocket = new RequestSocket();
mRequestSocket.setToken("anil_singhania");
/* your parameter */
mSocket.emit("messageFromClient", new Gson().toJson(mRequestSocket));
Log.i("Socket Data", new Gson().toJson(mRequestSocket));
isConnected = true;
}
});
}
};
private Emitter.Listener onDisconnect = args -> runOnUiThread(() -> {
isConnected = false;
/* Toast.makeText(getApplicationContext(),
R.string.disconnect, Toast.LENGTH_LONG).show();*/
});
private Emitter.Listener onConnectError = args -> runOnUiThread(() -> {
/* Toast.makeText(getApplicationContext(),
R.string.error_connect, Toast.LENGTH_LONG).show()*/
});
private Emitter.Listener onNewLocation = new Emitter.Listener() {
@Override
public void call(final Object... args) {
runOnUiThread(() -> {
});
}
};