Java可靠UDP

Java可靠UDP,java,udp,client-server,Java,Udp,Client Server,请推荐实现可靠udp的java库。它将用于游戏服务器与客户端和其他服务器通信。 PS:也许你可以建议使用更高效的技术来完成这样的任务(游戏服务器)?但这必须在linux上运行 编辑:这是一款动作型游戏,因此需要尽快与服务器通话 < > > >编辑2:< /Study >我发现它是用于FPS游戏,但它是C++,如果我多次调用它,会有开销吗? < P> UDP是定义的,不是一个可靠的服务。它不能保证高质量的服务。但是,您可以使用。您可能会发现,并非所有消息类型都需要可靠的消息。例如,如果您重复发送

请推荐实现可靠udp的java库。它将用于游戏服务器与客户端和其他服务器通信。

PS:也许你可以建议使用更高效的技术来完成这样的任务(游戏服务器)?但这必须在linux上运行

编辑:这是一款动作型游戏,因此需要尽快与服务器通话


< > > >编辑2:< /Study >我发现它是用于FPS游戏,但它是C++,如果我多次调用它,会有开销吗?

< P> UDP是定义的,不是一个可靠的服务。它不能保证高质量的服务。但是,您可以使用。

您可能会发现,并非所有消息类型都需要可靠的消息。例如,如果您重复发送诸如玩家之类的内容的状态,并且一些数据包丢失,那么这可能根本不重要


有可靠的基于UDP的高性能库支持Java。其中之一是29West的LBM。这并不便宜,因为很难做到这一点。即使使用专业产品,您也可能需要UDP专用网络,以将损失降至最低

出于游戏的目的,我建议您使用像ActiveMQ这样的JMS服务,它可以在任何可以运行Java的地方运行。您应该能够在几毫秒的延迟时间内每秒发送10K条消息


当人们说某事必须尽可能快时,这可能意味着任何事情。对一些人来说,这意味着10毫秒,1毫秒,100美,10美,1美是可以接受的。一些网络路由器支持传输延迟为600 ns的数据包。延迟越低,成本越高,对设计的影响也越大。假设您需要的速度超过您需要的速度,可能会对设计和成本产生不必要的影响


你必须现实地看到你有一个人性化的界面。人类的响应速度不能超过1/20秒或50毫秒。如果您将消息传递时间保持在5毫秒以下,人类将无法分辨差异。

存在RUDP(可靠UDP)协议(RFC908,RFC1151)的java实现


我知道这些库/框架实现了可靠的UDP:

  • MR-UDP旨在以尽可能低的开销提供基于UDP的从/到移动节点(MN)的可靠通信。它扩展了具有移动性容忍功能的协议,例如处理间歇性连接、防火墙/NAT穿越的能力以及对IP地址或网络接口切换的鲁棒性(例如,蜂窝到WiFi,反之亦然)


  • 的Java实现

    UDT是一种可靠的基于UDP的应用程序级数据传输协议,适用于广域高速网络上的分布式数据密集型应用程序。UDT使用UDP传输具有自身可靠性控制和拥塞控制机制的海量数据。新协议可以以比TCP高得多的速度传输数据。UDT也是一个高度可配置的框架,可以容纳各种拥塞控制算法

  • 用于JVM 1.6+的快速、可靠且非侵入性的面向消息的虚拟网络协议。
    它位于传输层和应用层之间。
    特点:

    • 传输数据的可靠性
    • 收到的未经验证的数据立即可用
    • 该包比UDP的包大,但比TCP的包小
    • 无流量控制
    • 无拥塞控制

免责声明:我是Jnetrobast的作者,它是新的,仍然是alpha版本。

Libjitsi有通过UDP的SCTP,它可以将所有内容分解为UDP等数据包,但可以保证可靠的传输,如TCP。请参见

TCP的开销对您的应用程序来说太糟糕了吗?@krio afaik TCP构建在IP而不是UDP之上。然而,UDP也是建立在IP之上的。这里的推荐问题是离题的。我猜他会问是否有任何库在UDP之上实现了可靠的协议。TCP有拥塞控制,这可能会使某些应用程序无法使用。您可以通过让接收者向原始发送者发回确认消息来增加基于udp的网络的可靠性。我想这就是op想要的。@Will:如果你加上握手,它就不再是UDP了。@MikeKwan:诚实的问题:它怎么不再是UDP了?UDP关心你是否握手吗?一点也不关心。我的意思是几毫秒。您可以实现亚毫秒延迟,但这需要更多的努力,并且取决于您的网络。我见过的使用代理的最低延迟不到10微秒,但要付出代价。;)谢谢你的建议,我晚上试试看。你能给一些使用它的教程链接吗?我有一个队列(可能每个客户端一个,合理吗?)。服务器在其上推送消息。客户端从此队列获取消息并对其进行处理。当某个操作出现在客户机上时,它会将消息推送到其队列上,服务器会对其进行处理。我说的对吗?在JMS中,您有主题和队列。主题有助于将相同的信息分发给许多侦听器(发布者和侦听器可以是客户端或服务器)。当您希望向一个或多个相同的侦听器发送一次消息时(即,您只需要完成一项工作),队列是很好的如果需要请求/响应模型,可以为服务器创建一个已知队列,为客户端创建一个临时队列。这避免了命名大量队列/主题。您可以通过web GUI使代理冗余并监视所有消息(尤其是未处理的消息)。)不要使用ActiveMQ。我对多个JMS消息总线(包括JBoss、MQSeries、Weblogic、SunMQ和ActiveMQ)进行了性能测试,我可以告诉您,ActiveMQ是迄今为止最差的一个,这意味着消息丢失以及各种无法解释的行为和错误。我用5.0版进行了测试。