2016-02-04 3 views
0

Я сделал сервер с 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 (...) и та же проблема.

Благодаря

+0

Что делает ваш packet.encode() вернуться? – Ferrybig

+0

@Ferrybig в этот момент ничего. Печать не выполняется. – AtuaPrimade4

+0

Я тебя не понимаю. Он должен вернуть объект «Packet», этот пакетный объект будет передаваться далее по цепочке в кодер – Ferrybig

ответ

1

Ваш кодер расширяет MessageToByteEncoder<Packet> так это называется, когда принимается пакет на входе, чтобы кодировать его.

В вашей логике обработчика, вы

channelHandlerContext.writeAndFlush(packet.encode()); 

Я полагаю, что encode() возвращает массив байтов, так что ваш кодер игнорировать его и ничего не делать.

Вы, вероятно, должны сделать что-то вроде этого:

channelHandlerContext.writeAndFlush(packet);