Je souhaite ajouter un Service à mon application Android qui s'exécute en arrière-plan, avec une connexion WebSocket (éventuellement plusieurs heures ou même plusieurs jours) et régulièrement envoie des données à un serveur.
Maintenant, il semble y avoir un tas de bibliothèques WebSocket pour Java, et je ne suis pas sûr de celle que je devrais utiliser:
TooTallNate/Java-WebSocket Description provenant de GitHub: implémentation client et serveur barebones WebSocket écrite en 100% Java. http://Java-websocket.org/ - Celui-ci est lié à mon premier résultat de Google "Android websocket" . Cependant, quelques problèmes restent à résoudre, notamment en ce qui concerne les connexions SSL, et il ne semble pas être activement maintenu pour le moment.
koush/AndroidAsync Description à partir de GitHub: socket asynchrone, http (client + serveur), websocket et bibliothèque de socket.io pour Android. Basé sur nio, pas de threads. - Encore une fois de nombreuses questions en suspens, mais semble être maintenu/maintenu actif.
Project Tyrus Description provenant du site Web: JSR 356: Java API pour WebSocket - Implémentation de référence - Ceci est fabriqué par Oracle. Je ne sais pas si cela fonctionne sous Android.
API Jetty WebSocket Client Informations du site Web: Jetty fournit également une bibliothèque cliente Jetty WebSocket pour faciliter la conversation avec les serveurs WebSocket. - Encore une fois: Je ne sais pas si cela fonctionne sous Android.
codebutler/Android-websockets Description provenant de GitHub: client Websockets minimal nue (hybi13/RFC) pour Android - Celui-ci est utilisé dans schwiz/Android-websocket-example , qui est la réponse acceptée pour la question StackOverflow " Comment créer le périphérique Android maintenir une connexion TCP à Internet sans verrouillage de réveil? ".
Atmosphere/wasync Description de GitHub: WebSockets avec bibliothèque cliente de transport de secours pour Node.js, Android et Java http://async-io.org
TakahikoKawasaki/nv-websocket-client Description provenant de GitHub: implémentation de client WebSocket de haute qualité en Java.
carré/okhttp Description de GitHub: Un client HTTP + SPDY pour Android et Java applications. http://square.github.io/okhttp/ - Il a un module Websocket . Comme mentionné par scorpiodawg , OkHttp a le support intégré de websocket depuis la version 3.5.
firebase/TubeSock Description de GitHub: une bibliothèque client WebSocket implémentée en Java.
Autobahn | Android ( GitHub ) Description de site Web: Autobahn | Android est une source ouverte bibliothèque réseau pour Java/Android créée par le projet Autobahn qui implémente les protocoles WebSocket et WAMP (Web Application Messaging Protocol) pour la création de clients WebSocket/WAMP mobiles natifs. - cloudsurfin fit remarquer que cela n'a aucun support pour wss.
En outre, il existe une bibliothèque de clients native socket.io pour Android:
Utiliser le client socket.io Android me serait utile, car je prévois quand même d'utiliser nodejs/socket.io pour l'interface Web. Mais le client natif est assez jeune et a plusieurs problèmes en suspens. Et en plus de cela, je crois comprendre qu'une application Android ne présente aucun avantage à utiliser la bibliothèque client socket.io (à part d'être compatible avec le serveur socket.io 1.0), car la prise en charge de WebSocket peut soyez assuré du côté du client.
Mes exigences sont les suivantes:
Des suggestions qui est la bonne bibliothèque pour ces exigences?
Quelques notes.
koush/AndroidAsync n'effectue pas le fermeture de la poignée de main requise par RFC 6455 . Voir this pour plus de détails.
Project Tyrus fonctionne sur Android, mais assurez-vous que sa licence ( CDDL 1.1 et GPL 2 avec CPE ) et sa taille ( Réduction de la taille du fichier jar du client WebSocket avec ProGuard ) répondez à vos exigences. Notez également que Tyrus peut émettre une exception si la taille du texte est grande (c'est probablement un bug). Voir this pour plus de détails.
Jetty : Il y a 2 ans fil de messagerie dans la liste de diffusion de jetty-users dit "Nous avons actuellement Aucun client <JS 9 WebSocket compatible Android compatible. Il est prévu d'essayer de transférer le client Jetty WebSocket de JDK 7 à JDK 5/6 pour une utilisation à Android, mais sa priorité est inférieure à celle de la finition. Notre implémentation de l'API WebSocket JSR-356 Java (javax.websocket). " Le document actuel de Jetty document concernant son API WebSocket Client ne mentionne rien à propos d'Android.
codebutler/Android-websocket n'effectue pas le établissement de la négociation requis par RFC 6455 et peut jeter une exception à la fin. Voir this .
Atmosphere/wasync utilise AsyncHttpClient/ async-http-client en tant que son implémentation WebSocket. Ainsi, AsyncHttpClient/async-http-client devrait plutôt être mentionné.
firebase/TubeSock ne vérifie pas Sec-WebSocket-Accept
. Ceci est une violation contre RFC 6455 . En outre, TubeSock a un bug dans la création d'un message texte. Vous rencontrerez le bogue tôt ou tard si vous utilisez des caractères UTF-8 à plusieurs octets pour les messages texte. Voir Numéro dans delight-im/Android-DDP pour une longue liste de problèmes TubeSock.
Points à prendre en compte lors de la sélection d'une implémentation client WebSocket écrite en Java:
SSLSocketFactory
et SSLContext
devraient pouvoir être utilisés sans restrictions inutiles.Socket.connect(SocketAddress endpoint, int timeout)
)nv-websocket-client couvre tout ce qui précède, à l'exception des deux derniers. En outre, l’une de ses fonctionnalités simples mais pratiques consiste à envoyer périodiquement des cadres de ping/pong. Vous pouvez y parvenir simplement en appelant les méthodes setPingInterval
/setPongInterval
(voir JavaDoc ).
Disclaimer: Takahiko Kawasaki est l'auteur de nv-websocket-client.
Quelques autres considérations:
Tyrus fonctionne sur Android. Cependant, les bibliothèques SSL utilisées dans Android 5.0 sont erronées et échec de la négociation SSL . Cela est censé être résolu dans les versions plus récentes d'Android, mais avec la façon dont Android n'est pas mis à jour sur de nombreux appareils, cela peut poser un problème.
En fonction de la manière dont SSL est implémenté pour d'autres implémentations websocket, cela peut également être un problème.
AndroidAsync n'a pas ce problème SSL. Il a d'autres problèmes comme ne pas être en mesure de définir des délais d'attente .
a) Ajouter ce fichier dans un fichier gradle
compile 'com.github.nkzawa:socket.io-client:0.3.0'
b) Ajoutez ces lignes dans l'activité d'application:
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) Ajoutez cette fonction à votre activité, où vous avez appelé 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(() -> {
});
}
};