使用Protocol Buffers和Netty 4.1.6

时间:2016-11-17 14:37:08

标签: java netty protocol-buffers

我有以下服务器和客户端初始化程序(两者都有非常相似的代码,只有sch更改为客户端的cch,两者都代表它们各自的处理程序。)

  @Override
  public void initChannel(SocketChannel ch) throws Exception {
       ch.pipeline().addLast("handler", sch);
       ch.pipeline().addLast(new CommonClassHandler());
       ch.pipeline().addLast("frameDecoder",
                    new ProtobufVarint32FrameDecoder());
       ch.pipeline().addLast("protobufDecoder",
                    new ProtobufDecoder(Server.MyMessage.getDefaultInstance()));
       ch.pipeline().addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
       ch.pipeline().addLast("protobufEncoder", new ProtobufEncoder());
  }

我希望在向客户端或服务器发送命令/操作时使用二进制格式,因此,我正在使用Google的Protocol Buffers

这是我在处理客户输入时创建builder的地方:

 while (channel.isOpen()) {
       Client.MyMessage.Builder builder = Client.MyMessage.newBuilder();
       String input = in.readLine();   // Save console input 
       builder.setKeyword(input);      // Set the value of keyword to said input
       channel.writeAndFlush(builder.build()); // Send the build to the server
  }

最后,这是在服务器/客户端收到消息时自动调用的方法:

 @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        ByteBuf bb = (ByteBuf)msg;
        String order = bb.toString(Charset.defaultCharset());
        System.out.println(order); // Displays received data

        Server.MyMessage.Builder builder = Server.MyMessage.newBuilder();
        builder.setKeyword("301");
        ctx.writeAndFlush(builder.build());
}

1)当显示我ByteBuf的内容时,它会在我的消息之前显示两个未知字符和一个“\ n”;也许我应该以另一种方式处理我收到的数据以进行正常显示?

2)显示收到的数据后,我的服务器应该将答案“301”发送给我的客户端,但没有用,因为我的客户端没有显示任何内容(该方法甚至没有被调用)在客户端处理程序中),有明显的原因吗?

请原谅我的问题,但很少有关于使用Netty 4.1.6协议缓冲区的文档。

1 个答案:

答案 0 :(得分:1)

您正在管道ch.pipeline().addLast("handler", sch);的开头添加处理程序,但是您应该将它放在管道的末尾,在protobufDecoder之后。

进行更改后,您应该开始接收MyMessage msg而不是ByteBuf。我猜你现在看到的未知字符是你所拥有的帧解码器所剥离的帧长度,但它不会在你的处理程序之后运行,就像你现在设置的东西一样。