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?
Antworten:
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.
quelle
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…
quelle
id
Element 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.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.
quelle
Schauen Sie sich das SwaggerSocket an , ein REST-over-WebSockets-Protokoll, das von allen wichtigen Java WebServern unterstützt wird.
quelle
Ich führe ein einfaches Request-Response-Programm mit Websockets aus. Siehe " Websocket Server-Demonstration ". Sie können den Webseiten-Quellcode herunterladen.
quelle
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:
quelle
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.
quelle