什么是 WebSocket 子协议?

Deo*_*ich 15 javascript websocket node.js

我一直在尝试在nodejs中从头开始实现WebSocket协议,这样做我有一个问题,但一直没有被解决。Websocket 的子协议到底是什么?WebSocket 构造函数的第二个参数是指定“子协议”的位置 -

let socket = new WebSocket("ws://localhost:3000",["http",...]);
Run Code Online (Sandbox Code Playgroud)

谁能告诉我他们的目的是什么?

dec*_*eze 10

Websockets 只是定义了一种交换任意消息的机制。这些消息的含义、客户端在任何特定时间点可以期待什么类型的消息或允许他们发送什么消息完全取决于实施应用程序。因此,服务器和客户端之间需要就这些事情达成一致。你可能会说\xe2\x80\xa6 你需要一个协议规范。子协议参数只是让客户端正式交换此信息。您可以为您想要的任何协议起任何名称。服务器可以简单地检查客户端在握手期间是否遵守该协议。您还可以使用它向服务器请求不同种类的协议,或者使用它进行版本控制(例如,当您引入my-protocol-v2,但仍然需要支持客户端仅理解my-protocol-v1)。

\n

  • 为了更具体一点,您的服务器可能支持发送以 JSON 或 XML 编码的消息。客户端可以告诉服务器它支持哪些方法,然后服务器可以选择一种方法并同意该特定的子协议。— 或者,您可以使用它来表示客户端期望获取和/或发送什么类型的消息。或者您能想到的任何其他自定义用途,可以帮助客户端和服务器协商一组特定的通信规则。 (2认同)

Lia*_*iam 6

MDN上对此有解释

将子协议视为自定义 XML 模式或文档类型声明。您仍在使用 XML 及其语法,但您还受到您同意的结构的限制。WebSocket 子协议就是这样。他们不引入任何花哨的东西,他们只是建立结构。就像文档类型或模式一样,双方必须就子协议达成一致;与文档类型或模式不同,子协议是在服务器上实现的,客户端不能从外部引用。

子协议在规范的 1.9、4.2、11.3.4 和 11.5 节中进行了解释。

客户端必须请求特定的子协议。为此,它将发送如下内容作为原始握手的一部分:

http GET /chat HTTP/1.1 ... Sec-WebSocket-Protocol: soap, wamp

或者,等效地:

... Sec-WebSocket-Protocol: soap Sec-WebSocket-Protocol: wamp

现在服务器必须选择客户端建议且支持的协议之一。如果有多个,则发送客户端发送的第一个。想象一下我们的服务器可以同时使用soap和wamp。然后,在响应握手中,它发送:

Sec-WebSocket-Protocol: soap

服务器无法发送多个 Sec-Websocket-Protocol 标头。如果服务器不想使用任何子协议,则不应发送任何 Sec-WebSocket-Protocol 标头。发送空白标头是不正确的。如果客户端没有得到它想要的子协议,它可能会关闭连接。

如果您希望您的服务器遵守某些子协议,那么您自然需要在服务器上添加额外的代码。假设我们正在使用子协议 json。在此子协议中,所有数据均以 JSON 形式传递。如果客户端请求此协议并且服务器想要使用它,则服务器需要有一个 JSON 解析器。实际上,这将是库的一部分,但服务器需要传递数据。