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

时间:2016-08-22 01:34:52

标签: php websocket phpwebsocket

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

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

在握手的情况下,我成功地了解了握手请求的发送路径。

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

阅读完本文后:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers我知道消息中没有表示路线的字段。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

所以基本上Connection对象包含有关sateful TCP套接字本身的所有信息,加上HTTP对象,可以像GuzzleHttp或{{一样实现3}}对象。每次从该Connection对象收到消息时,耦合的HTTP对象都可以从初始HTTP请求中查找相关的请求行

答案 1 :(得分:1)

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

TCP连接通常由源IP /源端口/目标IP /目标端口四倍标识。

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