java - 用于多人游戏的 MulticastSocket

标签 java multicast mmo multicastsocket

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

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

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

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

我的问题是:

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

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

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

最佳答案

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

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

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

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

优点:

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

缺点:

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

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

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

优点:

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

缺点:

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

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

关于java - 用于多人游戏的 MulticastSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18430231/

相关文章:

java - 尽可能快地将数组中的重叠矩形分组

android - 多播 - 没有这样的设备

c++ - 从不同端口接收组播

java - 无法在 Java 和 PHP 之间交换使用 AES-256 加密的数据

java - 尝试向我的 Hashmap 添加一个实例方法,该方法采用两个代表键和值的参数

c++ - UDP 多播不适用于 linux Debian

c# - 返回一个字符串数组?

C++ 成员变量变化监听器(100+类)

java - 旧 Java 项目兼容性