gpt4 book ai didi

java - 通过网络或互联网使多人游戏可玩

转载 作者:行者123 更新时间:2023-12-03 02:40:30 27 4
gpt4 key购买 nike

嗨,我已经用Java编写了一个多人游戏,我想知道我需要学习什么和/或应该使用什么才能使该游戏可以通过网络或在多台计算机上在Internet上播放。我真的不知道从哪里开始,所以任何建议都会有所帮助,谢谢。

最佳答案

这些其他答案都是相当高级的,这很好,但是您不希望高级,而是希望低级,如“我如何使它实际发送数据,这意味着什么,我该怎么做”。发送,等等。”这是您的工作:

首先,TCP还是UDP?如果您不知道这两个是什么,请继续阅读它们,因为我没有足够的空间在此处对两者进行简要介绍,但是您可以选择以下知识:

  • TCP适用于回合制游戏或通常可以使用高延迟的游戏,因为TCP保证了数据包的传送,因此丢失的数据包可能需要一些时间才能重新传送。这对象棋之类的东西或其他可能轮流使用的东西很有好处。
  • UDP非常适合那些您不必在乎消息可靠性的游戏,它更喜欢数据一直在发送,如果您错过了某些事情,很好。这对于基于实时 Action 的游戏(例如HALO:Reach或使命召唤)非常有用。在这种情况下,如果您发送一个对象的位置,而该对象永不到达那里,那么发送一个新的位置要比重新发送一个旧的位置(现在甚至更旧)要好,因此始终确保可靠性并不重要。就是说,您必须确保某些事物是100%可靠的,因此您仍然需要某些事物来保证交付,例如对象创建和对象销毁。这意味着您需要在UDP之上实现自己的半可靠,基于优先级的协议(protocol)。这是困难的。

  • 因此,问自己重要的事情,了解TCP和UDP的工作原理,然后做出明智的选择。

    也就是说,现在您必须在整个网络上同步对象状态。这意味着您的对象需要序列化为可以在字节流中表示并写入套接字的对象。写入套接字很容易;如果您可以写入文件,也可以写入套接字,那确实不难。重要的是要确保您能够将一个对象表示为缓冲区,因此,如果您的对象具有对其他对象的引用/指针,则您将无法仅发送这些指针,因为它们在其他客户端上是不同的,因此您必须将它们转换为所有主机都通用的东西。这意味着ID,尽管对象的ID在所有主机上必须是唯一的,所以您必须有一种在主机之间进行协调的方法,以使没有两个主机将创建具有相同ID的不同对象。有多种方法可以处理主机,但是我们在这里不必担心(提示:在主机ID和网络ID之间使用某种映射。更大的提示:如果不需要,请不要这样做)。

    那么现在您可以发送数据了,太好了,现在呢?每次游戏状态更改时,您都必须以某种方式将更新发送到其他计算机。这是客户端-服务器体系结构出现的地方,或者,如果需要,则是对等的。客户端服务器更易于实现。同样,一台充当服务器的主机仍然是客户端-服务器,任何不同的人都是错误的。

    因此,服务器的责任是“拥有”所有游戏状态。只有服务器才能明确地说出对象所处的状态。如果要移动对象,请告诉服务器您要移动,但是服务器随后告诉您应该移动对象,而不仅仅是做到这一点(尽管某些客户端预测通常很有用)。然后服务器将更新的对象状态发送到所有其他主机。

    所以,您提到了回合制游戏,对吗?很简单:
  • 您将要解决当前轮到客户的问题。一旦该客户端执行了他们想要的操作,就将该回合的结果发送到服务器。然后,服务器验证客户端的 Action (不只是信任客户端,以这种方式进行欺骗),并将其应用于对象状态。
  • 服务器更新后,它将向具有世界新状态的每个其他客户端发送消息,然后这些客户端应用这些更新。其中包括刚刚轮到的客户;该客户端仅应在服务器通知时更新其世界状态,因为您要确保与其余主机的一致性,并且要防止主机作弊。
  • 然后,服务器发出一条消息,指示轮到谁了。您可以在上一步中的世界状态更新的同时发送此消息,这很好。只是要知道客户试图使他们的订单困惑。这就是为什么服务器拥有全局授权的原因。如果客户端尝试作弊,则服务器可以打击它们。

  • 这是回合制游戏所需要做的全部工作。提示:使用TCP
    更大的提示:TCP实现了一种称为“Nagle的算法”的东西,它将把您的消息组合成一个数据包。这意味着如果您发送两个单独的消息,并带有两个分别对“发送”的调用,则其他主机可能在一次对“接收”的调用中仅接收到一个数据包,但是该数据包将包含两者的内容。发送的数据包。因此,如果您发送两个带有两个要发送的 call 的100字节数据包,则可能在单个 call 中得到一个200字节的数据包以进行接收。这是正常现象,因此您需要能够以某种方式进行处理。一种技巧是使每个数据包都具有相同的大小,然后每次检查输入时都从套接字读取那么多字节。还请记住,您也可能会收到部分消息。例如,如果您发送两条100字节的消息,则可以将它们组合为一条200字节的消息。接下来,如果您从另一端的套接字读取数据,但是读取的缓冲区大小为150字节,则将有150字节,其中包含第一个数据包,第二个数据包的一部分。您必须打第二个电话才能收到剩下的第二条消息,因此要保持跟踪收到的数据的方式,以免丢失某个地方的一部分数据包。这就是为什么将数据包保持相同大小很有用。

    还有许多其他有用的技巧可以减少消息的大小和频率,并跟踪非回合制和实时操作的游戏,但是如果您有回合制游戏,那么正确的做法是可能要做的就是使用TCP,而不用担心其他任何东西。以下是一些有用的网站和文章的链接,它们将为您提供有关如何进行游戏网络编程的更多信息:
  • Glenn Fiedler's site,一些很好的信息。
  • 1500 archers,有关如何实现称为确定性锁步技术的出色论文,该技术对许多类型的游戏都非常有用。

  • 让我知道,如果您需要有关这些东西的更多详细信息,或者您有其他更具体的问题。

    关于java - 通过网络或互联网使多人游戏可玩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5938530/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com