WebSocket-Anforderungs-Antwort-Unterprotokoll

76

WebSocket bietet eine bidirektionale Kommunikation, wie wenn ein Mensch spricht. Der Client kann Daten an den Server senden, und der Server kann jederzeit Daten an den Client senden. Aber was ist mit dem Anforderungs- / Antwortverhalten? Der Client könnte etwas an den Server fragen und auf eine Antwort warten. Es scheint, dass Websocket nichts bietet, um Clientdaten (Anfrage) mit Serverdaten (Antwort) zu verknüpfen.

Es ist wahrscheinlich die Arbeit des Unterprotokolls und ich habe einige Ideen, wie es geht (senden Sie eine ID mit der Anfrage und warten Sie innerhalb eines Zeitlimits auf eine Antwort mit derselben ID).

Um das Rad nicht neu zu erfinden und Zeit zu sparen, habe ich im Internet nach einer vorhandenen Lösung gesucht, aber nichts Ähnliches gefunden (möglicherweise schlechte Keywords).

Ist jemandem diese Art von Arbeit bekannt oder fehlt mir etwas?

Ghetolay
quelle
WebSockets sind nicht wirklich für dieses klassische HTTP-Anforderungs-Antwort-Verhalten gedacht. Sie sind ereignisbasiert , wie JavaScript-Ereignisse: Sie werden nicht angefordert.
Rvighne

Antworten:

52

Das WebSocket Application Messaging Protocol (WAMP) https://wamp-proto.org/ bietet zu diesem Zweck RPC- (Remote Procedure Call) und PubSub- (Publish & Subscribe) Messaging-Muster zusätzlich zu Raw WebSocket.

WAMP ist ein richtiges WebSocket-Unterprotokoll, verwendet WebSocket als Transport und JSON als Nutzdatenformat. RPC wird unter Verwendung von 3 Nachrichten implementiert, und diese Nachrichten enthalten eine "Anruf-ID", um asynchrone RPC-Serverantworten mit vom Client initiierten Prozeduraufrufen zu korrelieren.

Haftungsausschluss: Ich bin Autor von WAMP und einigen (Open-Source-) WAMP-Implementierungen. Es ist eine offene Initiative, bei der andere bereits begonnen haben, auf das Boot zu steigen. Letztendlich sollte es einen WAMP-RFC geben, der das Protokoll richtig definiert. Es befindet sich jedoch noch im Anfangsstadium.

oberstet
quelle
Genau das, wonach ich gesucht habe. Ich arbeite auf beiden Seiten an Java und Sie scheinen keine Java-Implementierungen zu haben, daher werde ich gerne beitreten :)
Ghetolay
Toll! Begleiten Sie uns! Übrigens: Wir haben eine Android-spezifische Java-Client-Implementierung: github.com/tavendo/AutobahnAndroid Einige WAMP-Ressourcen: wamp.ws/spec , github.com/tavendo/wamp , die in letzterer erwähnte Mailingliste und (meistens) aus historischen Gründen), die Mailingliste für Autobahn: groups.google.com/group/autobahnws .
Oberstet
@oberstet Ich habe eine verwandte und ähnliche Frage in Bezug auf den Websocket und den Apache-Server, die nicht nur einmal, sondern wiederholt Informationen an den Client senden. Befindet sich unter stackoverflow.com/questions/25071639/… irgendwelche Vorschläge?
Sauron
13

Ich würde JSON-RPC 2.0 verwenden.

http://www.jsonrpc.org/specification

Jede Nachricht wäre ein JSON-Objekt. Das Protokoll gibt an, ob es sich um einen Anruf handelt, der eine Antwort (Kopplung mit der ID) oder eine Benachrichtigung wünscht.

Eine JSON-RPC-fähige Anwendung kann leicht überprüfen, ob das Nachrichtenobjekt eine Methode enthält, die einen Aufruf anzeigt oder nicht, die eine Antwort anzeigt.

