Java可靠UDP

7
请推荐一个Java库,实现可靠的UDP。它将用于游戏服务器与客户端以及其他服务器之间的通信。

PS也许您可以建议更适合此任务(游戏服务器)的技术?但是这必须在Linux上运行。 编辑:这是一款动作类型的游戏,因此需要尽可能快地与服务器通信。 编辑2:我发现Enet被用于FPS游戏,但它是C++,如果我每秒调用它多次,会有什么开销吗?

你的应用程序是否受TCP开销的影响太大? - amit
2
据我所知,TCP是建立在IP之上而不是UDP。然而,UDP也是建立在IP之上的。 - Mike Kwan
推荐问题在这里不适合讨论。 - user207421
5个回答

4
以下是我所了解的实现类似可靠UDP的库/框架:
- 移动可靠UDP (MR-UDP) MR-UDP旨在为移动节点(MNs)之间提供基于UDP的可靠通信,尽可能减少开销。它通过扩展可靠UDP(R-UDP)协议,具有容忍移动性的特性,例如处理间歇性连接、防火墙/NAT穿越和对IP地址或网络接口(例如从蜂窝网络到WiFi,反之亦然)的切换的鲁棒性。
- UDT-Java UDT-Java是基于UDP的数据传输(UDT)的Java实现。
UDT是一种可靠的基于UDP的应用层数据传输协议,适用于分布式数据密集型应用在广域高速网络上使用。UDT使用UDP传输大块数据,并具有自己的可靠性控制和拥塞控制机制。相比TCP,新协议可以更快地传输数据。UDT还是一个高度可配置的框架,可以容纳各种拥塞控制算法。
JNetRobust是JVM 1.6+的快速、可靠且非侵入式的面向消息的虚拟网络协议。它位于传输层和应用层之间。特点包括:传输数据的可靠性;接收到未经验证的数据立即可用;包的大小大于UDP的包,但小于TCP的包;无流量控制;无拥塞控制。免责声明:我是JNetRobust的作者,它是新的,仍处于alpha阶段。

MR UDP链接:已移动,例如http://wiki.lac.inf.puc-rio.br/doku.php?id=mr-udp - Sam Ginrich

3

不要使用ActiveMQ。我运行了多个JMS消息总线的性能测试,包括JBoss、MQSeries、Weblogic、SunMQ和ActiveMQ,我可以告诉你,ActiveMQ是迄今为止最糟糕的一个,意味着丢失消息和各种无法解释的行为和错误。我使用的版本是5.0。 - jrobertsz66

2
您可能会发现,并非所有消息类型都需要可靠的传输。例如,如果您反复发送像玩家状态这样的内容,即使丢失几个数据包也可能无关紧要。
有一些支持Java的可靠高性能UDP库,其中一个是29West的LBM。它并不便宜,因为很难做到这一点。即使使用专业产品,您可能仍需要专用网络来最大程度地减少UDP丢包。
对于游戏目的,建议您使用ActiveMQ这样的JMS服务,它可以在任何您可以运行Java的地方运行。您应该能够以几毫秒的延迟发送10K条消息。
当人们说某事必须尽可能快时,这可以意味着几乎任何事情。对于一些人来说,10毫秒、1毫秒、100微秒、10微秒、1微秒是可以接受的。一些网络路由器支持通过600纳秒的延迟传递数据包。延迟越低,成本越高,对设计的影响也越大。假设您需要比实际需要更快的速度,可能会不必要地影响设计和成本。
您必须保持现实,考虑到您有一个人机界面。一个人无法在约1/20秒或约50毫秒内做出反应。如果您将消息保持在5毫秒以下,人类无法分辨差异。

不是的。我想说的是几毫秒。你可以实现亚毫秒延迟,但这需要更多的努力,并且取决于你的网络。使用代理商最低的延迟我见过的是小于10微秒,但是需要付出代价。;) - Peter Lawrey
谢谢您的建议,我晚上会尝试一下。您能给我一些使用教程的链接吗? - Viktor
我有一个队列(也许每个客户端一个,这样合理吗?)。服务器将消息推送到它们上面。客户端从此队列获取消息并处理它们。当客户端出现某些操作时,它会将消息推送到自己的队列中,然后服务器进行处理。我是对的吗? - Viktor
在JMS中,你有主题和队列。主题适用于将相同的信息分发给许多侦听器(发布者和侦听器可以是客户端或服务器)。当你想要向一个或多个相同的侦听器发送一条消息时(即你有一个想要完成的单个工作),队列就很好用了。如果你想要一个请求/响应模型,你可以为服务器创建一个已知队列,并为客户端创建一个临时队列。这避免了命名大量的队列/主题。你可以使代理程序冗余,并通过Web GUI监视所有消息,特别是任何未处理的消息。 ;) - Peter Lawrey

1

-4

UDP 按定义不是可靠的服务。它不能保证高质量的服务。然而,你可以使用 TCP


1
我猜他是在问是否有任何库可以在UDP之上实现可靠的协议。 - jontro
3
TCP有拥塞控制机制,这可能使得一些应用程序无法使用。 - amit
1
通过让接收方向原始发送方发送确认消息,可以为基于UDP的网络添加可靠性。我认为这就是OP正在寻找的内容。 - Fermat's Little Student
@Will:如果你添加握手协议,那么它就不再是UDP了。 - Mike Kwan
@MikeKwan:诚实的问题:为什么它不再是UDP?UDP是否关心你是否进行握手? - Sal Rahman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接