4

私はビットとバイトにあまり興味がないので、この質問がばかげている場合は申し訳ありません。

通常、少量のプレーンテキストを転送するために、ソケットの使用経験があります。ただし今回は、UDP 経由で分割できるデータをさらに多く転送する必要があります。

サーバーが Java で記述されたゲームを開発しており、オブジェクトの配列をクライアントに送信したいと考えています。私は Web 開発者なので、JSON はデータを転送するために最初にポップアップするものですが、これがネットワーキングで最も効果的な方法であるとは思えません。

JSON の場合:

{
    "players": [
        {
            "id": "884B0EAA2C7F16BA",   // hex string
            "name": "some guy",         // string
            "x": 0,                     // double
            "y": 0,                     // double
            "xv": 0,                    // double
            "yv": 0,                    // double
            "angle": 0,                 // double
        }, {
            "id": "AB61F7C2AAE0B488",   // hex string
            "name": "some other guy",   // string
            "x": 0,                     // double
            "y": 0,                     // double
            "xv": 0,                    // double
            "yv": 0,                    // double
            "angle": 0,                 // double
        }
    ]
}

これで、プレーヤーごとにデータを分割するためのカスタム区切り文字と、データを分割するための別の区切り文字を追加することができました。私の見解では、最も効果的な方法の 1 つは、プレーヤーの値を行ごとに配置し、定義済みの文字シーケンスを値の間に配置することです。

884B0EAA2C7F16BA[|]some guy[|]0[|]0[|]0[|]0[|]0
AB61F7C2AAE0B488[|]some other guy[|]0[|]0[|]0[|]0[|]0

これは私にとってはうまくいきますが、名前などにはまだいくつかのセキュリティリスクがあります. 「[|]」を含む表示名が違法であることをクライアントに伝えることはほとんどできません。

転送するデータを最小限に抑える最も効果的な方法は何ですか?

暗号化に関する追加情報をいただければ幸いです。

4

2 に答える 2

5

Google Protocol Buffer の使用を検討してください。メッセージを (.proto ファイルで) 定義すると、さまざまなプログラミング言語でコードが生成されます。

生成されたコードは、データがどのようにエンコードされているかを考える必要なく、メッセージをエンコード/デコードできます。

エンコードされたメッセージは非常に小さく、エンコード/デコードが非常に高速です。プロトコル バッファは、その点で非常に優れています。

ウェブサイトには、それに関するいくつかの優れたドキュメントがあります: https://developers.google.com/protocol-buffers/

于 2012-07-12T11:25:24.443 に答える
1

転送するデータを最小限に抑えることが目標である場合は、複雑すぎない圧縮アルゴリズムをいつでも試すことができます (各パケットの圧縮と解凍に多くの時間を費やしたくありません)。この質問を見るか、このような外部ライブラリを検索できます。

データの各フィールドの長さを確実に把握できない場合は、何らかの区切り記号を使用する必要があります。プレイヤー名に一部の文字を使用しないようにすることは、ほぼすべてのゲームで使用されていますが、なぜそれができないのでしょうか?

それでもプレーヤー名で任意の文字を許可したい場合は、TCP ソケットを介してそれらすべてを一緒に送信し、各クライアントで ID-プレーヤー名のペアを使用してテーブルを作成し、UDP センテンスでサーバーから提供された一意の ID を使用します。そうすれば、デリミタを安全に使用できます。

于 2012-07-12T11:29:40.127 に答える