WebSocket 提供双向通信,就像人类说话一样。客户端可以向服务器发送数据,服务器可以随时向客户端发送数据。但是请求-响应行为呢?客户端可以向服务器请求一些东西并等待响应。Websocket 似乎没有提供任何将客户端数据(请求)链接到服务器数据(响应)的内容。
这可能是子协议的工作,我对如何做到这一点有一些想法(发送一个带有请求的 ID,并在超时期限内等待具有相同 ID 的响应)。
为了不重新发明轮子并节省一些时间,我在互联网上寻找现有的解决方案,但我没有找到任何相关的东西(可能是错误的关键字)。
那么,有没有人知道这种工作,或者我错过了什么?
应用程序消息传递协议(WAMP)https://wamp-proto.org/在原始WebSocket之上提供RPC(远程过程调用)和PubSub(发布和订阅)消息传递模式。
WAMP是一个正确的WebSocket子协议,使用WebSocket作为传输,JSON作为有效负载格式。RPC 使用 3 条消息实现,这些消息包含一个"调用 ID",用于将异步 RPC 服务器响应与客户端启动的过程调用相关联。
免责声明:我是WAMP和一些(开源)WAMP实现的作者。这是一个开放的倡议,其他人已经开始上船。最终,应该有一个WAMP RFC正确定义协议。但它仍处于早期阶段。
我会使用JSON-RPC 2.0。
http://www.jsonrpc.org/specification
每条消息都是一个 JSON 对象。 该协议声明它是需要响应(与 id 耦合)还是通知的调用。
JSON-RPC 感知应用程序可以轻松检查消息对象是否包含表示调用的方法,或者不包含表示响应的方法。
我即将构建一个 JavaScript 库来处理 websocket 上的 json rpc,使用 ajax 作为后备......
(随请求一起发送 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)
});
看看msg-rpc,它通过简单的消息接口提供双向rpc支持,包括WebSocket。
它不仅是简单的 rpc,它可以涵盖"客户端请求/服务器响应"行为,它还支持"服务器请求/客户端响应"行为,这是通过 Rpc 服务。
首先,有 sockjs 和 socket.io 例子 .
SwaggerSocket,这是一个REST over WebSockets协议,所有主要的Java WebServer都支持。
我正在使用websockets运行一个简单的请求-响应程序。请参阅"Websocket 服务器演示"。您可以下载网页源代码。
这个讨论有点晚了,但是,BrokerJS是一个反应式的替代方案,你可以在NodeJS中尝试。定义数据模型并订阅模型特定键的 websocket 连接。对服务器端变量的任何更改都会自动反映在客户端。我认为这将为您节省大量样板代码。更好的是,您仍然可以使用与新的反应式做事方式并行的老式 websocket 消息传递。它远非抛光产品,阵列令人头疼。但是结合VueJS,React或Svelte之类的东西,我认为它会为你省去很多麻烦。
免责声明:我是BrokerJS的作者。