2013-08-25 163 views
3

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

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

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

阅读一些我来到MulticastSocket的文档。

我的问题是:

最好是连续的信息流发送给所有的客户端启动一个线程为每个玩家(我在TCP通讯办),其中每个DatagramSockets会听到一个队列发送的每个新消息给它的客户。这意味着所有的地图和所有的移动(假设地图上可能有50名玩家)将被发送给所有玩家,并且每个数据包必须更大才能包含所有这些信息。 或者更好地为每个地图使用一个线程,只有当某个玩家在特定地图内时使用多播通信,才会向该地图内的玩家发送消息,并使用MulticastSocket侦听。

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

应用程序应该由配置问题少的人使用。

+0

某些路由器被配置为阻止多播数据包,因为它们可能会导致网络上的不期望的业务。试想一下,恶意用户通过网络发送虚拟组播数据包,并使用通配符地址。数据包的范围也很重要。与较小的网络(如专用LAN)相比,如果数据包位于较大的网络(例如,互联网)上,数据包就不太可能到达。至于这是否可以避免(仍然使用多播),我不能给你一个很好的答案。 – initramfs

+0

我不与组播贴,其实这个问题是关于什么是创建通信服务器客户UDP的最佳方式,我可以没有问题更改。 也许我可以创建一个模拟多播套接字的类,一次向多个客户端发送相同的数据包?但我不知道它是否会足够快。感谢您的评论 – Gianmarco

+0

我更关心带宽而非速度。与传统的每个连接需要数据包的网络结构相比,多播数据包只发送一次。如果有50个玩家在服务器中,与单个连接的用户相比,您必须考虑50倍的带宽。我只是提供了关于多播包的见解。 – initramfs

回答

2

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

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

a)你产卵一个线程接收数据报包的所有玩家。

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

优点:

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

缺点:

  • 可能的网络缓慢(由于分组朝着同一个插座去的群众)丢包(再次
  • 较高的机会由于分组的群众要去相同的插座)
  • 串行处理
  • 断开事件很混乱,很难处理

b)您为每个玩家产生一个线程,并在每个玩家的不同端口上收听。

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

优点:

  • 并行处理
  • 模块化(有每个玩家所有的处理代码在一个线程中,玩家上线启动连接)
  • 断开更容易处理和不与其他玩家产生问题。
  • 快速网络响应,并发包的接收。

缺点:

  • 高资源使用(很多更多的对象)
  • 高同步开销
  • 高线程数(可多达2〜4倍的线程来的球员比)

在任何一种情况下,通过使用TCP,您将需要需要每个玩家至少有一个线程。问题是你是否愿意使用更多的资源来从服务器获得更平滑,更快速的响应。

+0

接受。谢谢 – Gianmarco