java中的实时套接字

时间:2012-09-29 19:11:55

标签: java android sockets real-time multiplayer

我正在尝试使用套接字编写带有java后端的Android多人游戏,但我不知道如何做一些事情。

例如,我需要玩家。第一个玩家按下“UP”按钮,他的化身向上移动。我怎么能告诉所有其他球员?

我可以发送消息,带有一些ID的用户将他的坐标改为新的X和Y,但是我需要在他移动时每毫秒都这样做。是吗?

或者我可以发送消息,用户将某个ID按下UP按钮,然后发送用户释放UP按钮的新消息。使用这两个事件和移动速度之间的时间差我可以计算用户的新坐标,但在这种情况下将是延迟问题(时差计算将不够准确) 我怎么能这样做?

1 个答案:

答案 0 :(得分:5)

你可以通过很多方式实现这一切,并且所有方面都会有缺点。我想没有“最好的”方法。

游戏的一种常见方式是拥有“游戏服务器”。服务器接收来自所有客户端的输入并决定结果状态。

客户端可以例如只传输按键,服务器告诉他们他们需要绘制的其他客户端的位置和位置。客户端在本地执行相同的数学运算并在等待服务器确认时显示此状态。但那只是一个预测。

当它滞后时,您可以观察到自己在很多游戏中的位置之间跳跃,因为实际的服务器计算位置和您的预测不同步。

服务器端状态决策的另一个优点是客户端不能轻易欺骗。防止每一个作弊都不是万无一失的。例如,瞄准机器人通过为它们移动鼠标来简单地模拟完美瞄准用户,这基本上是不可检测的。另一方面,通过简单地不告诉客户当前看不见的东西,可以防止地图黑客/墙壁黑客(你可以看到你看不到的东西)。只有服务器需要知道完整状态。

也可以在没有专用游戏服务器的情况下使用服务器方法。相反,其中一个客户端将拥有服务器的角色并决定游戏状态。如果原始主机退出,某些游戏中的责任甚至可以在客户端之间切换。如果发生这种情况,顺利移交是相当棘手的。

如果没有服务器且所有客户端都负有同样的责任,您将不得不考虑架构,该架构定义哪个客户端负责验证哪个操作。例如在射击游戏中,A向某个方向射击,并且认为B仍在那里但是B已经移动了一点,现在A认为“B被击中”而B认为“射击错过” - >无论是一次射击还是被击中者都应该决定会发生什么。

具有多个决策方的模式可能不适用于每个游戏,这是一项非常复杂的任务。不只是游戏而是distributed computing in general

Java和套接字只是这里的工具。实际问题是你应该拿笔和纸,并考虑适用于你的场景的模式。

关于每毫秒的坐标:您还可以发送消息,例如“我将在X点,Y点在时间Z”,其他客户端插入该播放器的路径,这样您就不必传输每个位置。