2015-06-30 70 views
2

我是新來的Netty 4.0.29,並努力使自定義對象編碼器,並使用KRYO作爲序列化庫對象解碼器,我無法使它工作。因爲我是Netty的新手,也許這就是我搞亂某些東西的原因。我使用MessageToMessageEncoderMessageToMessageDecoderNetty的編碼器和解碼器使用KRYO系列化

這裏是我的編碼器 -

public class KryoEncoder extends MessageToMessageEncoder<Object>{ 

    private Kryo kryo; 
    private Output output; 

    public KryoEncoder(Kryo kryo, int bufSize, int maxBufSize) { 
     this.kryo = kryo; 
     output = new Output(bufSize, maxBufSize); 
    } 

    @Override 
    protected void encode(ChannelHandlerContext ctx, Object msg, 
      List<Object> out) throws Exception { 
     output.clear(); 
     kryo.writeClassAndObject(output, msg); 
     int total = output.position(); 
     out.add(Unpooled.wrappedBuffer(output.getBuffer(), 0 , total)); 
    } 

} 

這裏是解碼器 -

public class KryoDecoder extends MessageToMessageDecoder<Object>{ 
    private Kryo kryo; 
    private Input input; 

    public KryoDecoder (Kryo kryo) { 
     this.kryo = kryo; 
     input = new Input(); 
    } 

    @Override 
    protected void decode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception { 
     ByteBuf buffer = (ByteBuf)msg; 
     byte[] ar = new byte[buffer.readableBytes()]; 
     buffer.readBytes(ar); 
     input.read(ar, buffer.readerIndex(), buffer.readableBytes()); 
     Object object = kryo.readClassAndObject(input); 
     buffer.readerIndex(input.position()); 
     out.add(object); 
    } 
} 

這裏是異常的短棧拋出,我知道它是一個空指針異常,在解碼器的字節數組中有某些地方出錯,但不知道是什麼。

Caused by: java.lang.NullPointerException 
    at java.lang.System.arraycopy(Native Method) 
    at com.esotericsoftware.kryo.io.Input.read(Input.java:254) 
    at TestWithKryo.KryoDecoder.decode(KryoDecoder.java:31) 
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) 
    ... 14 more 

例外解碼和我檢查了編碼併發送編碼的對象時檢查的ChannelFuture,並沒有拋出任何異常時,會發生。再次

,因爲我真正的新網狀我可能做的東西真的錯了,所以請讓我知道。

回答

1

我覺得這個更好的將是ByteToMessageDecoder和MessageToByteEncoder。不要忘記發送第一個數據長度,否則你不會識別一個數據包開始和另一個結束的位置。還有就是我的簡單的例子:

public class KryoDecoder extends ByteToMessageDecoder { 

    private final Kryo kryo; 

    public KryoDecoder(Kryo kryo) { 
     this.kryo = kryo; 
    } 

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

     if (in.readableBytes() < 2) 
      return; 

     in.markReaderIndex(); 

     int len = in.readUnsignedShort(); 

     if (in.readableBytes() < len) { 
      in.resetReaderIndex(); 
      return; 
     } 

     byte[] buf = new byte[len]; 
     in.readBytes(buf); 
     Input input = new Input(buf); 
     Object object = kryo.readClassAndObject(input); 
     out.add(object); 

    } 
} 

和編碼器

public class KryoEncoder extends MessageToByteEncoder<Object> { 

    private final Kryo kryo; 

    public KryoEncoder(Kryo kryo) { 
     this.kryo = kryo; 
    } 

    @Override 
    protected void encode(ChannelHandlerContext ctx, Object in, ByteBuf out) throws Exception { 
     ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
     Output output = new Output(outStream, 4096); 

     kryo.writeClassAndObject(output, in); 
     output.flush(); 

     byte[] outArray = outStream.toByteArray(); 
     out.writeShort(outArray.length); 
     out.writeBytes(outArray); 
    } 

} 
+0

也可以你只要給我,爲什麼我的解決辦法是行不通的,因爲我想知道什麼是我做錯了一個簡短的說明。 – Sneh

+0

主要問題是使用input.read(ar,buffer.readerIndex(),buffer.readableBytes());'。您嘗試從輸入中的緩衝區中讀取,此時該值爲null。 –

+0

我沒有接受你的答案,因爲一旦我連接3個客戶端,解碼器就會彈出。對象對象= kryo.readClassAndObject(input);在解碼器的這一行拋出一個空指針異常 Object object = kryo.readClassAndObject(input); – Sneh