多个websocket连接

Multiple websocket connections

本文关键字:连接 websocket 多个      更新时间:2023-09-26

从同一客户端到同一服务器有两个不同的websocket连接有什么好处吗?对我来说,这似乎是一个糟糕的设计选择,但有什么理由让它变得更好吗?

您可能想要这样做有几个原因,但它们可能并不太常见(至少目前还不常见):

  • 您发送/接收的数据既有加密数据,也有未加密数据(例如,有些数据庞大但不敏感)
  • 你既有流媒体数据,也有对延迟敏感的数据:想象一个互动游戏,偶尔会在游戏中播放流媒体视频。您不希望大型媒体流延迟接收对延迟敏感的正常游戏消息
  • 您既有文本数据(例如JSON控制消息),也有二进制数据(类型化的数组或Blob),不想麻烦添加自己的协议层来区分,因为WebSockets已经为您做到了这一点
  • 您有多个支持的WebSocket子协议(URI后面的可选设置),并且页面希望访问多个(每个WebSocket连接仅限于一个子协议)
  • 在同一个web服务器和端口后面有几个不同的WebSocket服务。客户端选择每个连接的方式可能取决于URI路径、URI方案(ws或wss)、子协议,甚至可能是从客户端到服务器的第一条消息

我相信还有其他原因,但这就是我脑海中所能想到的。

我发现,当您只订阅服务器管理的某些对象的更新时,它可以使客户端逻辑变得更简单。您可以为每个元素打开一个套接字,而不是为单个通道设计自定义订阅协议。

假设您通过的REST API获得了一组元素

http://myserver/api/some-elements

您可以使用如下的套接字url订阅单个元素的更新:

ws://myserver/api/some-elements/42/updates

当然,有人会争辩说,这不适合复杂的页面。然而,对于小而简单的应用程序,它可能会让你的生活轻松很多。

除了卡纳卡所说的,可能还有另一个问题。例如,您的应用程序是这样配置的:每30秒就会有一次WebSocket网络的乒乓球,服务器根据乒乓球确定是否有来自客户端的响应。您开始通过WebSocket上传大量数据,例如1Gb,这可能需要几分钟的时间,具体取决于互联网连接速度。服务器发送ping,客户端接收并发送pong,但是WebSocket通道已经忙于传输数据。服务器没有接收到乒乓球并重置连接。数据传输中断。

因此,根据WebSocket通道的功能来分离它们是有意义的。一个应该用于客户端信令和系统数据,例如,有多少已经上传到服务器,另一个专门用于传输大数据。