Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使多人游戏可在网络或互联网上玩_Java_Network Programming - Fatal编程技术网

Java 使多人游戏可在网络或互联网上玩

Java 使多人游戏可在网络或互联网上玩,java,network-programming,Java,Network Programming,您好,我用Java编写了一个多人游戏,我想知道我需要学习什么和/或应该使用什么,以便使游戏可以通过网络或多台计算机在internet上玩。我真的不知道从哪里开始,所以任何建议都会很有帮助,谢谢。如果您想通过网络添加多人游戏功能,请查看构建通信基础设施的步骤 但在你能做到这一点之前,你需要确保你的游戏有正确的“架构”。你需要有一个大的模块:客户端和服务器 服务器负责所有的游戏逻辑。从某种意义上说,它是游戏引擎。客户端负责向服务器查询游戏状态,向玩家显示,获取玩家输入并向服务器发送命令 在学习网络编

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

如果您想通过网络添加多人游戏功能,请查看构建通信基础设施的步骤

但在你能做到这一点之前,你需要确保你的游戏有正确的“架构”。你需要有一个大的模块:客户端和服务器

服务器负责所有的游戏逻辑。从某种意义上说,它是游戏引擎。客户端负责向服务器查询游戏状态,向玩家显示,获取玩家输入并向服务器发送命令

在学习网络编程时不需要麻烦就可以将客户机和服务器代码解耦的一种方法是使用两个不同的程序从CLI运行。执行顺序可以如下所示:

  • 服务器运行以初始化游戏状态,游戏状态保存在文件中
  • 客户端运行时,它读取游戏状态,以某种方式显示,并从玩家那里获得一些输入。它将该输入保存到一个文件中
  • 服务器运行时,它从客户端读取命令,更改游戏状态并更新状态文件
  • 冲洗并重复。PBEM服务器基本上就是这样做的

    为了帮助分离客户端和服务器,定义一种“语言”来表示游戏状态的变化以及服务器要执行的命令是有意义的。如果客户端缓存状态并应用从服务器发送的更改,则会有所帮助


    一旦客户机和服务器代码完全解耦,并且“语言”完全定义,您就可以将通信机制从基于文件更改为基于套接字。

    一种可能的架构方法是让游戏的一个实例作为主机(例如,第一个启动的实例)。它将协调游戏,发送游戏状态的信息,并将信息传递给其他玩家

    当玩家移动时,它会将移动信息发送给主机,主机会更新游戏状态(并检查移动的有效性等)。然后,它会将新的游戏状态发送给每个玩家,并向相应的客户端发送(可能是单独的通信)下一轮的通知,并等待其响应


    从某种意义上说,在这种情况下,主机充当游戏服务器,但使用/玩起来可能更简单,因为没有单独的进程必须运行才能玩游戏

    其他答案都是相当高的级别,这很好,但你不想要高级别,你想要低级别,比如“我如何让它实际发送数据,这意味着什么,我发送什么,等等。”下面是你要做的:

    首先,TCP还是UDP?如果你不知道这两件事中的任何一件是什么,请仔细阅读,因为我在这里没有足够的篇幅来详细说明这两件事,但请你选择了解以下内容:

  • TCP适用于回合制游戏或高延迟的游戏,因为TCP保证数据包传输,所以可能需要一些时间才能重新传输丢失的数据包。这对像国际象棋或其他轮换的东西都有好处
  • UDP适用于那些您不必关心消息可靠性的游戏,并且更希望数据能够持续发送,如果您错过了什么,那就好了。这对基于实时动作的游戏很有好处,比如《光环:到达》或《使命召唤》。在这些情况下,如果你发送一个对象的位置,而该对象从未到达那里,发送一个新的位置比重新发送一个旧的位置(现在更旧)要好,因此始终保证可靠性并不重要。这就是说,您必须拥有100%可靠的某些东西,因此您仍然需要某些东西来保证交付,例如对象创建和对象销毁。这意味着您需要在UDP之上实现自己的半可靠、基于优先级的协议。这很难
  • 所以,问问自己什么是重要的,了解TCP和UDP是如何工作的,然后做出明智的选择

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

    现在你可以发送数据了,太好了,现在怎么办?每次游戏状态改变时,你都必须以某种方式向其他机器发送更新。这就是客户机-服务器体系结构的用武之地,如果你想的话,也可以采用点对点。客户机-服务器更容易实现。另外,一台主机“代理”因为服务器仍然是客户机-服务器,任何人说不同的话都是错误的

    因此,服务器的责任是“拥有”所有游戏状态。只有服务器才能确定对象处于何种状态。如果要移动对象