Ich möchte meiner Android-App einen Dienst hinzufügen , der im Hintergrund mit einer WebSocket- Verbindung (möglicherweise über mehrere Stunden oder sogar Tage) ausgeführt wird und regelmäßig Daten an einen Server sendet.
Jetzt scheint es eine Reihe von WebSocket-Bibliotheken für Java zu geben, und ich bin mir nicht sicher, welche ich verwenden soll:
TooTallNate / Java-WebSocket Beschreibung von GitHub: Eine Barebone-WebSocket-Client- und -Server-Implementierung, die zu 100% in Java geschrieben ist. http://java-websocket.org/ - Dieser ist in meinem ersten Ergebnis des Googelns von "Android Websocket" verlinkt. Es gibt jedoch einige offene Probleme, insbesondere bei SSL-Verbindungen, und es scheint derzeit nicht aktiv gewartet zu werden.
koush / AndroidAsync Beschreibung von GitHub: Asynchroner Socket, http (Client + Server), Websocket und Socket.io-Bibliothek für Android. Basierend auf nio, nicht auf Threads. - Wieder viele offene Fragen, scheint aber aktiv gepflegt / bearbeitet zu werden.
Projekt Tyrus Beschreibung von der Website: JSR 356: Java API für WebSocket - Referenzimplementierung - Diese wird von Oracle erstellt. Nicht sicher, ob es in Android funktioniert.
Jetty WebSocket Client-API- Informationen von der Website: Jetty bietet auch eine Jetty WebSocket Client-Bibliothek zum Schreiben, um das Sprechen mit WebSocket-Servern zu vereinfachen. - Nochmals: Nicht sicher, ob es in Android funktioniert.
codebutler / android-websockets Beschreibung von GitHub: Bare Minimum-Websockets (hybi13 / RFC) -Client für Android - Dieser wird im Beispiel schwiz / android-websocket verwendet. Diesist die akzeptierte Antwort auf die StackOverflow-Frage " How to make the Android-Gerät hält eine TCP-Verbindung zum Internet ohne Wake-Lock? ".
Atmosphere / wasync Beschreibung von GitHub: WebSockets mit Fallback transportieren die Clientbibliothek für Node.js, Android und Java http://async-io.org
TakahikoKawasaki / nv-websocket-client Beschreibung von GitHub: Hochwertige WebSocket-Client-Implementierung in Java.
square / okhttp Beschreibung von GitHub: Ein HTTP + SPDY-Client für Android- und Java-Anwendungen. http://square.github.io/okhttp/ -
Es verfügt über ein Websocket-Modul .Wie von scorpiodawg erwähnt , bietet OkHttp seit Version 3.5 eine integrierte Websocket-Unterstützung.firebase / TubeSock Beschreibung von GitHub: Eine in Java implementierte WebSocket- Clientbibliothek
Autobahn | Android ( GitHub ) Beschreibung von der Website: Autobahn | Android ist eine Open-Source-Netzwerkbibliothek für Java / Android, die vom Autobahn-Projekt erstellt wurde und das WebSocket-Protokoll und das Web Application Messaging Protocol (WAMP) zum Erstellen von nativem mobilem WebSocket / WAMP implementiert Kunden. - Cloudsurfin wies darauf hin, dass dies keine Unterstützung für wss hat.
Darüber hinaus gibt es eine native socket.io-Clientbibliothek für Android:
- nkzawa / socket.io-client.java Beschreibung von GitHub: Voll funktionsfähige Socket.IO-Clientbibliothek für Java, die mit Socket.IO v1.0 und höher kompatibel ist.
Die Verwendung des Android-Clients socket.io wäre für mich praktisch, da ich ohnehin vorhabe, nodejs / socket.io für das Web-Frontend zu verwenden. Der einheimische Kunde ist jedoch noch recht jung und hat mehrere offene Fragen. Darüber hinaus habe ich das Verständnis, dass eine Android-App keinen Nutzen aus der Verwendung der Client-Bibliothek socket.io hat (abgesehen davon, dass sie mit dem Server socket.io 1.0 kompatibel ist), da die Unterstützung von WebSocket auf der Client-Seite sichergestellt werden kann .
Meine Anforderungen sind wie folgt:
- Kompatibilität mit Android API 9 und höher
- Möglichkeit der Verbindung über SSL
- Halten Sie die Verbindung für eine lange Zeit, ohne ein permanentes Wakelock halten zu müssen
- Kompatibilität mit einer verfügbaren NodeJS-Websocket-Server-Implementierung oder mit socket.io
Irgendwelche Vorschläge, welche Bibliothek die richtige für diese Anforderungen ist?
Antworten:
Einige Notizen.
koush / AndroidAsync führt den für RFC 6455 erforderlichen schließenden Handshake nicht aus . Siehe dies für Details.
Project Tyrus funktioniert unter Android, stellen Sie jedoch sicher, dass die Lizenz ( CDDL 1.1 und GPL 2 mit CPE ) und die Größe ( Reduzierung der WebSocket-Client-JAR-Größe mit ProGuard ) Ihren Anforderungen entsprechen. Beachten Sie auch, dass Tyrus möglicherweise eine Ausnahme auslöst, wenn eine Textgröße groß ist (es ist wahrscheinlich ein Fehler). Siehe dies für Details.
Jetty : In einem E - Mail-Thread vor 2 Jahren in der Mailingliste für Jetty-Benutzer heißt es: "Wir haben derzeit keinen Android-kompatiblen Jetty 9-WebSocket-Client. Es ist geplant, den Jetty WebSocket-Client für Android von JDK 7 auf JDK 5/6 zurück zu portieren." verwenden, aber es hat eine niedrigere Priorität als die Fertigstellung unserer Implementierung der Java WebSocket-API JSR-356 (javax.websocket). " In Jettys aktuellem Dokument über die WebSocket Client-API wird nichts über Android erwähnt.
codebutler / android-websocket führt den für RFC 6455 erforderlichen schließenden Handshake nicht aus und kann beim Schließen eine Ausnahme auslösen . Sehen Sie das .
Atmosphere / wasync verwendet AsyncHttpClient / async-http-client als WebSocket-Implementierung. Daher sollte stattdessen AsyncHttpClient / async-http-client erwähnt werden.
firebase / TubeSock überprüft nicht
Sec-WebSocket-Accept
. Dies ist ein Verstoß gegen RFC 6455 . Außerdem hat TubeSock einen Fehler beim Erstellen einer Textnachricht. Sie werden früher oder später auf den Fehler stoßen, wenn Sie Multi-Byte-UTF-8-Zeichen für Textnachrichten verwenden. Eine lange Liste der TubeSock-Probleme finden Sie in Ausgabe 3 in Enjoy-Im / Android-DDP .Betrachtungspunkte
Überlegungen bei der Auswahl einer in Java geschriebenen WebSocket-Client-Implementierung:
SSLSocketFactory
undSSLContext
sollte ohne unnötige Einschränkungen verwendet werden können.Socket.connect(SocketAddress endpoint, int timeout)
nv-websocket-client deckt alle oben genannten Punkte mit Ausnahme der letzten beiden ab. Darüber hinaus besteht eine der kleinen, aber praktischen Funktionen darin, regelmäßig Ping / Pong-Frames zu senden. Dies kann nur durch Aufrufen von
setPingInterval
/setPongInterval
Methoden erreicht werden (siehe JavaDoc ).Haftungsausschluss: Takahiko Kawasaki ist der Autor von nv-websocket-client.
quelle
onDisconnected
Methode und dieonError
Methode von WebSocketListener .onError
Methode gibt Ihnen eineWebSocketException
Instanz. Rufen Sie diegetError()
Methode auf, um das Problem zu ermitteln.Einige andere Überlegungen:
Tyrus funktioniert unter Android. Die in Android 5.0 verwendeten SSL-Bibliotheken sind jedoch fehlerhaft und schlagen SSL-Handshakes fehl . Dies soll in neueren Versionen von Android behoben werden. Da Android jedoch auf vielen Geräten nicht aktualisiert wird, kann dies ein Problem für Sie sein.
Abhängig davon, wie SSL für andere Websocket-Implementierungen implementiert ist, kann dies auch ein Problem sein.
AndroidAsync hat dieses SSL-Problem nicht. Es gibt andere Probleme, z. B. keine Zeitüberschreitungen festlegen zu können .
quelle
a) Fügen Sie diese Datei in die Gradle-Datei ein
compile 'com.github.nkzawa:socket.io-client:0.3.0'
b) Fügen Sie diese Zeilen in Anwendungsaktivität hinzu:
c) Fügen Sie diese Funktion Ihrer Aktivität hinzu, in der Sie WebSocket aufgerufen haben:
quelle