WebSocket请求-响应子协议


76

WebSocket提供了类似于人类对话的双向通信。客户端可以将数据发送到服务器,而服务器可以随时将数据发送到客户端。但是请求-响应行为呢?客户端可以向服务器询问一些内容,然后等待响应。似乎Websocket没有提供任何将客户端数据(请求)链接到服务器数据(响应)的功能。

这可能是子协议的工作,我对此有一些想法(发送带有请求的ID,并在超时时间内等待具有相同ID的响应)。

为了不浪费时间,为了节省时间,我在互联网上寻找了一个现有的解决方案,但没有找到任何相关的内容(可能是关键词不好)。

那么,有没有人知道这种工作,还是我错过了什么?


WebSocket并不是真正意义上的经典HTTP请求-响应行为。它们是基于事件的,就像JavaScript事件一样:它们是不请自来的。
rvighne 2014年

Answers:


52

WebSocket应用程序消息协议(WAMP)https://wamp-proto.org/为此目的在原始WebSocket上提供了RPC(远程过程调用)和PubSub(发布和订阅)消息传递模式。

WAMP是适当的WebSocket子协议,使用WebSocket作为传输方式,并使用JSON作为有效载荷格式。RPC是使用3条消息实现的,这些消息包含一个“调用ID”,以将异步RPC服务器响应与客户端发起的过程调用相关联。

免责声明:我是WAMP和一些(开源)WAMP实现的作者。这是一个开放的计划,已经有其他人开始上船了。最终,应该有一个WAMP RFC正确定义了协议..但它仍处于早期阶段。


正是我想要的。我双方都在研究Java,而且您似乎没有Java实现,因此我很乐意加入:)
Ghetolay 2012年

大!加入我们!顺便说一句:我们有一个Android特定的Java仅客户端的实现:github.com/tavendo/AutobahnAndroid 夫妇WAMP的资源:wamp.ws/specgithub.com/tavendo/wamp,后者提到的邮件列表,以及(大部分是出于历史原因),请查看高速公路的邮件列表:groups.google.com/group/autobahnws
oberstet 2012年

@oberstet在websocket和Apache服务器方面,我有一个相关且相似的问题,不断向客户端发送重复信息,而不是一次。位于stackoverflow.com/questions/25071639/…有什么建议吗?
索伦2014年

13

我将使用JSON-RPC 2.0。

http://www.jsonrpc.org/specification

每个消息将是一个JSON对象。协议说明是要响应的呼叫(与ID耦合)还是通知。

一个支持JSON-RPC的应用程序可以轻松地检查消息对象是否包含表示调用的方法或不表示响应的方法。

我将要建立一个JavaScript库,以通过websocket处理json rpc,并以ajax作为后备…


我的计划是在js中也添加JSON-RPC服务器,因此后端可以以相同的方式向浏览器发送请求。
fiddur

1
+1 JSON-RPC实际上非常适合WebSocket,尤其是PubSub(尽管WAMP网站上的声明相反)。WebSocket与JSON-RPC的最大假装问题是缺乏响应,因此,据说应该排除使用JSON-RPC并要求通过WebSocket在JSON-RPC中使用“通知”模式。但是,坚持使用包含id(标记非通知模式)元素的JSON-RPC调用实际上允许双向异步响应进入该ID(只需将ID传递给b / e上的回调),并且您可以继续使用通知模式用于无响应的请求。
ddotsenko '16

2

看一下msg-rpc,它通过简单的消息接口(包括WebSocket)提供双向rpc支持。

不仅是简单的rpc,它可以涵盖“客户端请求/服务器响应”行为,还支持通过Rpc服务的“服务器请求/服务器响应”行为。

首先,有sockjs和socket.io示例。




1

(发送带有请求的ID,并等待具有相同ID的响应,直到超时为止)

我创建了一个完全做到这一点的库,称为WebSocketR2(其中R2表示请求响应):https : //github.com/ModernEdgeSoftware/WebSocketR2

如果连接断开,它还会处理与服务器的重新连接,如果通过负载均衡器进行Web套接字,这可能会有所帮助。

最终结果是您可以在Web socket send函数上实现回调,如下所示:

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

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

0

在本次讨论中有些晚,但是BrokerJS是您可以在NodeJS中尝试的一种反应性替代方案。定义数据模型,并将Websocket连接订阅到模型的特定键。对服务器端变量的任何更改都会自动反映在客户端上。我认为这将为您节省很多样板代码。更好的是,您仍然可以将老式的Websocket消息传递与新的响应式处理方式并行使用。它离抛光产品还很远,阵列令人头疼。但是结合使用VueJS,React或Svelte之类的东西,我认为它将为您节省很多麻烦。

免责声明:我是BrokerJS的作者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.