服务器/客户端操作如何工作?

时间:2013-11-10 00:23:44

标签: sockets

我不知道在哪里以及如何开始,但我对服务器和客户端如何相互协作的方式有几个问题。我对Java和任何编程都很陌生,所以我几乎无能为力。这些问题涉及多人游戏,如Minecraft,WoW等。

让我开始吧。

  1. 我首先想知道的是,互动如何起作用?我已经阅读了有关这方面的文档,它告诉我使用Socket,然后使用PrintWriter和BufferedReader进行输入和输出。

  2. (与1.相关)如果某人足够智能以反编译客户端,然后编辑发送的数据以更改位置值,并且当服务器接收数据时,它会将玩家重新定位到任何地方他们设置了新的位置。我该如何防止这种情况?

  3. 进行服务器/客户端交互的真实/最佳方式是什么?我是否使用Socket并在其中写入内容供客户端接收,或者我应该使用DatagramSocket和DatagramPacket?或者还有另一种方式吗?

  4. 我希望服务器与客户端分开,就像在几乎所有其他多人游戏中一样:你有一个启动服务器的文件,然后客户端可以连接到它。

    在此先感谢,我很想知道这个概念。

1 个答案:

答案 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所以你可以看到更复杂的东西。