我想与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; }
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();
感谢您的帮助,对不起我的英语.
这可能已经太晚了,但我感觉很仁慈,所以如果有人有类似的问题:
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是您用来定义消息(或更确切地说是合同)的框架.此时,客户端与服务器通信的唯一前提是客户端发送protobuf消息.Netty与客户无关.