4

C#クライアントアプリケーションとJavaサーバーアプリケーションを通信したい。Javaは、protobufパイプラインエンコンダーでNettyフレームワークを使用します。

私のProtoファイル:import "google / protobuf / csharp_options.proto";

option (google.protobuf.csharp_file_options).namespace = "ChatClient.LoginProtocol";
option (google.protobuf.csharp_file_options).umbrella_classname = "LoginProtocol";

option optimize_for = SPEED;

message Credential {
   required string email = 1;
   required string password = 2;

}

Nettyパイプラインコーデック:

p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
p.addLast("protobufDecoder", new   ProtobufDecoder(LoginProtos.Credential.getDefaultInstance()));

    p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
    p.addLast("protobufEncoder", new ProtobufEncoder());

では、どうすればJavaサーバーにメッセージを送信できますか。c#コード:

stream = client.GetStream();
sReader = new StreamReader(stream);
sWriter = new StreamWriter(stream);

Credential.Builder builder = Credential.CreateBuilder();

 builder.SetEmail("xxx@gmail.com").SetPassword("12356");

 sWriter.Write(builder.Build().ToByteArray());

 sWriter.Flush();

助けてくれてありがとう、そして私の英語をごめんなさい。

4

2 に答える 2

5

もう手遅れかもしれませんが、私は親切に感じているので、誰かが同様の質問をしている場合に備えて:

フレームワークについて

Netty は、サーバー (Netty は「トランスポートに依存しない」ため、あらゆる種類のサーバーであり、TCP/IP、UDP などを使用するように実装できます) のセットアップに使用される一般的なボイラー プレート コードを単純に支援します。サーバー (Netty を使用して実行されている) と通信するために準拠しなければならない定義済みのネットワーク プロトコルはありませ。プロトコルを効果的に定義するのはパイプラインです。したがって、クライアントの観点からは、サーバー側の Netty を使用しているかどうかは関係ありません。

あなたの問題について

パイプライン (サーバー パイプラインであると仮定) で、protobuf エンコーダーとデコーダーを定義しました。彼らがすることは次のとおりです。

  • サーバー -> クライアント: サーバーが送信しているものは protobufMessageLiteオブジェクトであると想定し、それをバイトにデコードし、これらのバイトをネットワーク経由で送信します。
  • クライアント -> サーバー: クライアントが送信しているのは、protobuf オブジェクトにデコードできる一連のバイトであると想定し、可能であればそれをデコードします。

したがって、Java クライアントを使用してサーバーをテストし、サーバーが動作する場合は、サーバーの使用はほぼ完了です。あとは、オブジェクトを protobuf メッセージに変換し、Java サーバーに接続してバイトを送信する C# ライブラリを使用するだけです。

C# のオブジェクトを protobuf メッセージに変換するのは簡単です。これを行うには、protobuf プロジェクト ページのサード パーティ ツールから C# protobuf ライブラリのいずれかを使用します。サーバーへの接続と protobuf メッセージ バイトの送信は、自分で実装する必要があります。本質的には、サーバー エンドポイントへのソケットを作成し、protobuf メッセージをバイトにシリアル化し、ソケットを介してこれらのバイトをサーバーに送信するよりも、それほど難しいことではありません。うまくいけば、これはあなたの質問に答えます。

要約すると、Netty は、サーバーの実装に使用した Java フレームワークです。Google protobuf は、メッセージ (またはコントラクト) を定義するために使用したフレームワークです。この時点で、クライアントがサーバーと通信するための唯一の前提条件は、クライアントが protobuf メッセージを送信することです。Netty はクライアントには関係ありません。

于 2011-10-16T19:25:06.480 に答える
0

これもおそらく遅いですが、この問題を抱えている人にとっては、助けになることを願っています.

protobuf-csharp-port のドキュメントに記載されているように、

Java コードと C# コードを生成できる単一の .proto ファイルが必要な場合は、Java オプションと C# オプションだけが必要です。それらはまったく衝突しません。

https://code.google.com/p/protobuf-csharp-port/wiki/GettingStarted

あなたがする必要があるのは、csharp インポートが Java ビルド ツールによって解釈されること、またはその逆であることを確認することです。したがって、csharp_options.proto ファイルを Java プロジェクトに含めることができます。このファイルには、protobuf-csharp-port のソースが付属しています。

于 2014-03-26T12:18:17.100 に答える