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

标签 php websocket phpwebsocket

我正在构建一个服务器,在尝试实现 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 对象,它可以像 >GuzzleHttpPSR7 Message目的。每次从该 Connection 对象接收到消息时,耦合的 HTTP 对象都可以访问以从初始 HTTP 请求中查找相关的请求行 .

关于php - 如何理解客户端在服务器中向哪个路由发送了 websocket 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070318/

相关文章:

php - "Missing Service"在symfony中声明新的Topic时

php - 与 2 个不同的表通信 (MySQL)

php - 如何创建 select 语句 PDO 并以 $row ['field' 结束]

javascript - 客户端等待 websocket 的最佳方式?

php - WebSocket 中服务器重启时客户端重新连接

php - WebSocket 打开握手超时 php Ratxet websocket

php - 如何使用 mysql EXISTS 返回 bool 值

php - glob() — 按名称排序

websocket - Phoenix : Only allow subscription to one sub topic on a channel at a time

java - 如何创建 Websocket Java SE 客户端?