WebSocket 请求-响应子协议

92

WebSocket提供了一种双向通信的方式,就像人类交流一样。客户端可以随时将数据发送到服务器并接收来自服务器的数据。但是请求-响应行为怎么办呢?客户端可以向服务器发出请求并等待响应。看起来WebSocket似乎没有提供任何东西来链接客户端数据(请求)和服务器数据(响应)。

这可能是子协议的工作,我有一些关于如何实现它的想法(通过请求中发送一个ID,并在超时期限内等待具有相同ID的响应)。

为了不重复造轮子并节省时间,我在互联网上查找现有解决方案,但我没有找到任何相关的内容(可能是因为搜索词不对)。

所以,是否有人知道这种方法或者我错过了什么?


WebSockets并不是为经典的HTTP请求-响应行为而设计的。它们是基于事件的,就像JavaScript事件一样:它们有点像未经请求的到来。 - rvighne
7个回答

58
WebSocket应用消息协议(WAMP)https://wamp-proto.org/是在原始WebSocket之上提供远程过程调用(RPC)和发布订阅(PubSub)消息模式的合适WebSocket子协议,使用WebSocket作为传输协议,JSON作为有效载荷格式。RPC使用3个消息实现,并且这些消息包含一个“调用ID”,以将异步RPC服务器响应与客户端发起的过程调用相关联。
免责声明:我是WAMP的作者和一些(开源)WAMP实现的作者。它是一个开放的倡议,已经有其他人开始加入。最终,应该有一个WAMP RFC来正确定义协议..但现在仍处于早期阶段。

正是我想要的。我正在开发 Java 的双端应用,看起来你们没有 Java 实现,所以我很乐意加入 :) - Ghetolay
太棒了!加入我们吧!顺便说一下:我们有一个专为Android的Java客户端实现:https://github.com/tavendo/AutobahnAndroid以下是一些WAMP资源:http://wamp.ws/spec、https://github.com/tavendo/wamp、后者中提到的邮件列表,以及(主要出于历史原因)Autobahn的邮件列表:http://groups.google.com/group/autobahnws。 - oberstet
@oberstet 我有一个类似的问题,关于WebSocket和Apache服务器不断向客户端发送重复信息,而不是只发送一次。 位于http://stackoverflow.com/questions/25071639/configure-apache-server-and-websockets-to-prevent-repeated-pulling-of-same-data 有什么建议吗? - Sauron

15

我将使用JSON-RPC 2.0。

http://www.jsonrpc.org/specification

每个消息都将是一个JSON对象。该协议规定了它是要求响应的调用(与id配对)还是通知。

一个JSON-RPC感知应用程序可以轻松地检查消息对象是否包含一个方法,表示要求调用,或者没有,表示响应。

我即将构建一个JavaScript库来处理WebSocket上的JSON-RPC,同时具备Ajax回退功能...


我的计划是在js中添加一个JSON-RPC服务器,这样后端就可以以同样的方式向浏览器发送请求。 - fiddur
2
+1 JSON-RPC非常适合WebSocket,特别是PubSub(尽管WAMP网站上有相反的说法)。 WebSocket与JSON-RPC最大的假问题是缺乏响应,因此,据说排除了使用JSON-RPC并要求在WebSocket上使用“通知”模式。 但是,坚持包含id(标记非通知模式)元素的JSON-RPC调用实际上允许双向异步响应出现在该ID下(只需要将ID传递给b / e回调),您可以继续使用无响应的请求的通知模式。 - ddotsenko

5
(在请求中发送一个ID,并等待具有相同ID的响应,直到超时期)。
我创建了一个名为WebSocketR2的库,可以实现此功能(其中R2表示请求响应):https://github.com/ModernEdgeSoftware/WebSocketR2
如果连接丢失,它还处理重新连接到服务器,这对于通过负载均衡器进行WebSockets的情况可能很有用。
最终结果是您可以像这样在WebSockets上实现回调:
var request = {
    action: "login",
    params: {
        username: "test",
        password: "password"
    }
};

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

2
请看 msg-rpc,它提供了简单消息接口上的双向rpc支持,包括WebSocket。
不仅支持简单rpc,即可以覆盖“客户端请求/服务器响应”行为,还支持通过Rpc Service实现“服务器请求/客户端响应”行为。
要开始使用,有sockjs和socket.io示例。

2

看一下SwaggerSocket,它是一个基于WebSockets的REST协议,支持所有主要的Java WebServer。


1

我正在使用 Websocket 运行一个简单的请求-响应程序。请查看 "Websocket 服务器演示". 您可以下载网页源代码。


这个回答如何解决问题? - Robert Perry
近11年过去了,问题仍然很明确。这个问题是关于使用WebSockets进行请求-响应的。从演示中可以看出,WebSockets可以处理请求-响应。 - Roger F. Gay

0
稍微晚了一些,但是你可以在NodeJS中尝试BrokerJS,这是一种响应式的替代方案。定义一个数据模型并订阅特定键的websocket连接。服务器端变量的任何更改都会自动反映在客户端上。我认为这将为您节省大量样板代码。更好的是,您仍然可以使用老式的websocket消息传递方式与新的响应式方式并行使用。它远非一个完美的产品,数组也很头疼。但是与VueJS、React或Svelte等类似的东西结合使用,我认为它将为您节省很多麻烦。
免责声明:我是BrokerJS的作者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接