WebSocket:在每条消息中发送用户id

WebSocket:在每条消息中发送用户id,websocket,network-protocols,userid,Websocket,Network Protocols,Userid,我正在编写一个简单的多人浏览器游戏,它使用WebSocket在客户端和服务器之间发送信息 最初设计协议时,我决定每个消息头都包含一个用户id(随机生成的UUID)。如果连接断开,客户端将尝试重新连接,服务器将能够通过用户id识别客户端 我只使用了无连接UDP协议通过网络发送数据。我意识到WebSocket是建立在TCP之上的,这意味着套接字的行为更像一个数据流,而不是可能到达或不到达目的地的单个数据包 我开始怀疑如何在消息中跟踪用户ID。由于TCP本质上是基于连接的,我需要跟踪用户id吗?跟踪用

我正在编写一个简单的多人浏览器游戏,它使用WebSocket在客户端和服务器之间发送信息

最初设计协议时,我决定每个消息头都包含一个用户id(随机生成的UUID)。如果连接断开,客户端将尝试重新连接,服务器将能够通过用户id识别客户端

我只使用了无连接UDP协议通过网络发送数据。我意识到WebSocket是建立在TCP之上的,这意味着套接字的行为更像一个数据流,而不是可能到达或不到达目的地的单个数据包


我开始怀疑如何在消息中跟踪用户ID。由于TCP本质上是基于连接的,我需要跟踪用户id吗?跟踪用户id实际上有什么好处吗?如果连接断开,服务器和客户端是否会以静默方式重新连接?我在实现这个游戏方面还没走多远。我应该放弃用户id的想法吗?

TCP连接是有状态连接-数据包从源发送到目标,确认包由源从目标接收(双向-任何一方都可以是源或目标)-这由网络堆栈处理,并且对您不可见

然而,重新连接不是自动的,需要您的干预(很可能是在客户端)才能重新连接

如果仅通过IP和端口跟踪客户端,则可能不需要用户id,但是,大多数人通过各种NAT系统链使用internet,其中一个对internet可见的IP隐藏了多个未知数量的用户和网络。 在这些情况下,我认为继续通过您生成的特定ID而不仅仅是IP和端口来识别您的客户是有意义的。IP和端口本身并不保证是唯一的,因为该连接可能会断开,然后另一个用户可能会声明相同的未使用源端口


所有这些都是我的理论猜测——我给你的建议是开始迭代设计,看看什么是有效的。:)在你开始之前,根本不需要尝试、设计和预测每一件事。在每一条消息中都添加一个唯一的id似乎有些过分了。只要保持连接,websocket服务器就应该为您跟踪连接。但是如果客户端断开连接以保持连续性,您将需要用户id,因此我只会在客户端第一次连接时向客户端发送一次用户id。然后,如果必须重新连接,客户端可以将其发送回,并且您的游戏可以在停止的位置继续


当然,在websocket服务器上使用会话提供程序也可以解决这个问题……

谢谢您的回复。您能否详细说明会话状态提供程序是什么?一个快速的谷歌展示了它是一个.NET的东西,这是linux服务器的问题。会话绝对不限于.NET。您使用的是哪种websocket服务器?很多都内置了这种功能。我正在使用tornado web框架。再次感谢你的帮助。我一定会对这件事做更多的研究。尽管如此,我认为如何使用会话提供者超出了这个问题的范围,可能不应该在一个如此评论的帖子中回答。我将把答案标记为已接受。