网络编码器未执行

时间:2016-02-04 17:54:53

标签: java netty

我用Netty制作了一台服务器,但我遇到了问题。我创建的编码器没有被执行。

我在服务器上的管道:

            bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            public void initChannel(SocketChannel ch) throws Exception {
                ch.pipeline().addLast("encoder", new PacketEncoder());
                ch.pipeline().addLast("decoder", new PacketDecoder());
                ch.pipeline().addLast(new LoginServerChannel());
            }
        });

我的编码器:

public class PacketEncoder extends MessageToByteEncoder<Packet> {

@Override
protected void encode(ChannelHandlerContext channelHandlerContext, Packet packet, ByteBuf byteBuf) throws Exception {
    System.out.println("Encoding");
}

我的解码器:

public class PacketDecoder extends ReplayingDecoder<DecoderState> {

@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
    ...
}

我的频道处理程序:

public class LoginServerChannel extends SimpleChannelInboundHandler<Packet> {

@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, Packet packet) throws Exception {
    channelHandlerContext.writeAndFlush(packet.encode());

    System.out.println("Sending");
}

调用解码器,然后调用通道处理程序,但不调用编码器。我试图改变管道中的顺序,但同样的问题也尝试使用fireChannelRead(...)和同样的问题。

由于

1 个答案:

答案 0 :(得分:1)

您的编码器扩展MessageToByteEncoder<Packet>,以便在输入中收到数据包进行编码时调用它。

在您的逻辑处理程序中,您执行

 channelHandlerContext.writeAndFlush( packet.encode() );

我认为encode()返回一个字节数组,因此您的编码器会忽略它并且什么都不做。

你可能应该这样做:

channelHandlerContext.writeAndFlush( packet );