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只是帮助你用一般的模板代码来设置服务器(任何类型的服务器,因为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的文档中提到的,
https://code.google.com/p/protobuf-csharp-port/wiki/GettingStarted如果你想要一个可以生成Java代码和c#代码的.proto文件,你只需要Java选项和c#选项。它们根本不冲突。
您需要做的是确保您的java构建工具能够解释快速导入,反之亦然。因此,您可以包含csharp_options。Java项目中的Proto文件;这个文件是protobuf-csharp-port的源代码。