目次
ゲームサーバーとクライアント間の通信には多くの形式があり、一部はhttpを使用し、一部はwebsocketを使用しますが、最も一般的なのはゲームで最も一般的なソケットサーバーです。その理由と作成方法については、本日、後で説明しますサーバーとクライアント間のプロトコルについて話しましょう。プロトコルの定義は、サーバーとクライアント間の通信の結果であり、一貫したデータ形式を形成しているため、誰もがそれを解析して、相手が何をして何をしているかを知ることができます。
当初はフォーマットをカスタマイズした方もいらっしゃいますが、コンパクトですが問題があり、安定性に欠ける場合があります。XMLを使用している人もいれば、jsonを使用している人もいます。問題は、フォーマットは良好ですが、ネットワークパッケージが大きすぎて適切でないことです。問題が存在する場合は、解決する必要があります。上記の問題に対する解決策はありますか?明白な答えは、今日話し合ったprotobufです。
protobufは、Googleのオープンソースのクロスプラットフォーム通信プロトコルであり、よりコンパクトで効率的です。あまり意味がありません。テキストを入力してください。
1. Javaプロジェクトリファレンス
以下の依存関係をpom.xmlに追加します。必要に応じてバージョンを選択できます
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.6.1</version>
</dependency>
2. protobufのファイル定義形式
option java_package ="com.gamwatcher.soulmsg";
option java_outer_classname = "SoulMsg";
option java_multiple_files = true;
message SOUL_UP_OUT{
required int64 uid =1;
repeated int64 costuid =2;
optional int64 useExp = 3;
}
ベーシックタイプ
.protoタイプ | Javaタイプ | 備考 |
---|---|---|
ダブル | ダブル | |
浮く | 浮く | |
int32 | int | 可変長エンコーディングを使用します。負の数をエンコードするには効率的ではありません。フィールドに負の数が含まれている可能性がある場合は、sint32を使用してください。 |
int64 | 長いです | 可変長エンコーディングを使用します。負の数のエンコードは十分に効率的ではありません。フィールドに負の数が含まれる可能性がある場合は、sint64を使用してください。 |
unit32 | int [1] | 常に4バイト。値が常に228より大きい場合、この型はuint32よりも効率的です。 |
unit64 | 長い[1] | 常に8バイト。値が常に256より大きい場合、この型はuint64よりも効率的です。 |
sint32 | int | 可変長エンコーディングを使用します。符号付き整数値。エンコーディングは通常のint32よりも効率的です。 |
sint64 | 長いです | 可変長エンコーディングを使用します。符号付き整数値。エンコーディングは、通常のint64よりも効率的です。 |
fixed32 | int [1] | |
fixed64 | 長い[1] | 常に8バイト。値が常に256より大きい場合、この型はuint64よりも効率的です。 |
sfixed32 | int | 常に4バイト。 |
sfixed64 | 長いです | 常に8バイト。 |
ブール | ブール | |
ストリング | ストリング | 文字列は、UTF-8エンコードまたは7ビットASCIIエンコードテキストである必要があります。 |
バイト | ByteString | バイトデータを任意の順序で含めることができます |
特別な分野
英文 | 中国人 | 備考 |
---|---|---|
列挙型 | 列挙(ゼロから始まる数値)は、フィールドの「事前定義された値のシーケンス」を指定するために使用されます | 列挙型{MAN = 0; WOMAN = 1; その他= 3;} |
メッセージ | 消息体 | メッセージユーザー{} |
繰り返される | 配列/コレクション | 繰り返しユーザーユーザー= 1 |
インポート | インポート定義 | 「protos / other_protos.proto」をインポート |
// | コメント | //コメントに使用 |
伸ばす | 拡大する | ユーザー{}を拡張 |
パッケージ | パッケージ名 | 名前空間に相当し、異なるメッセージタイプの明確な競合を防止するために使用されます |
3. Javaクラスを生成する
ダウンロードプロトコル:https://github.com/protocolbuffers/protobuf/releases
protoc.exe --java_out = ../../src/main/java **.proto
4.利用規約
SOUL_UP_OUT.Builder builder = SOUL_UP_OUT.newBuilder();
builder.setUid(1);
builder.addAllCostUid(costUidList);
builder.setUserExp(1000)
builder.build()
5.ゲームプロジェクトでの使用方法
通常のプロトコル形式:
len +暗号化[headMsgId + protoバイナリデータ]
一般的に使用される暗号化アルゴリズム:AESおよびRSA、DES、シンプルで効率的なアルゴリズムを選択します。ゲームが燃えている場合は、もう少し複雑な暗号化アルゴリズムに変更できます。重要ではありません。
クライアントは、長さに従ってデータ長を解析し、分析を読み取ります。とても簡単!!!、サーバー側の同じルール。クライアントとサーバー間の通信はとても簡単です。
概要:protobufは単なるプロトコルフォーマットであり、メッセージをカスタマイズするプロセスを節約します。既製のホイールがあるため、自分で作る必要はありません。また、他のホイールほど良くする必要はありません。最初にそれらを使用してから、原則を理解することはできますが、大したことではありません。 。