首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多人游戏的MulticastSocket

多人游戏的MulticastSocket
EN

Stack Overflow用户
提问于 2013-08-25 14:50:24
回答 1查看 2.1K关注 0票数 3

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

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

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

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

我的问题是:

最好是向为每个播放器启动线程的所有客户端发送一个连续的信息流(就像我在TCP通信中所做的那样),其中每个DatagramSockets将侦听一个队列,将每个新消息发送给其客户端。这将意味着所有的地图和所有的移动(假设有50个玩家在地图上)将发送给所有的玩家,每个包必须更大,以包含所有这些信息。或者最好为每个映射使用一个线程,只有当某个玩家在该特定地图中时,使用多播通信,只向该地图中的播放器发送消息,并使用MulticastSocket监听。

我读过关于使用多播的防火墙或路由器的问题,但我不知道这些问题可能是什么(与正常的UDP不同)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-26 17:04:08

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

现在,要针对程序的UDP部分,您有两个基本选择:

( a)您为所有玩家生成一个用于接收数据包的线程。

在这种情况下,所有参与者都会将数据报数据包发送到单个接收器,然后由接收方决定如何处理数据。可以将此数据发送到各个队列,以供其他线程处理。数据可以使用单个线程或多个线程(每个播放器)发送回所有播放机。

的优点:

  • 资源利用率低

  • 低程序(同步)开销。

缺点:

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

( b)每个播放器生成一个线程,并在每个播放器的另一个端口上侦听。

在这种情况下,所有参与者都会获得自己的处理程序线程,这些线程可以直接处理数据,也可以将数据发送到中央处理队列。通过这样做,可以并行地处理数据,从而可以以更高的资源利用率加快处理速度。同步也需要特别注意,可能需要使用atomics和可重入的读/写锁。写回套接字通常应该发生在另一个“每个播放器线程”。

的优点:

  • 并行处理
  • 模块化(将每个播放器的所有处理代码放在一个线程中,在player联接上启动线程)
  • 断开连接更容易处理,不会引起其他玩家的问题。
  • 快速网络响应,并发数据包接收。

缺点:

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18430231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档