如何理解客户端在服务器中向哪个路由发送了 websocket 消息?

How to understand, for which route a websocket message was sent by the client in a server?

我正在构建一个服务器,在尝试实现 websocket 协议时,我 运行 遇到了一些问题。

如问题标题所述,假设我定义了两条路由(/ws1/ws2),它们公开了多个 websocket 连接。

并且在握手的情况下,我可以成功地了解发送握手请求的路由。

手头的主要问题是,当客户端发送后续的 websocket 消息时,服务器将如何理解 websocket 消息发送到哪个端点。

看完后:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers我了解到消息中没有表示路由的字段。

以防万一:我在 PHP 中这样做。

握手完成后路由不会改变。这个想法是 WebSocket 维护一个全状态连接,但该连接首先通过 HTTP 协商。这是通过向 URI 发送一个普通的 HTTP 请求来完成的,然后端点负责在成功协商后维护连接。

因此,在协商 WebSocket 连接后,如果您希望后续使用它,您有责任跟踪初始 HTTP 请求中的信息。

如果您查看 WebSocket 服务器的一些当前 PHP 实现是如何做到的,例如 Ratchet PHP, you'll see that the thing which handles the WebSocket requests receives a GuzzleHttp object,在成功协商连接后,在 onOpen 回调处理程序中。这包含与客户端连接对象相关的所有原始 HTTP 请求信息,因此您可以在整个过程中继续使用它。

所以本质上,一个 Connection 对象包含所有关于 sateful TCP 套接字本身的信息,再加上 HTTP 对象,它可以像 GuzzleHttpPSR7 Message 对象。每次从 Connection 对象接收到消息时,耦合的 HTTP 对象都可以访问以从初始 HTTP 请求中查找相关的 请求行

使用升级连接的 HTTP GET 请求建立 WebSocket 连接。您可以根据 PHP 中的资源 ID 识别客户端,方法是使用 (int) $resource.

将资源转换为整数

TCP连接一般由源IP/源端口/目的IP/目的端口四重来标识。

您必须将 URI/端点信息保存在数组或类似数据结构中,并使用客户端 ID 作为索引。然后您可以在收到新消息时查找端点。