多个 WebSocket 连接

74

在同一客户端从同一服务器建立两个不同的 WebSocket 连接是否有任何优势?对我来说,这似乎是一个糟糕的设计选择,但是否有任何原因/场景可以使其更好地工作?


请求的URI也相同吗? - Shiplu Mokaddim
@Shiplu 嗯,不应该通过 URI 传递信息,因为它只会执行一次。在这种情况下,我们假设是“是”。 - Christian
22
请问投票关闭的人能解释一下吗?为什么我的问题不够具有建设性呢? - Christian
3个回答

94
有几个原因可能会导致你这样做,但它们可能并不常见(至少目前还不常见):
  • 您正在发送/接收加密和未加密数据(例如,一些数据庞大但不敏感)。
  • 您既有流数据又有延迟敏感的数据:想象一下一个交互式游戏,它偶尔在游戏中播放流媒体视频。 您不希望大型媒体流延迟接收延迟敏感的普通游戏消息。
  • 您既有文本数据(例如JSON控制消息),又有二进制数据(类型化数组或Blob),而且不想麻烦地添加自己的协议层来区分,因为WebSockets已经为您完成了此操作。
  • 您支持多个WebSocket子协议(URI之后的可选设置),而网页希望访问多个子协议(每个WebSocket连接仅限于单个子协议)。
  • 您有几个不同的WebSocket服务坐落在同一个Web服务器和端口后面。 客户端每个连接选择的方式可能取决于URI路径、URI方案(ws或wss)、子协议,甚至可能是客户端向服务器发送的第一条消息。
我相信还有其他原因,但这是我想到的所有内容。

13

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

假设您通过REST API获取了一组元素,如下:

http://myserver/api/some-elements

您可以使用类似于以下的套接字 URL 订阅单个元素的更新:

ws://myserver/api/some-elements/42/updates
当然,有人可能会争辩说这对于复杂的页面不可行。然而,对于小而简单的应用程序来说,这可能会使您的生活变得更轻松。

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

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


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