web-dev-qa-db-fra.com

Sous-protocole de demande-réponse WebSocket

WebSocket fournit une communication bidirectionnelle comme une conversation avec un être humain. Le client peut envoyer des données au serveur et le serveur peut envoyer des données au client à tout moment. Mais qu'en est-il de la question? le comportement demande-réponse? Le client pourrait demander quelque chose au serveur et attendre une réponse. Il semble que Websocket ne fournisse rien pour lier les données client (demande) aux données serveur (réponse).

C'est probablement le travail du sous-protocole et j'ai quelques idées sur la façon de le faire (envoyer un identifiant avec la demande et attendre une réponse avec le même identifiant jusqu'à un délai d'expiration).

Afin de ne pas refaire la roue et de gagner du temps, j'ai cherché sur Internet une solution existante mais je n'ai rien trouvé de connexe (peut-être de mauvais mots-clés).

Alors, est-ce que quelqu'un est au courant de ce genre de travail ou est-ce que je manque quelque chose?

67
Ghetolay

Le WebSocket Application Messaging Protocol (WAMP) http://wamp.ws/ fournit des modèles de messagerie RPC (Remote Procedure Call) et PubSub (Publish & Subscribe) au-dessus de WebSocket brut à cet effet.

WAMP est un sous-protocole WebSocket approprié, utilise WebSocket comme transport et JSON comme format de charge utile. RPC est implémenté à l'aide de 3 messages, et ces messages contiennent un "ID d'appel" pour corréler les réponses du serveur RPC asynchrone aux appels de procédure lancés par le client.

Avertissement: je suis l'auteur de WAMP et de certaines implémentations (open-source) de WAMP. C'est une initiative ouverte, avec d'autres déjà commencé à monter sur le bateau. En fin de compte, il devrait y avoir un RFC WAMP définissant correctement le protocole .. mais c'est encore aux premiers stades.

45
oberstet

J'utiliserais JSON-RPC 2.0.

http://www.jsonrpc.org/specification

Chaque message serait un objet JSON. Le protocole indique s'il s'agit d'un appel qui souhaite une réponse (couplage avec id) ou une notification.

Une application prenant en charge JSON-RPC pourrait facilement vérifier si l'objet message contient une méthode, signifiant un appel ou non, signifiant une réponse.

Je suis sur le point de construire une bibliothèque javascript pour gérer json rpc sur websocket, avec ajax comme solution de rechange ...

12
fiddur

jetez un oeil au SwaggerSocket , qui est un REST sur le protocole WebSockets pris en charge avec tous les principaux Java WebServer).

2
jfarcand

Jetez un oeil à msg-rpc , il fournit un support rpc bidirectionnel sur une interface de message simple, y compris WebSocket.

Non seulement le rpc simple, qui pourrait couvrir le comportement "demande client/réponse serveur", il prend également en charge le comportement "demande serveur/réponse client", via le service Rpc.

Pour commencer, il y a des exemples de sockjs et socket.io.

1
Andrew

J'exécute un programme simple de demande-réponse utilisant des websockets. Voir " démonstration du serveur Websocket ". Vous pouvez télécharger le code source de la page Web.

1
Roger F. Gay

(envoyer un identifiant avec la demande et attendre une réponse avec le même identifiant jusqu'à un délai d'expiration)

J'ai créé une bibliothèque qui fait exactement cela, appelée WebSocketR2 (où R2 signifie Request Response): https://github.com/ModernEdgeSoftware/WebSocketR2

Il gère également la reconnexion au serveur en cas de perte de connexion, ce qui peut être utile si vous effectuez des sockets Web via un équilibreur de charge.

Le résultat final est que vous pouvez implémenter des rappels sur la fonction d'envoi de socket Web comme ceci:

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

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

Un peu en retard sur cette discussion mais, BrokerJS est une alternative réactive que vous pouvez essayer dans NodeJS. Définissez un modèle de données et abonnez les connexions Websocket à des clés spécifiques du modèle. Toutes les modifications apportées à la variable côté serveur sont automatiquement répercutées côté client. Je pense que cela vous fera économiser beaucoup de code standard. Encore mieux, vous pouvez toujours utiliser la messagerie Websocket à l'ancienne parallèlement à la nouvelle façon réactive de faire les choses. C'est loin d'être un produit poli et les matrices sont un casse-tête. Mais en conjonction avec quelque chose comme VueJS, React ou Svelte, je pense que cela vous évitera beaucoup de problèmes.

Avertissement: je suis l'auteur de BrokerJS.

0
Roy