websocket 中的 URI 路径组件是做什么用的?

What's the URI path component in websocket used for?

客户端发起 websocket 握手,可以指定自定义 URI 路径使用。

    GET **/chat** HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Origin: http://example.com
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13

websocket uri 采用以下形式: ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]

如果我部署了一个侦听 ws://localhost:8080/ 的 websocket 服务器,并且客户端使用以下 uri ws://localhost:8080/chat 连接到那里,有什么区别?为什么甚至需要路径组件?它只是为了负载平衡吗?还是这些“端点”是孤立的?

RFC 中的以下语句让我很困惑:

GET方法[RFC2616]的“Request-URI”用于标识 WebSocket 连接的端点,两者都允许多个域 从一个 IP 地址提供服务并允许多个 WebSocket 由单个服务器提供服务的端点。 (HERE)

如果您的 websocket 服务始终以相同方式对待每个连接,则无需在 URI 中要求路径字符串或查询字符串。 (好吧,从技术上讲,您必须有一个路径字符串,但每次都可以只是单个字符“/”。)

但是,如果您的 websocket 服务希望能够为不同的客户端提供不同的内容,那么在 URI 中使用路径字符串可以方便地让客户端表明他们感兴趣的内容类型. 也许您的聊天服务为几个不同的主题提供聊天室,在这种情况下,您可能决定让客户端使用路径字符串来指示所需的主题。像 ws://localhost:8080/sportws://localhost:8080/politicsws://localhost:8080/cooking 之类的东西,或者你可以更进一步,得到 ws://localhost:8080/sport/footballws://localhost:8080/sport/golfws://localhost:8080/sport/tennis,等等。

The "Request-URI" of the GET method [RFC2616] is used to identify the endpoint of the WebSocket connection, both to allow multiple domains to be served from one IP address ...

这只是普通的虚拟主机。基于 URI 的 host 部分,单个 IP 地址的网络服务器 运行 可以支持多个网站。

... and to allow multiple WebSocket endpoints to be served by a single server.

我给出的每个路径示例都标识了一个不同的、独立的端点,所有端点都由您的一个 websocket 服务器提供服务。

在这个特定的例子中,websocket 端点是某种聊天室,但更普遍的是,websocket 端点与某种数据馈送相关联,通常是单向馈送(websocket 可能提供当前库存流由 URI 查询字符串指定的某些股票集合的价格),但可能是双向提要,也可能是交互式双向提要(例如您的聊天室)。