Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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_Sockets_Data Representation - Fatal编程技术网

客户端/服务器多人生存游戏应该使用什么?JAVA

客户端/服务器多人生存游戏应该使用什么?JAVA,java,sockets,data-representation,Java,Sockets,Data Representation,我正在用java制作一个游戏,它进行得很顺利。我想在早期实现多人游戏,所以我在它的基础上进行构建,而不是在游戏有大量不同功能时将整个游戏移植到多人游戏。。 我想让它成为一个客户机/服务器应用程序。 现在我确定了如何或如何实现多播放器。我已经阅读了关于套接字和所有内容的java教程,我测试了它们并成功地建立了连接(在测试项目中)。我不知道从这里到哪里去。我不知道我该如何转移,比如说在地图上有不同的球员,或者哪怕有任何球员。。我不知道是使用图书馆,还是自己做,或是做什么。。。如果有人能给我一些关于如

我正在用java制作一个游戏,它进行得很顺利。我想在早期实现多人游戏,所以我在它的基础上进行构建,而不是在游戏有大量不同功能时将整个游戏移植到多人游戏。。 我想让它成为一个客户机/服务器应用程序。
现在我确定了如何或如何实现多播放器。我已经阅读了关于套接字和所有内容的java教程,我测试了它们并成功地建立了连接(在测试项目中)。我不知道从这里到哪里去。我不知道我该如何转移,比如说在地图上有不同的球员,或者哪怕有任何球员。。我不知道是使用图书馆,还是自己做,或是做什么。。。如果有人能给我一些关于如何通过TCP连接传输播放机数据或类似内容的指南,或者给我一个使之更简单的库。

对于虚拟机之间的通信,没有比这更简单的了。使用RMI,您可以在完全不同的计算机上调用对象上的方法。可以将整个对象用作参数和返回值。因此,通知服务器您的移动可以像
server.sendMove(someMoveObject、somePlayerObject、someOtherObject)一样简单。


如果您正在寻找一个起点,这可能是一个很好的起点。

首先,多人游戏使用UDP进行数据传输。这有很多原因,例如较低的滞后等。如果你的游戏包含密集动作,并且需要快速反应,那么你应该选择基于UDP的动作

网络游戏可能有解决方案,但编写自己的实现也不难。如果你在这方面有问题,你可能会在比赛的其余部分遇到问题。网络上甚至java中都有非面向游戏的库和解决方案,但它们大多不是为游戏那么快而设计的。例如,远程过程调用可能包含代价高昂的序列化,并生成比实际需要大得多的包。它们可以是方便的解决方案,但考虑到游戏而非常规业务应用程序,它们的性能较差

例如,如果你有20个玩家,每个人都有坐标、状态,当然还有移动的对象。你需要每秒至少20次更新,以避免太多的延迟,这意味着大量的流量。用户输入的20*20传入消息和包含大量信息的20*20传出消息。算算。您必须将所有播放器和尽可能多的对象数据压缩到一个包中,以获得最佳性能。这意味着您可能必须编写小型数据包,这些数据包可以很容易地序列化为ByTestStream,并且它们必须只包含可行的信息。如果您丢失了一些数据,这不是问题,但是您需要注意重要信息,以确保它们到达目的地。你不想让玩家错过关于他们死亡的信息


我用C#编写了一个可靠且可用的网络“库”,这不是一项庞大的工作,但建议您四处看看,把它建好。这是一篇关于这个话题的文章,请阅读。即使您使用外部库,掌握它在做什么以及应该如何使用它也是一件好事。

这是一个相当广泛的问题,有多种方法可以做事情,但我的看法如下。免责声明:我是一家移动多人游戏公司的服务器系统架构师。我不认为自己是这方面的专家,但由于工作和爱好,我也有一些经验(我写了我的第一个“MMORPG”,它支持了2004的255个玩家),我觉得我可以用正确的方向戳你。对于这里的大多数概念,我仍然建议您使用Google、Stackoveflow等进行进一步研究,这只是我对游戏网络所需内容的“10000英尺视图”

根据您正在制作的游戏类型(想想实时游戏,如第一人称射击游戏和基于回合的游戏,如国际象棋),底层传输层协议的选择很重要。正如Matzi所建议的,UDP为您提供了较低的延迟(以及较低的数据包开销,因为报头比TCP小),但在缺点方面,无法保证将数据包传递到目的地,即,您永远无法确定发送的数据是否真的到达了客户端,或者,如果您连续发送多个数据包,如果数据以正确的顺序到达。通过使用单独的消息确认到达的数据(尽管同样,如果确认使用UDP,它们也可能丢失),并通过一些额外的数据处理订单,您可以实现“可靠的UDP”协议,但这样您(至少部分)就失去了较低的延迟和较低的开销。另一方面,TCP保证数据的传递和顺序保持正确,但由于数据包确认和开销(TCP数据包具有更大的报头),具有更高的延迟。你可以说UDP数据包有点像“独立的实体”,而TCP是一个连续的、不间断的流(你需要某种方法来区分一条消息的结束和另一条消息的开始)

有些游戏两者兼用;对于绝对必须发送到客户端的重要数据(如播放器死亡等),请使用单独的TCP连接;对于“开火并忘记”类型的数据(如播放器的当前位置),请使用另一个UDP连接(如果位置没有到达另一个客户端,并且玩家正在移动,那么再次发送数据就没有多大意义了,因为数据可能已经过时,并且很快会有另一个更新)

在您选择UDP和/或TCP进行传输后,您可能仍然需要一个自定义协议来编码和解码TCP/UDP数据包移动的数据(“有效负载”)。对于游戏来说,最明显的选择是一些(相对于基于文本的协议,如HTTP)例如,一个简单的二进制协议可以标记消息中包含的总字节数,然后标记数据类型,数据类型