WebSocket request-response subprotocol

WebSocket zapewnia dwukierunkową komunikację, jak mówi człowiek. Klient może wysyłać dane do serwera, a serwer może wysyłać dane do Klienta w dowolnym momencie. Ale co z pytaniem ? zachowanie Prośba-odpowiedź ? Klient może poprosić o coś serwer i poczekać na odpowiedź. Wygląda na to, że Websocket nie zapewnia niczego, co łączyłoby dane klienta (żądanie) z danymi serwera (odpowiedź).

To pewnie dzialanie subprotocol i mam kilka pomyslow jak aby to zrobić (Wyślij id z żądaniem i poczekaj na odpowiedź o tym samym id do czasu przedawnienia).

Aby nie przerobić koła i zaoszczędzić trochę czasu, szukałem w Internecie istniejącego rozwiązania, ale nie znalazłem nic związanego (może złe słowa kluczowe).

Czy jest ktoś świadomy tego typu pracy, czy coś przeoczyłem ?

 60
Author: wprl, 2012-06-04

6 answers

WebSocket Application Messaging Protocol (WAMP) http://wamp.ws/ dostarcza do tego celu wzorce wiadomości RPC (Remote Procedure Call) i PubSub (Publish & Subscribe) na surowym WebSocket.

WAMP jest odpowiednim WebSocket subprotocol, używa WebSocket jako transportu i JSON jako payload format. RPC jest zaimplementowany przy użyciu 3 wiadomości, które zawierają "Call ID", aby skorelować asynchroniczne odpowiedzi serwera RPC do procedury zainicjowanej przez Klienta telefony.

Disclaimer: jestem autorem WAMP i niektórych (open-source) implementacji WAMP. To otwarta inicjatywa, a inni już zaczęli wsiadać na Łódź. Ostatecznie powinien istnieć WAMP RFC poprawnie definiujący protokół .. ale to jeszcze we wczesnych stadiach.

 37
Author: oberstet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-04 14:13:48

Użyłbym JSON-RPC 2.0.

Http://www.jsonrpc.org/specification

Każda wiadomość będzie obiektem JSON. Protokół określa, czy jest to wywołanie, które chce odpowiedzi (sprzężenie z id), lub powiadomienie.

Aplikacja świadoma JSON-RPC może łatwo sprawdzić, czy obiekt message zawiera metodę, oznaczającą wywołanie, czy nie, oznaczającą odpowiedź.

[[0]} mam zamiar zbudować lib javascript do obsługi json rpc przez websocket, z ajax jako fallback ...
 11
Author: fiddur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-13 15:16:51

Spójrz na SwaggerSocket, który jest protokołem REST over WebSockets obsługiwanym przez wszystkie główne serwery Java.

 2
Author: jfarcand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-31 14:49:15

Uruchamiam prosty program request-response przy użyciu websockets. Zobacz "Websocket Server Demonstration". Możesz pobrać kod źródłowy strony internetowej.

 1
Author: Roger F. Gay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 17:06:02

Spójrz na msg-RPC , zapewnia dwukierunkową obsługę rpc przez prosty interfejs wiadomości, w tym WebSocket.

Nie tylko prosty rpc, który może obejmować zachowanie "żądanie klienta / odpowiedź serwera", ale także obsługuje zachowanie "żądanie serwera / odpowiedź klienta", które odbywa się za pośrednictwem usługi Rpc.

Na początek są sockjs i socket.io przykłady .

 1
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 05:18:41
W tym celu należy wysłać zapytanie o identyfikator i poczekać na odpowiedź o tym samym identyfikatorze do czasu przekroczenia limitu czasu.]}

Stworzyłem lib, który robi dokładnie to, o nazwie WebSocketR2 (gdzie R2 oznacza odpowiedź na żądanie): https://github.com/ModernEdgeSoftware/WebSocketR2

Obsługuje również ponowne łączenie się z serwerem w przypadku utraty połączenia, co może być pomocne, jeśli robisz gniazda sieciowe za pomocą load balancer.

W efekcie końcowym można zaimplementować wywołania zwrotne na funkcja web socket send wygląda następująco:

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

ws.send(request, function(response){
    console.log(response)
});
 1
Author: Neo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 00:25:37