【问题标题】:Using TCP and UDP for java game使用 TCP 和 UDP 进行 java 游戏
【发布时间】:2015-11-12 01:21:08
【问题描述】:

我正在为我的朋友在局域网上玩实时 java 游戏。游戏在客户端-服务器架构中运行,它现在使用 UDP 处理一切(位置更新和加入游戏)。当我和朋友通过 Internet 测试游戏时,丢失了一些重要的 UDP 数据包(比如用于生成敌人的数据包)。

所以我的问题是,制作实时多人游戏的最佳解决方案是什么?我可以将 UDP 用于必要的更新数据包,将 TCP 用于登录、断开连接、聊天等数据包吗?我可以在同一个端口和套接字上使用这两种协议吗?

【问题讨论】:

  • 如果您需要保证交付或保证交付顺序,除非您准备在您的软件中实现这些功能,否则 UDP 不适合您。 UDP 是一种发送后忘记、尽力而为的协议。 TCP 保证交货和交货顺序。
  • 问题是我需要他们两个。保证在新玩家登录服务器时发送数据包,并发送和忘记用于移动和 RT 内容的数据包。我可以像使用 UDP 的询问和重新发送系统那样实现,还是值得这样做?或者我应该//我可以只使用TCP吗
  • 这取决于你。您可以为 UDP 实现自己的请求并重新发送,或者对两者都使用 TCP。你知道你的要求。您可以为这两个单独的功能使用两个不同的 TCP 端口,或者您可以为 UDP 和 TCP 使用相同的端口号。权衡您的选择...

标签: java sockets networking tcp udp


【解决方案1】:

只是想帮助那些偶然发现其他答案中给出的令人难以置信的糟糕建议的路人。对不起,我相信这是好意。如果您有任何实时方面的内容,请不要在游戏中使用 TCP。以后的某个时候你会后悔的。

您想要的是通过 UDP 实现可靠性/连接。 Gaffer on Games 有一个关于这个主题的优秀系列。我诚挚地推荐所有对这个话题感兴趣的人阅读整个系列。这是描述 UDP 上的“连接”的帖子的链接:https://gafferongames.com/post/virtual_connection_over_udp/

你很幸运 - 他们甚至在一个开源库中实现了所有这些 https://github.com/networkprotocol/yojimbo

【讨论】:

    【解决方案2】:

    你可以结合两者。有时你可能需要可靠的数据,那个时候你需要 TCp。有时它不需要,所以你可以使用 UDP。结合两者。

    【讨论】:

      【解决方案3】:

      您最好的选择就是使用 TCP。除了为您提供重新发送功能(因此您不必自己编写它们)以及关闭其他良好功能的主机之外,TCP 还将使处理路由器和防火墙变得更加容易。

      我确实建议关闭 Nagle 算法,以便始终立即发送数据。

      【讨论】:

      • 关闭 Nagle 算法并不能确保始终立即发送数据,而且在许多情况下实际上会减慢数据传输速度并降低链接效率。一般来说,Nagle 算法应该只在使用 TCP 天真地携带并非设计为越过 TCP 的数据时禁用。对于设计为通过 TCP 传输的数据,在 TCP 之上分层的协议应设计为确保与 Nagle 算法的兼容性,例如通过使用应用层确认。
      • @DavidSchwartz 关闭 Nagle 算法是专门为希望用户输入立即发送到服务器而不是存储并以更大的数据包发送以更有效地利用带宽的情况而设计的。 Telnet 是典型的例子——当然没有其他协议可以更好地为 Telnet 设计——但是实时网络游戏中客户端到服务器的路径具有非常相似的要求。通常,Telnet 和计算机游戏中的上行路径的带宽都很低,因此带宽效率低下不是问题。
      • 要求完全不同。在 telnet 中,成帧对于协议层来说是完全无法理解的。输入数据中的边界是完全无法检测到的,并且没有办法,例如,实现应用层确认。在游戏中,这些边界是协议已知的。
      • 我有点害怕只使用 TCP,因为它会浪费时间重新发送不再需要的丢失数据,比如移动时的玩家位置。但我会将 TCP 用于其他重要的事情,并阅读有关 Nagle 算法的更多信息。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      相关资源
      最近更新 更多