我正在编写一个简单的多人浏览器游戏,它使用WebSockets在客户端和服务器之间发送信息。
当我最初设计协议时,我决定每个邮件头都包含一个用户ID(一个随机生成的UUID)。如果连接被删除,客户端将尝试重新连接,服务器将能够通过用户ID识别客户端。
我只使用无连接UDP协议通过网络发送数据。我意识到WebSocket构建在TCP之上,这意味着套接字更像是一个数据流,而不是可能会或可能不会到达目的地的单个数据包。
我开始怀疑跟踪消息中的用户ID。由于TCP本质上是基于连接的,我是否需要跟踪用户ID?跟踪用户ID实际上有什么好处吗?如果连接断开,服务器和客户端是否会以静默方式重新连接?我在实施游戏方面做得还不够。我应该只是放弃用户身份的想法吗?
答案 0 :(得分:1)
在每条消息中加上一个唯一的ID似乎有点矫枉过正。只要他们保持连接,您的websocket服务器就应该跟踪您的连接。但是如果客户端断开连接以保持连续性,您将需要用户ID,因此我只会在客户端第一次连接时将user-id发送给客户端一次。然后,如果必须重新连接,客户端可以将其发回,并且您的游戏可以从停止的地方恢复。
当然,在websocket服务器上使用会话提供程序也可以解决这个问题......
答案 1 :(得分:0)
TCP连接是有状态连接 - 数据包从源发送到目的地,并且源从目的地接收确认包(双向 - 任一方可以是源或目的地) - 这由网络处理堆叠,对你来说是不可见的。
然而,重新连接不是自动的,而是需要您(最有可能在客户端)进行干预以重新连接。
如果您仅通过IP&然后,大多数人通过一些不同的NAT系统链使用互联网,其中互联网可见的一个IP隐藏了多个未知数量的用户和网络。 在这些情况下,我认为继续通过您生成的特定ID来识别您的客户端是有意义的,而不仅仅是通过IP&港口。 IP和端口本身并不保证是唯一的,因为可以删除该连接,然后另一个用户可以声明相同的未使用的源端口。
这一切也是我的理论猜测 - 我对你的建议是开始迭代设计并看看它有效。 :)在你开始之前,没有必要尝试设计并完美地预测一切。