Ich entwickle eine Android-Anwendung, die Daten mit einem im Frühjahr konfigurierten Anlegestegserver austauscht. Um eine dynamischere Android-Anwendung zu erhalten, versuche ich das WebSocket-Protokoll mit Stomp-Nachrichten zu verwenden.
Um dieses Zeug zu realisieren, konfiguriere ich im Frühjahr einen Web-Socket-Nachrichtenbroker:
%Vor% und ein SimpMessageSendingOperations
im Spring-Controller zum Senden einer Nachricht vom Server zum Client:
Wenn ich diese Konfiguration in einem Webbrowser mit stomp.js teste, habe ich kein Problem: Nachrichten werden perfekt zwischen dem Webbrowser und dem Jetty-Server ausgetauscht. Der JavaScript-Code, der für den Webbrowser-Test verwendet wird:
%Vor% Probleme treten auf, wenn ich versuche, Android mit Bibliotheken wie gozirra, activemq-stomp oder anderen zu stampfen: Die meiste Zeit funktioniert die Verbindung mit dem Server nicht. Meine App hört auf zu laufen und nach ein paar Minuten habe ich die folgende Nachricht in logcat: java.net.UnknownHostException: Unable to resolve host "ws://192.168.1.39/client": No address associated with hostname
, und ich verstehe nicht warum. Code unter Verwendung der Gozhira-Bibliothek, die den Stomp-Aufruf in meiner Android-Aktivität verwaltet:
Nach einigen Nachforschungen fand ich heraus, dass die meisten Personen, die über Websocket mit Java-Client stampfen wollen, den ActiveMQ-Server verwenden, wie in diesem Website . Aber Spring-Tools sind sehr einfach zu bedienen und es wird cool, wenn ich meine Server-Ebene so halten könnte, wie es jetzt ist. Jemand könnte Stomp Java (Android) auf der Client-Seite mit Spring-Konfiguration auf der Serverseite verwenden?
Ich erreiche, stampfen über Web-Socket mit Android und Feder-Server.
Um so etwas zu tun, habe ich eine Web-Socket-Bibliothek verwendet: werbench (folgen Sie diesem Link , um es herunterzuladen). Zur Installation habe ich den Maven-Befehl mvn install
verwendet und das jar in meinem lokalen Repository wiederhergestellt. Dann muss ich eine Stomp-Ebene auf dem Basis-Web-Socket hinzufügen, aber ich konnte keine Stomp-Bibliothek in Java finden, die über den Web-Socket stampfen könnte (ich musste auf Gozzira verzichten). Also erstelle ich meinen eigenen (mit stomp.js wie Model). Zögere nicht, mich zu fragen, ob du es dir ansehen willst, aber ich habe es sehr schnell gemerkt, damit es nicht so viel wie stomp.js schafft. Dann muss ich eine Authentifizierung mit meinem Frühlingsserver verwirklichen. Um dies zu erreichen, folgte ich dem Hinweis auf diese Seite . Wenn ich den JSESSIONID-Cookie zurückbekomme, musste ich nur einen Header mit diesem Cookie bei der Instanziierung eines Werbench-Web-Sockets in meiner Stomp-Bibliothek deklarieren.
BEARBEITEN: Dies ist die Hauptklasse in dieser Bibliothek, die die Stomp-über-Web-Socket-Verbindung verwaltet:
%Vor%Dies ist der Rahmen einer Stomp-Nachricht:
%Vor%Dies ist ein Objekt, das zum Einrichten einer Subskription über das Stomp-Protokoll verwendet wird:
%Vor%Zumindest gibt es zwei Schnittstellen, die als "Run" -Java-Klasse verwendet werden, um Web-Socket-Netzwerk und einen gegebenen Abonnement-Kanal zu überwachen
%Vor%Für weitere Informationen, zögern Sie nicht, mich zu fragen.
Meine Implementierung des STOMP-Protokolls für Android (oder plain java) mit RxJava Ссылка . Getestet auf STOMP-Server mit SpringBoot. Einfaches Beispiel (mit retrolambda ):
%Vor%Fügen Sie den folgenden Klassenpfad im Projekt hinzu:
%Vor%Fügen Sie Folgendes in Ihrer App build.gradle hinzu:
%Vor% Alle arbeiten asynchron! Sie können connect()
nach subscribe()
und send()
aufrufen, Nachrichten werden in die Warteschlange verschoben.
Zusätzliche Funktionen:
Zum Beispiel:
%Vor%Internet-Berechtigung in der manifest.xml hinzufügen
%Vor% Perfekte Lösung Eperrin danke. Ich möchte die komplette Lösung z. in Ihrer Activity / Service Phase rufen Sie connection
Methode natürlich nicht in MainThread auf.
private void connection() {
Map<String,String> headersSetup = new HashMap<String,String>();
Stomp stomp = new Stomp(hostUrl, headersSetup, new ListenerWSNetwork() {
@Override
public void onState(int state) {
}
});
stomp.connect();
stomp.subscribe(new Subscription(testUrl, new ListenerSubscription() {
@Override
public void onMessage(Map<String, String> headers, String body) {
}
}));
}
Und seien Sie vorsichtig im Websocket weberknecht library ist ein Fehler in der WebSocketHandshake-Klasse in der Methode verifyServerHandshakeHeaders ist in der Zeile 124 ist nur check wenn (! headers.get ("Connection"). equals ("Upgrade")) und wenn der Server upgrade sendet anstelle von Upgrade erhalten Sie die Fehlermeldung Verbindung fehlgeschlagen: fehlendes Header-Feld im Server-Handshake: Verbindung Sie müssen ignorieren Fälle if (! headers.get ("Verbindung ") .equalsIgnoreCase (" Upgrade "))