编写多人游戏服务器最合适的方法是什么?

时间:2015-02-02 22:29:37

标签: java multithreading sockets udp server

我目前正在为快节奏的多人游戏编写服务器,应该在UDP 中运行(由于处理数据包丢失的方式,我认为TCP不合适,在需要及时传送数据的应用程序中,请更正我如果TCP更有用)游戏不是大众多人游戏,而且应该主要由玩家自己托管,可能在本地专用服务器上。虽然我很确定客户端需要在NIO中,为避免游戏延迟出现网络问题,我还不知道如何编写服务器。以下是我考虑过的可能性列表:

  • 为每个玩家使用单独的线程,每个玩家都有一个绑定到每个
  • 的套接字
  • 使用一个插槽循环播放每个播放器
    • 做同样的事,但是用NIO
  • 使用一个套接字同时向所有客户端广播消息
  • 使用一个套接字接收,一个用于在单独的线程上发送

使用相对较少的客户端处理时间关键数据的最合适方法中的哪一种?(不超过16个)

2 个答案:

答案 0 :(得分:1)

对于16个客户来说,除非您的硬件糟透了,或者您做了一些令人难以置信的处理,否则无论你走到哪里,你都会表现得很好。这意味着您可以以任何方式编写它,使您更容易编写和维护。

关于你的选择的几句话:

  

为每个玩家使用单独的线程,每个玩家都有一个绑定到每个

的套接字

这种方法对于少量 TCP 套接字更有意义。如果你使用UDP,你只有一个套接字,所以没有必要。但是,如果您的游戏需要为每个客户端进行一些并行处理,那么每个客户端有一个线程是很有用的。

  

使用一个插槽循环播放每个播放器

这可能是最简单的选择,除非你的游戏需要非常特别。正如我之前所说,你应该做得很好。因此,如果它使编写代码更容易。避免使用premature optimizations

  

使用一个套接字进行接收,另一个用于单独发送   螺纹

除非你有充分的理由这样做,否则我会避免这个想法。它可能(不必要地)在网络方面使事情变得复杂,因为客户端将数据包发送到端口X,并从端口Y获得回复。NAT将是一个严重的问题。

  

使用一个套接字同时向所有客户端广播消息

首先,这只能在一个方向 - 从服务器到客户端。其次,由于路由器不转发广播数据包,因此只能inside a LAN。如果您对这两个限制都很好并且发现自己设计了一个系统,其中服务器将一些数据包发送给所有玩家(至少对于同一网络中的那些玩家),这可能不是一个坏主意。就性能而言,除非您发送大量数据包,否则您可能不会注意到向每个播放器发送单独的副本和发送广播之间的区别。

答案 1 :(得分:-2)

TCP具有更多开销,导致传输相同信息所需的带宽更高。然而,如果TCP没有到达,它确实具有重新发送的优点。如果使用UDP,请确保通过网络发送的消息不可用。例如,如果您将动作作为添加和更改发送,则它将与客户端快速失去同步。发送时,您需要覆盖值。

每个玩家需要一个线程来监听他们的输出,例如击键或动作,因为你必须等待每个线程上的数据,因此它会阻止玩家1直到他们做出动作和玩家2在玩家1出现之前,他们无法采取行动。

广播游戏状态可能有意义 - 但我没有像快节奏多人游戏这样或那些时间关键的经验