【问题标题】:Netty protobuf and google csharp proto usageNetty protobuf 和 google csharp proto 使用
【发布时间】:2025-12-16 00:05:01
【问题描述】:

我想将 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 服务器。 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();

感谢您的帮助,对不起我的英语。

【问题讨论】:

  • 我可以整天谈论 protobuf 编码,但是 - 我不熟悉这里的 Netty 部分。如果您能指出定义 Netty 协议定义的位置(不用担心 protobuf),我可能会提供帮助
  • 在 java 服务器上,我们读取了类似“Credential cr = (Credential) e.getMessage();”的消息如果我将 java 客户端与 protobuf 一起使用,则没有问题。但是如果我使用 C# 我无法阅读。 Netty 协议在上面。在我阅读之前,它会解码消息。如果您不熟悉 Netty,我认为很难解释它是如何为我工作的。
  • @user740668 它可能不是很复杂,但是...

标签: c# java protocol-buffers netty


【解决方案1】:

可能已经太晚了,但我觉得很仁慈,所以如果有人有类似的问题:

关于框架

Netty 只是帮助您使用用于设置服务器的一般样板代码(任何种服务器,因为 Netty 是“与传输无关的”,因此您可以实现它以使用 TCP/ IP、UDP 等)。 没有预定义的网络协议,您必须遵守该协议才能与您的服务器(使用 Netty 运行)进行通信。有效定义您的协议的是您的管道。因此,从客户端的角度来看,您是否使用 Netty 服务端是无关紧要的。

关于您的问题

在您的管道(假设这是您的服务器管道)中,您已经定义了 protobuf 编码器和解码器。他们要做的是:

  • 服务器 -> 客户端:假设服务器发送的是一个 protobuf MessageLite 对象,将其解码为字节并通过网络发送这些字节
  • 客户端->服务端:假设客户端发送的是一系列字节,可以解码为一个protobuf对象,如果可能就解码

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

将 C# 中的对象转换为 protobuf 消息应该很简单:使用 protobuf 项目页面上 third party tools 中的 C# protobuf 库之一来执行此操作。连接到您的服务器并发送 protobuf 消息字节是您必须自己实现的。从本质上讲,它不应该比为您的服务器端点创建一个套接字、将 protobuf 消息序列化为字节并通过套接字将这些字节发送到服务器更难。希望这能回答您的问题。

总结一下: Netty 是您用来实现服务器的 Java 框架。 Google protobuf 是您用来定义您的消息(或者更确切地说是合同)的框架。此时,客户端与您的服务器通信的唯一先决条件是客户端发送 protobuf 消息。 Netty 与客户端无关。

【讨论】:

    【解决方案2】:

    这可能也太晚了,但对于遇到此问题的任何人,希望它有所帮助。

    如 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 的源代码。

    【讨论】:

      最近更新 更多