【问题标题】:WebSocket request-response subprotocolWebSocket 请求-响应子协议
【发布时间】:2012-06-08 14:08:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • WebSockets 并不真正适用于那种经典的 HTTP 请求-响应行为。它们是基于事件的,就像 JavaScript 事件一样:它们是不请自来的。

标签: websocket


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    最终的结果是你可以像这样在 web socket 发送函数上实现回调:

    var request = {
        action: "login",
        params: {
            username: "test",
            password: "password"
        }
    };
    
    ws.send(request, function(response){
        console.log(response)
    });
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          我会使用 JSON-RPC 2.0。

          http://www.jsonrpc.org/specification

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

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

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

          【讨论】:

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

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

          【讨论】:

            猜你喜欢
            • 2017-07-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-22
            • 2020-01-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多