如何在服务器端理解客户端通过WebSocket发送的消息是针对哪条路由的?

4
我正在构建一个服务器,在尝试实现websocket协议时遇到了一些问题。
正如问题标题所描述的那样,假设我定义了两个路由(/ws1/ws2),它们公开多个websocket连接。
在握手过程中,我成功地理解了握手请求发送到哪个路由的情况。
手头的主要问题是,当客户端发送后续websocket消息时,服务器如何理解该websocket消息是发送到哪个端点的。
阅读此文档:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers 后,我了解到消息中没有表示路由的字段。
提醒一下:我是用PHP来完成这个任务的。

3
WebSocket 就像一条管道。一旦两个点之间成功握手,路由就建立了。请求始终回复到发出请求的那个点。 - Jay Blanchard
2个回答

3
完成握手后路由永远不会改变。WebSocket维护有状态连接的想法最初是通过HTTP协商完成的。这是通过向URI发送普通HTTP请求来完成的,端点负责在成功协商连接后维护连接。
因此,在WebSocket连接被协商成功后,如果您希望进一步使用它,需要跟踪初始HTTP请求中的信息。
例如,如果您查看一些当前PHP WebSocket服务器实现的方式(例如 Ratchet PHP),您会发现处理 WebSocket请求 的东西将在 onOpen 回调处理程序中接收到一个 GuzzleHttp对象。其中包含与客户端连接对象相关联的所有原始HTTP请求信息,因此您可以在整个过程中继续使用它。
因此,Connection对象基本上保存有关有状态TCP套接字本身的所有信息,以及HTTP对象,该对象可以实现为类似于GuzzleHttpPSR7 Message对象。每次从该Connection对象接收到消息时,可以访问耦合的HTTP对象以查找最初HTTP请求中的相关请求行

1
使用HTTP GET请求建立WebSocket连接,升级连接。您可以通过将资源强制转换为整数来使用PHP中的资源ID来识别客户端,例如(int) $resource
通常情况下,TCP连接是根据源IP /源端口/目标IP /目标端口四元组进行识别的。
您需要将URI /端点信息保存在数组或类似的数据结构中,并使用客户端ID作为索引。然后,在接收到新消息时,您可以查找端点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接