Bob*_*son 13 java network-programming
嗨我用Java编写了一个多人游戏,我想知道我需要学习什么和/或我应该使用什么来使游戏可以通过网络或多台计算机在互联网上播放.我真的很无知从哪里开始所以任何建议都会有所帮助,谢谢.
Jef*_*ker 47
那些其他答案都是相当高级的,这很好,但是你不需要高级,你想要低级别,如"我如何让它实际发送数据,这意味着什么,我该怎么办发送等." 这是你做的:
首先,TCP还是UDP?如果你不知道这些是什么,请阅读它们,因为我没有足够的空间在这里给出一个好的纲要,但是你知道如下:
因此,问问自己什么是重要的,了解TCP和UDP如何工作,然后做出明智的选择.
也就是说,现在您必须在网络中同步对象状态.这意味着您的对象需要序列化为可以在字节流中表示并写入套接字的内容.写入套接字很容易; 如果你可以写一个文件,你可以写一个套接字,这真的不难.重要的是确保您能够将对象表示为缓冲区,因此如果您的对象具有指向其他对象的引用/指针,则您将无法发送这些指针,因为它们在其他客户端上是不同的,所以你必须将它们转换为所有主机通用的东西.这意味着ID,尽管对象的ID在所有主机上必须是唯一的,因此您必须有一种方法在主机之间进行协调,这样任何两台主机都不会创建具有相同ID的不同对象.有办法处理执行此操作的主机,但我们不会在此担心(提示:在主机ID和网络ID之间使用某种映射.更大的提示:如果您不需要,请不要这样做).
所以现在你可以发送数据,很好,现在是什么?每次游戏状态发生变化时,您都必须以某种方式向其他计算机发送更新.这是客户端 - 服务器体系结构的来源,或者如果您愿意,可以是点对点.Client-Server更容易实现.此外,作为服务器"主动"的一个主机仍然是客户端 - 服务器,任何说不同的人都是错误的.
因此,服务器的责任是"拥有"所有游戏状态.只有服务器可以明确地说明对象所处的状态.如果要移动对象,则告诉服务器您要移动,但是服务器会告诉您应该移动对象,而不仅仅是这样做(虽然某种客户端预测通常很有用).然后,服务器将更新的对象状态发送给所有其他主机.
所以,你提到了回合制游戏,对吧?非常简单:
这就是回合制游戏所需要的全部内容.提示:使用TCP Bigger提示:TCP实现称为"Nagle算法"的东西,它将您的消息组合成一个数据包.这意味着,如果您发送两个单独的消息,并且两个单独的调用"发送",则其他主机可能在一次调用"接收"时只接收一个数据包,但该数据包将包含两个内容.已发送的数据包.因此,如果您发送两个100字节的数据包,其中有两个要发送的调用,您可以在一次调用中获得一个200字节的数据包来接收.这是正常的,所以你需要能够以某种方式处理这个问题.一个技巧是使每个数据包的大小相同,然后每次检查输入时从套接字中读取多个字节.请记住,您也可以获得部分消息.例如,如果发送两个100字节的消息,它们可以组合成一个200字节的消息.接下来,如果您从另一端的套接字读取,但是您读取的缓冲区大小为150字节,则您将拥有150个字节,其中包含第一个数据包和第二个数据包的一部分.你将不得不拨打第二个电话来接收第二条消息的剩余部分,所以保持跟踪你接收到的数据的数量,这样你就不会错过某个地方的部分数据包.这就是为什么保持您的数据包相同的大小是有用的.
还有一些其他有用的技巧可以减少你的消息的大小和频率,并跟踪那些不是回合制并且实时行动的游戏,但如果你有一个回合制游戏,那么正确的做法是do可能是使用TCP而不担心其他任何东西.以下是一些有用网站和文章的链接,这些链接将为您提供有关如何完成游戏网络编程的更多信息:
如果您想了解更多有关这些内容的详细信息,或者您有更具体的问题,请与我们联系.
如果您想通过网络添加多人游戏功能,那么查看Netty 项目来构建通信基础设施可能会对您有所帮助。
但在此之前,您需要确保您的游戏具有正确的“架构”。您需要大型模块:客户端和服务器。
服务器负责所有游戏逻辑。从某种意义上来说,它就是游戏引擎。客户端负责向服务器查询游戏状态,将其显示给玩家,获取玩家输入并向服务器发送命令。
一种解耦客户端和服务器代码而不需要学习网络编程的麻烦的方法是让两个不同的程序从 CLI 运行。执行顺序可以是这样的:
冲洗并重复。这基本上就是 PBEM 服务器所做的事情。
为了帮助解耦客户端和服务器,定义一种“语言”来表示游戏状态的变化以及服务器要执行的命令是有意义的。如果客户端缓存状态并应用从服务器发送的更改,则会有所帮助。
一旦您的客户端和服务器代码完全解耦,并且“语言”被完全定义,您就可以将通信机制从基于文件更改为基于套接字。