4

我想将 C# 客户端应用程序与 Java 服务器应用程序通信。Java 使用带有 protobuf 管道编码器的 Netty 框架。

我的原型文件:导入“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 Server。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对象,将其解码为字节并通过网络发送这些字节
  • Client -> Server:假设客户端发送的是一系列字节,可以解码成一个protobuf对象,如果可能的话就解码

因此,如果您使用 Java 客户端来测试您的服务器并且您的服务器可以正常工作,那么您的服务器就基本完成了。您现在需要做的就是使用一个 C# 库,它将对象转换为 protobuf 消息,连接到您的 Java 服务器并发送字节。

将 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 构建工具解释,反之亦然。因此,您可以在您的 java 项目中包含 csharp_options.proto 文件;该文件附带 protobuf-csharp-port 的源代码。

于 2014-03-26T12:18:17.100 回答