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 に答える