【问题标题】:Java reliable UDPJava 可靠的 UDP
【发布时间】:2011-09-25 19:03:03
【问题描述】:

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

PS也许您可以建议使用更高效的技术来完成此类任务(游戏服务器)?但这必须在 linux 上工作。

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

编辑 2: 我发现 Enet 用于 FPS 游戏,但它是 C++,如果我每秒调用多次会不会有开销?

【问题讨论】:

  • TCP 的开销对你的应用来说太糟糕了吗?
  • @krio afaik TCP 建立在 IP 而不是 UDP 之上。然而,UDP 也是建立在 IP 之上的
  • 推荐问题在这里是题外话。

标签: java udp client-server


【解决方案1】:

根据定义,UDP 不是可靠的服务。它不能保证高质量的服务。但是,您可以使用TCP

【讨论】:

  • 我猜他问是否有任何库在 UDP 之上实现了可靠的协议。
  • TCP 具有拥塞控制,这可能会使其无法用于某些应用程序。
  • 您可以通过让接收方将确认发送回原始发送方来增加基于 udp 的网络的可靠性。我认为这就是 op 正在寻找的。​​span>
  • @Will:如果加上握手,就不再是UDP了。
  • @MikeKwan:诚实的问题:它怎么不再是 UDP? UDP 是否关心你是否进行握手?
【解决方案2】:

您可能会发现并非所有消息类型都需要可靠的消息传递。例如,如果您重复发送诸如播放器之类的东西的状态,并且丢失了一些数据包,则可能无关紧要。


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

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


当人们说某事必须尽可能快时,这可能意味着任何事情。对于某些人来说,这意味着 10 ms、1 ms、100 us、10 us、1 us 是可以接受的。一些网络路由器支持以 600 ns 延迟传递数据包。延迟越低,成本就越高,对设计的影响就越大。假设您需要比您需要的更快的速度可能会不必要地影响设计和成本。

看到你有一个人机界面,你必须现实一点。人类的反应速度不能超过大约 1/20 秒或大约 50 毫秒。如果您将消息传递控制在 5 毫秒以下,人类将无法分辨。

【讨论】:

  • 一点也不。我的意思是说几毫秒。您可以实现亚毫秒级的延迟,但这需要更多的努力并且取决于您的网络。我见过的使用代理的最低延迟不到 10 微秒,但这是有代价的。 ;)
  • 谢谢你的建议,我晚上试试。你能给一些使用它的教程链接吗?
  • 我有一个队列(可能每个客户一个,合理吗?)。服务器在其上推送消息(它们)。客户端从这个队列中获取消息并处理它们。当客户端上出现某些操作时,它会将消息推送到其队列中并由服务器处理它。我说的对吗?
  • 在 JMS 中,您有主题和队列。主题有利于将相同的信息分发给许多侦听器(发布者和侦听器可以是客户端或服务器)。当您想向一个或多个相同的侦听器发送一次消息时,队列是很好的(即您有一个您想要的工作完成)如果您想要一个请求/响应模型,您可以为服务器创建一个已知队列并为客户端创建一个临时队列。这避免了命名大量队列/主题。您可以通过 Web GUI 使代理冗余并监控所有消息,尤其是任何未处理的消息。 ;)
【解决方案3】:

有一个Java实现的RUDP(可靠UDP)协议(RFC908,RFC1151)

http://sourceforge.net/projects/rudp/?source=dlp

【讨论】:

  • 不要使用 ActiveMQ。我对多个 JMS 消息总线进行了性能测试,包括 JBoss、MQSeries、Weblogic、SunMQ 和 ActiveMQ,我可以告诉你 ActiveMQ 是迄今为止最糟糕的一个,这意味着丢失的消息以及各种无法解释的行为和错误。我用 5.0 版测试过。
【解决方案4】:

这些是我所知道的实现可靠 UDP 之类的库/框架:

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

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

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

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

免责声明:我是 JNetRobust 的作者,它是新的并且仍处于 alpha 阶段。

【讨论】:

    【解决方案5】:

    Libjitsi 拥有基于 UDP 的 SCTP,它将所有内容分解为像 UDP 一样的数据包,但保证像 TCP 一样的可靠传输。见https://github.com/jitsi/libjitsi/blob/master/src/org/jitsi/sctp4j/Sctp.java

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 2017-05-10
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      相关资源
      最近更新 更多