使多人游戏可通过网络或互联网玩
嗨,我用Java写了一个多人游戏,我想知道我需要学习什么和/或我应该使用什么才能使游戏可以通过网络或互联网通过多台计算机玩。我真的不知道从哪里开始,所以任何建议都会有所帮助,谢谢。
嗨,我用Java写了一个多人游戏,我想知道我需要学习什么和/或我应该使用什么才能使游戏可以通过网络或互联网通过多台计算机玩。我真的不知道从哪里开始,所以任何建议都会有所帮助,谢谢。
这些其他答案都是相当高级的,这很好,但你不想要高级,你想要低级,就像“我如何让它实际发送数据,这意味着什么,我发送什么,等等。以下是您要执行的操作:
首先,TCP还是UDP?如果您不知道这两件事是什么,请阅读它们,因为我没有空间在这里对两者进行很好的概述,但是对于您的选择,请了解以下内容:
因此,问问自己什么是重要的,了解TCP和UDP的工作原理,然后做出明智的选择。
也就是说,现在您必须通过网络同步对象状态。这意味着您的对象需要序列化为可以在字节流中表示并写入套接字的内容。写入套接字很容易;如果你能写到一个文件,你可以写到一个套接字,这真的不难。重要的是要确保你能够将一个对象表示为缓冲区,所以如果你的对象有指向其他对象的引用/指针,你将无法只发送这些指针,因为它们在其他客户端上是不同的,所以你必须将它们转换为所有主机通用的东西。这意味着 ID,尽管对象的 ID 在所有主机中必须是唯一的,因此您必须有一种方法在主机之间进行协调,以便没有两个主机会创建具有相同 ID 的不同对象。有一些方法可以处理主机执行此操作,但我们在这里不会担心(提示:在主机的ID和网络ID之间使用某种映射。更大的提示:如果你不需要,不要这样做)。
所以现在你可以发送数据了,太好了,现在该怎么办?每次游戏状态更改时,您都必须以某种方式向其他计算机发送更新。这就是客户端-服务器体系结构的用武之地,或者如果需要,也可以进行对等。客户端-服务器更易于实现。此外,一个主机“充当”服务器仍然是客户端 - 服务器,任何说不同的人都是错误的。
因此,服务器的责任是“拥有”所有游戏状态。只有服务器才能明确说明对象处于什么状态。如果你想移动一个对象,你告诉服务器你想移动,但是服务器然后告诉你你应该移动对象,你不只是这样做(尽管某种客户端预测通常是有用的)。服务器将更新后的对象状态发送到所有其他主机。
所以,你提到了回合制游戏,对吧?非常简单:
这就是回合制游戏需要做的所有事情。提示:使用TCP更大的提示:TCP实现了一种称为“Nagle算法”的东西,它将你的消息组合成一个数据包。这意味着,如果您发送两条单独的消息,并对“发送”进行两次单独的调用,则其他主机可能会在一次调用“Receive”时仅接收一个数据包,但该数据包将包含已发送的两个数据包的内容。因此,如果您发送两个 100 字节数据包,同时发送两个要发送的调用,则可能会在单个调用上接收一个 200 字节数据包。这是正常的,所以你需要能够以某种方式处理这个问题。一个技巧是使每个数据包的大小相同,然后每次检查输入时从套接字中读取那么多字节。还要记住,您也可能收到部分消息。例如,如果发送两条 100 字节的消息,则可以将它们合并为一条 200 字节的消息。接下来,如果从另一端的套接字读取,但读取的缓冲区大小为 150 字节,则将有 150 个字节,其中包含第一个数据包和第二个数据包的一部分。您必须拨打第二个电话才能接收第二条消息的其余部分,因此请跟踪您收到的数据量,以免在某个地方错过数据包的一部分。这就是为什么保持数据包大小相同非常有用的原因。
还有许多其他有用的技巧可以减少消息的大小和频率,并跟踪不是回合制游戏并实时行动,但是如果您有回合制游戏,那么正确的做法可能是使用TCP而不必担心任何其他事情。以下是一些指向有用网站和文章的链接,这些网站和文章将为您提供有关如何完成游戏网络编程的更多信息:
如果您想了解有关任何此类内容的更多详细信息,或者您有更具体的问题,请告诉我。
一种可能的架构方法是让游戏的一个实例充当主机(例如,第一个启动的实例)。它将协调游戏,并将游戏状态和回合的信息发送给其他每个玩家。
当玩家进行移动时,它会将移动信息发送到主机,主机将更新游戏的状态(并检查移动的有效性等)。然后,它会将新的游戏状态发送给每个玩家,并将下一回合的通知发送(可能作为单独的通信)到相应的客户端并等待其响应。
从某种意义上说,主机在此方案中充当游戏服务器,但使用/玩起来可能更简单,因为没有必须运行单独的进程才能玩游戏。