0

Java クライアントは、次のスケルトンに従ってメッセージを構築します。

package tutorial;

option java_package = "com.example.sff.piki2";
option java_outer_classname = "MsgProtos";

message MSG {

 required string guid = 1; 
 required int32 MsgCode = 2;
 required int32 From = 3;  //sender
 ...

このメッセージは C# プログラム (サーバー側) に送信されます。

サーバーはバイトの読み取り方法を認識しています (最初のバイトは読み取るバイト数で、次のメッセージのサイズを表します)。

これは、MSG がバイト配列によって構築されている方法です。

 MSG Msg = MSG.CreateBuilder().MergeFrom(buffer).Build();

buffer は、ソケットから読み取ったバイト配列です。

しかし今、サーバーが稼働しているかどうかを確認するために、クライアントが「ハートビート」メッセージ( 別のメッセージ)を送信する必要がある状況にあります。(サーバーは応答する必要があります: 「はい、私は生きています」 )

もちろん、MSGクラスに別のフィールドを追加できます。MSGしかし、クラスにはハートビート操作のために不要なフィールドがたくさんあるため、そうしたくありません。

質問 :

サーバーは n バイトを読み取りました。MSGこれがメッセージか「ハートビート」メッセージかを知ることができる方法はありますか?

4

1 に答える 1

1

これがMSGメッセージなのか「ハートビート」メッセージなのかを知る方法はありますか?

いいえ。プロトコル バッファ メッセージには、そのようなタイプの情報は含まれていません。通常、これを回避する方法は、送信する可能性のある各メッセージのフィールドを持つ「ラッパー」タイプを用意することです。これを として表現するのが理想的ですoneofが、私のポートは (まだ) サポートしていません。

オーバーヘッドは最小限ですが、もちろんプロトコルの変更になるため、既存のサーバーなどについて考える必要があります。

于 2015-01-04T08:47:49.813 に答える