实时游戏服务器最有效的Java实现是什么?

实时游戏服务器最有效的Java实现是什么?,java,tcp,udp,real-time,Java,Tcp,Udp,Real Time,我计划构建一个Java服务器,用于处理客户端之间的实时游戏通信。最好的Java实现类型是什么,能够高效地(希望能够)准确地在客户机和服务器之间进行高速通信(比如每秒5-15个数据包)?我知道有很多类型的Java网络API(即ObjectInputStream和ObjectOutputStream、DatagramPacket、KyroNet等),但我不确定在这种情况下最有效和/或最常用的实现是什么。我假设大多数实时游戏都使用UDP通信方法,但我理解随之而来的可靠性问题。是否存在具有某种形式的流控

我计划构建一个Java服务器,用于处理客户端之间的实时游戏通信。最好的Java实现类型是什么,能够高效地(希望能够)准确地在客户机和服务器之间进行高速通信(比如每秒5-15个数据包)?我知道有很多类型的Java网络API(即ObjectInputStream和ObjectOutputStream、DatagramPacket、KyroNet等),但我不确定在这种情况下最有效和/或最常用的实现是什么。我假设大多数实时游戏都使用UDP通信方法,但我理解随之而来的可靠性问题。是否存在具有某种形式的流控制的UDP实现?无论如何,先谢谢你

需要考虑的几件事:

  • Java NIO非常好,可以处理您所期望的吞吐量/延迟。不要使用任何旧的网络/序列化框架和API
  • 延迟非常重要。您基本上希望NIO上有一个最小的层,它允许您以最小的开销发送非常快速、小、独立的消息
  • 根据游戏的不同,您可能需要TCP或UDP或两者兼有。对于重要的消息使用TCP,对于游戏进行不严格需要的消息使用UDP,或者对于将来的更新(例如FPS中的位置更新)将包含的消息使用UDP
  • 有些人通过UDP实现自己的类似TCP的消息传递协议,用于实时游戏。这可能比它的价值更麻烦,但如果您确实需要优化特定类型的通信,请注意它是一个选项
  • 对于实时游戏,您几乎总是执行自定义序列化(例如,仅发送增量而不是对象位置的完全更新),因此请确保您的框架允许这样做
鉴于此,我推荐以下方法之一

  • -lightwieght,可定制,专为此类目的设计
  • -稍微面向企业,但功能强大、健壮且可扩展
  • 基于NIO推出您自己的应用程序-如果您想要真正细粒度的控制,这很棘手,但也有可能。我以前做过,但现在回想起来,我可能应该选择克鲁内特或内蒂

祝你好运

立即忘记ObjectOutputStream和ObjectInputStream。这些是旧标准java序列化的标准输出-输入机制,该机制速度慢,会生成膨胀对象。以下是一些资源:


每秒15个数据包不是很快。每秒10万个数据包。我在读一篇Valve的文章,关于他们如何制作源服务器,他们说他们的平均每秒20-30个数据包。因为我实际上正在构建一个小得多的游戏,所以我不需要那么多。我认为每秒100000个数据包会占用相当多的带宽,你不认为吗?丢失一个数据包有什么意义吗?如果没有,那么我将使用一个非常简单的校验和来使用UDP(DatagramPacket),然后扔掉坏包。不过,用TCP建立连接本身可能是个好主意。当然,丢失数据包总是不好的,并且可能需要客户端对此类事件进行补偿,但是服务器和客户端同时进行TCP和UDP连接不是很少见吗?也就是说,TCP连接有助于保持移动更快的UDP连接的完整性?您自己的!以上这些都不是有效的。UDP可能很酷,但它会随着更多玩家的交互而开始衰落。每个客户20-30英镑听起来不错。我会选择自定义构建基于TCP NIO的。顺便说一句,UDP+TCP之间的同步很难破解,它可能是服务器“黑客”问题的严重来源。在我看来,定制NIO并不是那么难,但我想这个问题本来就不会被问到。知道何时使用直接缓冲区也需要经验,我的目标是每个客户端的直接缓冲区和套接字snd缓冲区大小的容量。还有一个问题,使用较新的NIOAPI的主要优势是什么。当然,它更新了,所以可能更好,但是与使用传统套接字和服务器套接字相比,它有什么区别呢?NIO的主要优点是它利用了操作系统中较低级别的结构,因此您可以以较低的开销进行数据传输,使用选择器等处理事件驱动的异步响应。fast-serialization+fast cast+netty是群集高性能应用程序的理想组合