我想与Java服务器应用程序通信C#客户端应用程序。 Java使用带有protobuf管道enconder的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 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();
感谢您的帮助,对不起我的英语。
答案 0 :(得分:5)
这可能已经太晚了,但我感觉很仁慈,所以如果有人有类似的问题:
Netty只是帮助您处理设置服务器的一般锅炉板代码(任何类型的服务器,因为Netty是“传输不可知”,因此您可以实现它以使用TCP / IP,UDP等)。有一个没有预定义的网络协议,您必须遵守该协议才能与您的服务器(使用Netty运行)进行通信。什么有效地定义了您的协议是您的管道。因此,从客户端的角度来看,无论您使用的是Netty服务器端都无关紧要。
在您的管道中(假设您的服务器管道),您已经定义了protobuf编码器和解码器。他们要做的是:
MessageLite
对象,将其解码为字节并通过线路发送这些字节因此,如果您使用Java客户端测试服务器并且服务器正常工作,那么您的服务器就已经完成了很多工作。您现在需要做的就是使用一个C#库,它将对象转换为protobuf消息,连接到Java服务器并发送字节。
将C#中的对象转换为protobuf消息应该很简单:在protobuf项目页面上使用third party tools中的一个C#protobuf库来执行此操作。连接到您的服务器,并发送protobuf消息字节是您必须自己实现的。实质上,它不应该比创建服务器端点的套接字,将protobuf消息序列化为字节并通过套接字将这些字节发送到服务器更难。希望这能回答你的问题。
总结一下: Netty是您用来实施服务器的Java框架。 Google protobuf是您用来定义消息的框架(或者更确切地说是合同)。此时,客户端与服务器通信的唯一前提条件是客户端发送protobuf消息。 Netty与客户无关。
答案 1 :(得分:0)
这可能已经晚了,但是对于有这个问题的人来说,希望它有所帮助。
正如protobuf-csharp-port的文件所述,
如果你想要一个可以生成Java代码和C#代码的单个.proto文件,你只需要Java选项和C#选项。他们根本没有冲突。
https://code.google.com/p/protobuf-csharp-port/wiki/GettingStarted
您需要做的是确保您的java构建工具解释csharp导入,反之亦然。因此,您可以在java项目中包含csharp_options.proto文件;这个文件附带了protobuf-csharp-port的来源。