Tar*_*Koc 4 c# java protocol-buffers netty
我想与Java服务器应用程序通信C#客户端应用程序.Java使用带有protobuf管道enconder的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;
}
Run Code Online (Sandbox Code Playgroud)
Netty管道编解码器:
p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
p.addLast("protobufDecoder", new ProtobufDecoder(LoginProtos.Credential.getDefaultInstance()));
p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
p.addLast("protobufEncoder", new ProtobufEncoder());
Run Code Online (Sandbox Code Playgroud)
那么我该如何向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();
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助,对不起我的英语.
这可能已经太晚了,但我感觉很仁慈,所以如果有人有类似的问题:
Netty只是帮助您设置服务器(任何类型的服务器,因为Netty是"传输不可知")的一般锅炉板代码,因此您可以实现它以使用TCP/IP,UDP等).有没有到了您必须遵守与服务器通信预先定义的网络协议(也就是使用了Netty运行).什么有效地定义了您的协议是您的管道.因此,从客户端的角度来看,无论您使用的是Netty服务器端都无关紧要.
在您的管道中(假设您的服务器管道),您已经定义了protobuf编码器和解码器.他们要做的是:
MessageLite对象,将其解码为字节并通过线路发送这些字节因此,如果您使用Java客户端测试服务器并且服务器正常工作,那么您的服务器就已经完成了很多工作.您现在需要做的就是使用一个C#库,它将对象转换为protobuf消息,连接到Java服务器并发送字节.
将C#中的对象转换为protobuf消息应该很简单:使用protobuf项目页面上第三方工具中的一个C#protobuf库来执行此操作.连接到您的服务器,并发送protobuf消息字节是您必须自己实现的.本质上,它不应该比为服务器端点创建套接字,将protobuf消息序列化为字节并通过套接字将这些字节发送到服务器更难.希望这能回答你的问题.
总结一下: Netty是您用来实现服务器的Java框架.Google protobuf是您用来定义消息(或更确切地说是合同)的框架.此时,客户端与服务器通信的唯一前提是客户端发送protobuf消息.Netty与客户无关.
| 归档时间: |
|
| 查看次数: |
3024 次 |
| 最近记录: |