Netty protobuf和google csharp原型用法

时间:2011-05-05 20:32:32

标签: c# java protocol-buffers netty

我想与Java服务器应用程序通信C#客户端应用程序。 Java使用带有protobuf管道enconder的Ne​​tty框架。

我的原型文件:     导入“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();

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

2 个答案:

答案 0 :(得分:5)

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

关于框架

Netty只是帮助您处理设置服务器的一般锅炉板代码(任何类型的服务器,因为Netty是“传输不可知”,因此您可以实现它以使用TCP / IP,UDP等)。有一个没有预定义的网络协议,您必须遵守该协议才能与您的服务器(使用Netty运行)进行通信。什么有效地定义了您的协议​​是您的管道。因此,从客户端的角度来看,无论您使用的是Netty服务器端都无关紧要。

关于您的问题

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

  • 服务器 - >客户端:假设服务器发送的是protobuf MessageLite对象,将其解码为字节并通过线路发送这些字节
  • 客户 - >服务器:假设客户端发送的是一系列可以解码为protobuf对象的字节,并在可能的情况下对其进行解码

因此,如果您使用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的来源。