websocket的子协议(protocols)有哪些作用?

ZivSF
  • 522
new WebSocket(url [, protocols]);
protocols 可选
一个协议字符串或者一个包含协议字符串的数组。这些字符串用于指定子协议,这样单个服务器可以实现多个WebSocket子协议(例如,您可能希望一台服务器能够根据指定的协议(protocol)处理不同类型的交互)。如果不指定协议字符串,则假定为空字符串。

这个是DMN上的解释,我一直的大概理解是一个连接当多个用。但是想实际应用又不知从何开始,所以有几个问题:

  1. 子协议(protocols)能实现什么业务场景
  2. 如何应用

谢谢🙏

回复
阅读 4.2k
1 个回答

不是一个链接当多个用,而是支持多种类型的数据。

同一个服务器,既可以返回 JSON 数据、又可以返回图片数据、还可以返回 HTML/CSS/JS 等文本数据、甚至还可以返回视频数据。同一个浏览器,既可以给后端提交表单、又可以给后端提交 JSON。这些数据类型,前后端怎么区分它们呢?

在 HTTP 请求和响应标头里,有 AcceptAccpet-EncodingAccept-LanguageContent-TypeContent-EncodingContent-LanguageContent-LengthContent-Range 等等等等一系列的值,可以描述在浏览器和服务器之间传递的数据是啥。

比如浏览器给服务器发送一个 Content-Type: application/json,那服务器就知道了这是个 JSON 数据,就要按 JSON 的格式去解析;服务器给浏览器返回了一个 Content-Type: image/jpeg,浏览器就知道这是一个图片数据,就要按图片的格式去解析。

所以在 WebSocket 里,也有这么一个值可以表示传输的数据类型是啥,就是这个子协议了。其本质也是一个请求或响应标头。

不过上面说的两种 HTTP 的数据类型,都是 MIME,有个 RFC-6838 来规范它们。但 WebSocket 里就没有这种规范了,你得自己去定义。


这个值无论在 HTTP 中也好、在 WebSocket 中也罢,都是前后端之间的“约定”,得两端都得遵守才行。浏览器发给服务器的标明了自己是 application/json,但服务器压根不管,偏要按照 application/x-www-form-urlencoded 去解析,那就没办法了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