我正在构建一个服务器,在尝试实现 websocket 协议(protocol)时遇到了一些问题。
如问题标题所述,假设我定义了两条路由(/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 ,你会看到处理 WebSocket requests 的东西收到 GuzzleHttp object , 成功协商连接后,在 onOpen
回调处理程序中。这包含与客户端连接对象相关联的所有原始 HTTP 请求信息,因此您可以在整个过程中继续使用它。
所以本质上,Connection
对象包含所有关于 sateful TCP 套接字本身的信息,再加上 HTTP
对象,它可以像 >GuzzleHttp
或 PSR7 Message
目的。每次从该 Connection
对象接收到消息时,耦合的 HTTP
对象都可以访问以从初始 HTTP 请求中查找相关的请求行 .
关于php - 如何理解客户端在服务器中向哪个路由发送了 websocket 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070318/