83

WebSocket 提供了一种双向通信,就像人类谈话一样。客户端可以向服务器发送数据,服务器可以随时向客户端发送数据。但是请求-响应行为呢?客户端可以向服务器询问某些内容并等待响应。Websocket 似乎没有提供任何东西来将客户端数据(请求)链接到服务器数据(响应)。

这可能是子协议的工作,我对如何做到这一点有一些想法(在请求中发送一个 ID 并在超时期限内等待具有相同 ID 的响应)。

为了不重新发明轮子并节省一些时间,我在互联网上查看了现有的解决方案,但我没有找到任何相关的东西(可能是错误的关键字)。

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

4

7 回答 7

55

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

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

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

于 2012-06-04T14:13:48.753 回答
14

我会使用 JSON-RPC 2.0。

http://www.jsonrpc.org/specification

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

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

我即将构建一个 javascript 库来处理 websocket 上的 json rpc,并使用 ajax 作为后备......</p>

于 2013-02-13T15:16:51.450 回答
4

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

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

如果连接丢失,它还会处理重新连接到服务器,如果您通过负载平衡器执行 Web 套接字,这可能会很有帮助。

最终结果是您可以像这样在 Web 套接字发送函数上实现回调:

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

ws.send(request, function(response){
    console.log(response)
});
于 2018-01-28T14:41:03.753 回答
2

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

于 2012-07-19T18:37:56.037 回答
2

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

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

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

于 2013-10-22T05:18:41.540 回答
1

我正在使用 websockets 运行一个简单的请求响应程序。请参阅“ Websocket 服务器演示”。您可以下载网页源代码。

于 2012-07-19T17:06:02.517 回答
0

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

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

于 2019-08-12T06:39:10.770 回答