我不知道在哪里以及如何开始,但我对服务器和客户端如何相互协作的方式有几个问题。我对Java和任何编程都很陌生,所以我几乎无能为力。这些问题涉及多人游戏,如Minecraft,WoW等。
让我开始吧。
我首先想知道的是,互动如何起作用?我已经阅读了有关这方面的文档,它告诉我使用Socket,然后使用PrintWriter和BufferedReader进行输入和输出。
(与1.相关)如果某人足够智能以反编译客户端,然后编辑发送的数据以更改位置值,并且当服务器接收数据时,它会将玩家重新定位到任何地方他们设置了新的位置。我该如何防止这种情况?
进行服务器/客户端交互的真实/最佳方式是什么?我是否使用Socket并在其中写入内容供客户端接收,或者我应该使用DatagramSocket和DatagramPacket?或者还有另一种方式吗?
我希望服务器与客户端分开,就像在几乎所有其他多人游戏中一样:你有一个启动服务器的文件,然后客户端可以连接到它。
在此先感谢,我很想知道这个概念。
答案 0 :(得分:0)
1。这个过于宽泛,无法以本网站可接受的形式合理地回答。我建议你继续阅读教程并尝试编写小型测试程序,直到你弄清楚
2。是的,许多“欺骗客户”完全按照您的描述进行。停止它的唯一方法是在服务器端它必须验证来自客户端的信息(如果玩家的最大速度是x
,检查是否newLocation > oldLocation + x
以及是否将玩家从服务器中踢出作弊)。但问题是,您检查的CPU时间越多,就越多。您需要平衡作弊保护与服务器性能
3。您需要开发一个“消息协议”,套接字只是字节流。当你处于通信的另一端时,除非双方都同意一个标准,否则你无法分辨一个“消息”停止和下一个消息开始的差异。
一种常见的邮件协议是在您发送邮件之前发送byte
说您将要发送的邮件的。您的代码将看起来像这样(抱歉C#我知道你说你只知道Java)
private void ReadIncomingClientData(NetworkStream clientStream)
{
while((messageLength = clientStream.ReadByte()) != -1)
{
switch(message[0])
{
case 0:
HandlePlayerMovement(clientStream);
case 1:
HandlePlayerChat(clientStream);
case 2:
HandlePlayerBeginLogoff();
default:
throw new InvalidDataException();
}
}
}
然后在每个函数中,每个函数都知道消息中接下来应该有多少字节。你提到过Minecraft,here is the message protocol it uses所以你可以看到更复杂的东西。