Netty protobuf和google sharp protobuf的用法

本文关键字:protobuf 用法 sharp google Netty | 更新日期: 2023-09-27 17:54:53

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

My Proto file:导入"谷歌/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();

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

Netty protobuf和google sharp protobuf的用法

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

关于框架

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

关于你的问题

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

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

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

将c#中的对象转换为protobuf消息应该很简单:使用protobuf项目页面上的第三方工具中的c# protobuf库之一来完成此操作。连接到服务器并发送protobuf消息字节是您必须自己实现的事情。从本质上讲,它不应该比创建到服务器端点的套接字、将protobuf消息序列化为字节并通过套接字将这些字节发送到服务器困难得多。希望这能回答你的问题。

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

这可能太迟了,但对于任何有这个问题的人,希望它能有所帮助。

正如在protobuf-csharp-port的文档中提到的,

如果你想要一个可以生成Java代码和c#代码的.proto文件,你只需要Java选项和c#选项。它们根本不冲突。

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

您需要做的是确保您的java构建工具能够解释快速导入,反之亦然。因此,您可以包含csharp_options。Java项目中的Proto文件;这个文件是protobuf-csharp-port的源代码。