我用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(...)和同样的问题。
由于
答案 0 :(得分:1)
您的编码器扩展MessageToByteEncoder<Packet>
,以便在输入中收到数据包进行编码时调用它。
在您的逻辑处理程序中,您执行
channelHandlerContext.writeAndFlush( packet.encode() );
我认为encode()
返回一个字节数组,因此您的编码器会忽略它并且什么都不做。
你可能应该这样做:
channelHandlerContext.writeAndFlush( packet );