0

我不确定从哪里开始以及如何开始,但我有几个关于服务器和客户端如何相互工作的问题。我对 Java 和任何编程都很陌生,所以我几乎一无所知。这些问题是关于多人游戏的,例如 Minecraft、WoW 等。

所以让我开始吧。

  1. 我想知道的第一件事是交互首先是如何工作的?我已经阅读了有关此的文档,它告诉我使用 Socket,然后使用 PrintWriter 和 BufferedReader 进行输入和输出。

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

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

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

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

4

1 回答 1

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,这是它使用的消息协议,因此您可以看到更复杂的协议是什么样的。

于 2013-11-10T01:51:22.083 回答