客户端在服务器重新加载时同时重新连接。需要分开他们的连接来为每个人分配正确的玩家号码

Clients reconnect at the same time on server reload. Need to separate their connections to assign the correct player numbers to each

//------------背景故事--------//

所以我正在和我的朋友一起玩乒乓球游戏。我们构建游戏是为了在客户端工作,但在学习了一些后端之后,我们花了一个周末将其转换为 运行 服务器端,并将对象数据发送到客户端以在客户端绘制。

它目前的结构是接收客户对 "player" 分配的请求。当分配了 2 个玩家时,游戏将开始(服务器端),然后开始向客户端发送对象数据。

用户第一次连接时一切正常,但问题来了。当我在服务器端进行更改时,服务器会重置(使用 nodemon 但这不相关)。 当服务器重置时,两个客户端立即尝试重新连接,当他们重新连接时,他们都被指定为玩家 1,因此游戏会锁定,直到他们刷新页面。

代码用于在运行中推送服务器更改,并在短暂暂停后(重新连接期间)客户端将继续显示新更改。这对我们进行测试时非常有用。现在我必须重置服务器(通过 nodemon 自动执行)然后手动刷新每个客户端。

//--------问题--------//

我的问题是如何让客户端重新连接而不被分配为玩家 1(更重要的是让服务器只将玩家识别为 1,因此不重新初始化游戏)?

我曾尝试对玩家分配进行延迟 (setTimeout),但很快意识到这是徒劳的。在同一时间范围内重新连接期间,两个客户端都会遇到任何延迟,因此它们是立即重新连接还是在将来的某个延迟时间重新连接都没有区别。

下面是相关分支文件的链接:

ReadMe:这是我写的一篇文章,它规定了服务器和客户端之间的步骤和交互。这与代码的结构方式相同

App.js:客户端/服务器之间进行初始交互的服务器文件

ServerMain.js:这是主服务器文件。它在 app.js 中用作 'Main'。游戏 运行 / 从此文件

发出

ClientMain.js:这是服务于每个已连接客户端的主要客户端文件。包含与服务器的所有交互

写这篇文章的行为让我尝试了一些东西。如果您在 app.js 和 clientmain.js 中注意到 requestPlayer 和 assignPlayer(发出/侦听器)之间存在交互。这些被设置为监听一次(使用 socket.once 方法)。因此,服务器 .once 正在重置(在服务器重置时),但客户端 .once 不会重置,除非页面被刷新。最后我认为 requestPlayer 交互甚至不是必需的。我删除了它,效果很好。