我正在构建一个服务器,在尝试实现websocket协议时,我遇到了一些问题。
正如问题标题所描述的那样,假设我已经定义了两个路由(/ws1
,/ws2
),它们公开了多个websocket连接。
在握手的情况下,我成功地了解了握手请求的发送路径。
手头的主要问题是,当客户端发送后续的websocket消息时,服务器如何理解websocket消息发送到哪个端点。
阅读完本文后:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers我知道消息中没有表示路线的字段。
以防万一:我在PHP中这样做。
答案 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作为索引。然后,您可以在收到新消息时查找端点。