在我的多人游戏中,我正在研究服务器-客户端通信的结构。
我得出的结论是,UDP是最好的选择,因为它的使用方式“射击和遗忘”,不会阻止应用程序,如果一个包丢失。我还将使用TCP发送可靠性需要数据包,如在登录过程和交换信息,如改变服务器,改变地图,更新等。它还将运行一个基于IRC的聊天。(所有命令实际上都是IRC风格的自定义消息)。
我想知道在服务器和客户端之间发送交互消息(移动、咒语、对象、动作等)的最佳方式是什么。
阅读一些文档,我来到了MulticastSocket。
我的问题是:
最好是向为每个播放器启动线程的所有客户端发送一个连续的信息流(就像我在TCP通信中所做的那样),其中每个DatagramSockets将侦听一个队列,将每个新消息发送给其客户端。这将意味着所有的地图和所有的移动(假设有50个玩家在地图上)将发送给所有的玩家,每个包必须更大,以包含所有这些信息。或者最好为每个映射使用一个线程,只有当某个玩家在该特定地图中时,使用多播通信,只向该地图中的播放器发送消息,并使用MulticastSocket监听。
我读过关于使用多播的防火墙或路由器的问题,但我不知道这些问题可能是什么(与正常的UDP不同)。
任何没有配置问题的人都应该使用该应用程序。
发布于 2013-08-26 17:04:08
查看上面的场景,您需要确定应用程序是否绝对需要TCP连接,因为TCP连接需要每个TCP连接一个线程,没有例外(除非使用nio)。
现在,要针对程序的UDP部分,您有两个基本选择:
( a)您为所有玩家生成一个用于接收数据包的线程。
在这种情况下,所有参与者都会将数据报数据包发送到单个接收器,然后由接收方决定如何处理数据。可以将此数据发送到各个队列,以供其他线程处理。数据可以使用单个线程或多个线程(每个播放器)发送回所有播放机。
的优点:
缺点:
( b)每个播放器生成一个线程,并在每个播放器的另一个端口上侦听。
在这种情况下,所有参与者都会获得自己的处理程序线程,这些线程可以直接处理数据,也可以将数据发送到中央处理队列。通过这样做,可以并行地处理数据,从而可以以更高的资源利用率加快处理速度。同步也需要特别注意,可能需要使用atomics和可重入的读/写锁。写回套接字通常应该发生在另一个“每个播放器线程”。
的优点:
缺点:
在任何一种情况下,通过使用TCP,每个播放器至少需要一个线程。问题是,您是否愿意使用更多的资源来从服务器获得更顺畅、更快的响应。
https://stackoverflow.com/questions/18430231
复制相似问题