我有以下服务器和客户端初始化程序(两者都有非常相似的代码,只有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协议缓冲区的文档。
答案 0 :(得分:1)
您正在管道ch.pipeline().addLast("handler", sch);
的开头添加处理程序,但是您应该将它放在管道的末尾,在protobufDecoder之后。
进行更改后,您应该开始接收MyMessage
msg
而不是ByteBuf
。我猜你现在看到的未知字符是你所拥有的帧解码器所剥离的帧长度,但它不会在你的处理程序之后运行,就像你现在设置的东西一样。