3

我正在研究多人游戏中服务器-客户端通信的结构。

我得出的结论是 UDP 是最好的选择,因为它采用“一劳永逸”的使用方式,即使丢包也不会阻塞应用程序。我还将使用 TCP 发送需要可靠性的数据包,例如在登录过程和交换服务器更改、地图更改、更新等信息的过程中。它还将运行基于 IRC 的聊天。(所有命令实际上都是 IRC 样式的自定义消息)。

我想知道在服务器和客户端之间发送交互消息(移动、咒语、对象、动作等)的最佳方式是什么。

阅读了一些文档,我来到了 MulticastSocket。

我的问题是:

最好将连续的信息流发送到为每个播放器启动一个线程的所有客户端(就像我在 TCP 通信中所做的那样),其中每个 DatagramSockets 将侦听一个队列,将每个新消息发送到其客户端。这意味着所有地图和所有动作(假设地图上可能有 50 名玩家)将发送给所有玩家,并且每个数据包必须更大以包含所有这些信息。或者最好为每个地图使用一个线程,仅当某些玩家在该特定地图内时才处于活动状态,使用多播通信,仅向该地图内的玩家发送消息,并使用 MulticastSocket 进行侦听。

我阅读了有关使用多播的防火墙或路由器的问题,但我无法弄清楚这些问题可能是什么(不同于普通的 UDP)。

该应用程序应该由几乎没有配置问题的任何人使用。

4

1 回答 1

3

查看上面的场景,您需要确定您的应用程序是否绝对需要 TCP 连接,因为 TCP 连接每个 TCP 连接需要一个线程,没有例外(除非使用 nio)。

现在以程序的 UDP 部分为目标,您有两个基本选择:

a) 你生成一个线程来接收所有玩家的数据报包。

在这种情况下,所有玩家都将他们的数据报包发送到单个接收器,然后接收器决定如何处理数据。该数据可以被发送到各种队列以供其他线程处理。可以使用单个线程或多个线程(每个玩家)将数据发送回所有玩家。

优点:

  • 资源使用率低
  • 低程序(同步)开销。

缺点:

  • 可能的网络缓慢(由于大量数据包流向同一个套接字)
  • 丢包的可能性更高(同样是由于大量数据包进入同一个套接字)
  • 串行处理
  • 断开连接事件混乱且难以处理

b)您为每个播放器生成一个线程并在每个播放器上侦听不同的端口。

在这种情况下,所有玩家都有自己的处理线程,这些线程可以直接处理数据或将其发送到中央处理队列。通过这样做,可以并行处理数据,从而实现更快的处理速度和更高的资源使用率。同步也需要特别注意,可能需要使用原子和重入读/写锁。回写到套接字通常应该发生在另一个“每个玩家线程”上。

优点:

  • 并行处理
  • 模块化(将每个玩家的所有处理代码放在一个线程中,在玩家加入时启动线程)
  • 断开连接更容易处理,并且不会对其他玩家造成问题。
  • 快速的网络响应,并发数据包接收。

缺点:

  • 高资源使用率(更多对象)
  • 高同步开销
  • 高线程数(可能高达 2 ~ 4x 线程与玩家的比率)

在任何一种情况下,通过使用 TCP,您将需要每个播放器至少一个线程。问题是您是否愿意使用更多资源来获得服务器更顺畅、更快速的响应。

于 2013-08-26T17:04:08.900 回答