【问题标题】:Socket connections managing in Java在 Java 中管理套接字连接
【发布时间】:2025-11-23 11:45:02
【问题描述】:

我正在用 java 制作一个简单的多人游戏。 关键是,我需要服务器应用程序能够从多个客户端应用程序接收数据。 例子: 我连接了 2 个客户端应用程序。服务器正在等待来自任何客户端的数据。当使用第一个客户端应用移动游戏角色时,必须将具有新坐标的数据发送到服务器应用,然后必须将角色的新位置广播给所有客户端。我读过这可以通过为每个客户端连接创建一个新线程来完成,但是有没有更好的方法来做到这一点?如果我们启动例如 100 个线程,服务器不会崩溃吗?

感谢所有回复, 氰化物

【问题讨论】:

  • 在假设服务器会崩溃之前试一试。制作一个简单的服务器应用程序,它接受客户端并模拟 100 个客户端。
  • 100 个线程可能不是问题。但一般来说,每个客户端的线程不能很好地扩展,你最好使用某种形式的selector

标签: java multithreading sockets


【解决方案1】:

您应该使用套接字池来管理您的套接字。 一个快速的谷歌将我带到this 示例,但您可以找到更多。 如果您需要处理超过 100 个线程,这可能不再是一个简单的多人游戏,您应该将其用作第一个项目。

【讨论】:

    【解决方案2】:

    您永远不需要创建新线程来处理新的客户端连接。您可以根据需要创建,但根本不需要。

    请在下面找到您可以遵循的方法。

    有一个服务器: 1)一个线程接受新连接,创建会话并在现有游戏中添加新玩家。所以你可以说它是一个管理线程。

    2) 一个线程将只在套接字 fds 上使用 epoll/select。任何套接字上的任何读写都将在此线程上得到通知。

    3) 有 N 个(取决于许多因素,尤其是服务器的核心),比如说 5 个工作线程(线程池),它们的工作是在游戏会话的所有套接字上广播数据,除了发起请求的线程。

    因此,当您将在任何套接字上收到任何数据时,您会在线程 2(epoll 线程)上收到通知,然后您将要求其中一个工作线程将数据广播到所有相关的套接字

    要寻找的重要一点是您必须等待工作线程多少次才能将工作推送到工作线程上。这需要根据用例进行调整。

    只是为了添加更多内容:

    那么现在您将如何扩展此解决方案。这将取决于游戏会话的数量,您可以使用负载平衡器,它始终会在使用资源最少的机器上启动新游戏。

    【讨论】:

      【解决方案3】:

      如果您在 Linux 上执行此操作,则有限制配置以限制套接字连接 /proc/sys/net 的数量,该配置控制如何打开 mahy tcp/ip 套接字,并且只要您的套接字连接低于该数量,你应该没事的。

      【讨论】: