如何理解客户端在服务器端发送websocket消息的路由



我正在构建一个服务器,在尝试实现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,你会看到处理WebSocket请求的东西接收一个GuzzleHttp对象,在连接成功协商后,在onOpen回调处理程序中。它包含与客户端连接对象绑定的所有原始HTTP请求信息,因此您可以始终继续使用它。

所以本质上,Connection对象保存了关于安全TCP套接字本身的所有信息,加上HTTP对象,可以实现为GuzzleHttp或PSR7 Message对象。每次从该Connection对象接收消息时,可以访问耦合的HTTP对象,以查找初始HTTP请求中相关的请求行

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

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

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

相关内容

  • 没有找到相关文章