【问题标题】:How to understand, for which route a websocket message was sent by the client in a server?如何理解,客户端在服务器中为哪条路由发送了 websocket 消息?
【发布时间】:2016-12-28 11:03:50
【问题描述】:

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

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

在握手的情况下,我可以成功了解握手请求是针对哪个路由发送的。

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

阅读此内容后:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers 我了解消息中没有表示路线的此类字段。

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

【问题讨论】:

  • 一个 websocket 就像一个管道。一旦在 2 个点之间成功握手,路由就建立了。请求始终会返回到发出请求的位置。

标签: php websocket phpwebsocket


【解决方案1】:

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

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

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

所以本质上,Connection 对象包含有关饱和 TCP 套接字本身的所有信息,再加上 HTTP 对象,它可以实现为 GuzzleHttpPSR7 Message 对象之类的东西。每次从该Connection 对象接收到消息时,可以访问耦合的HTTP 对象以从初始HTTP 请求中查找相关的请求行

【讨论】:

    【解决方案2】:

    使用升级连接的 HTTP GET 请求建立 WebSocket 连接。您可以通过使用 (int) $resource 将资源转换为整数来根据 PHP 中的资源 ID 识别客户端。

    TCP 连接一般由源 IP/源端口/目标 IP/目标端口四元组标识。

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

    【讨论】:

      猜你喜欢
      • 2022-07-15
      • 2018-10-25
      • 2017-09-15
      • 2017-11-28
      • 2014-10-02
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多