Ich bin dabei, eine Javascript-Bibliothek zu erstellen, um json rpc über Websocket zu verarbeiten, mit Ajax als Fallback…

Fiddur
quelle
Mein Plan ist es, auch in js einen JSON-RPC-Server hinzuzufügen, damit das Backend auf die gleiche Weise Anforderungen an den Browser senden kann.
Fiddur
1
+1 JSON-RPC eignet sich eigentlich sehr gut für WebSocket und speziell für PubSub (trotz der gegenteiligen Aussagen auf der WAMP-Website). Das größte vorgetäuschte Problem mit WebSocket gegenüber JSON-RPC ist die mangelnde Reaktion. Daher wird angeblich die Verwendung von JSON-RPC ausgeschlossen und die Verwendung des Benachrichtigungsmodus in JSON-RPC über WebSocket erforderlich. Wenn Sie jedoch bei JSON-RPC-Aufrufen bleiben, die ein idElement enthalten (das den Nichtbenachrichtigungsmodus kennzeichnet), können bidirektionale asynchrone Antworten unter diese ID fallen (Sie müssen lediglich die ID an den Rückruf auf b / e übergeben), und Sie können den Benachrichtigungsmodus weiterhin verwenden für Anfragen ohne Antwort.
Ddotsenko
2

Werfen Sie einen Blick auf msg-rpc , es bietet bidirektionale rpc-Unterstützung über eine einfache Nachrichtenschnittstelle, einschließlich WebSocket.

Nicht nur der einfache RPC, der das Verhalten "Clientanforderung / Serverantwort" abdecken könnte, unterstützt auch das Verhalten "Serveranforderung / Clientantwort", das über den Rpc-Dienst erfolgt.

Zu Beginn gibt es Beispiele für sockjs und socket.io.

Andrew
quelle
2

Schauen Sie sich das SwaggerSocket an , ein REST-over-WebSockets-Protokoll, das von allen wichtigen Java WebServern unterstützt wird.

jfarcand
quelle
1

Ich führe ein einfaches Request-Response-Programm mit Websockets aus. Siehe " Websocket Server-Demonstration ". Sie können den Webseiten-Quellcode herunterladen.

Roger F. Gay
quelle
1

(Senden Sie eine ID mit der Anfrage und warten Sie bis zu einer Zeitüberschreitung auf eine Antwort mit derselben ID.)

Ich habe eine Bibliothek namens WebSocketR2 erstellt (wobei R2 Request Response bedeutet): https://github.com/ModernEdgeSoftware/WebSocketR2

Außerdem wird die erneute Verbindung zum Server hergestellt, wenn eine Verbindung unterbrochen wird. Dies kann hilfreich sein, wenn Sie Web-Sockets über einen Load Balancer ausführen.

Das Endergebnis ist, dass Sie Rückrufe in der Web-Socket-Sendefunktion wie folgt implementieren können:

var request = {
    action: "login",
    params: {
        username: "test",
        password: "password"
    }
};

ws.send(request, function(response){
    console.log(response)
});
Neo
quelle
0

Ein bisschen spät in dieser Diskussion, aber BrokerJS ist eine reaktive Alternative, die Sie in NodeJS ausprobieren können. Definieren Sie ein Datenmodell und abonnieren Sie Websocket-Verbindungen zu bestimmten Schlüsseln des Modells. Alle Änderungen an der serverseitigen Variablen werden automatisch auf der Clientseite angezeigt. Ich denke, das spart Ihnen viel Code. Noch besser ist, dass Sie das altmodische Websocket-Messaging parallel zur neuen reaktiven Vorgehensweise verwenden können. Es ist weit entfernt von einem polierten Produkt und Arrays bereiten Kopfschmerzen. Aber in Verbindung mit etwas wie VueJS, React oder Svelte denke ich, dass es Ihnen viel Ärger ersparen wird.

Haftungsausschluss: Ich bin der Autor von BrokerJS.

Roy
quelle