2013-09-29 16 views
0

我現在使用的框架Netty的Android和有問題,當我收到大量的數據:接收較大的ByteBuffer的Android

@Override public void channelRead(final ChannelHandlerContext ctx, Object msg) { 
    bufferIn = (ByteBuf) msg; 
    if (bufferIn.readableBytes() >= 4) { 
     size = bufferIn.readInt(); 
     result = bufferIn.toString(CharsetUtil.ISO_8859_1); 
     if(size == result.length){ 
      Log.d("D", "RECEIVED: " + size + " " + result); 
     } 
     ctx.flush(); 
    } 
    bufferIn.release(); 

}

當我收到它進來的數據包的數據,我不知道如何收到這些包裹。 感謝

我添加一行:

ch.pipeline().addLast(new NettyDecoder(), new NettyHandler(service, size, message, listener)); 

在解碼器:

class NettyDecoder extends ByteToMessageDecoder 

@Override protected void decode(final ChannelHandlerContext theContext, final ByteBuf in, List<Object> out) throws Exception { 
    if (in.readableBytes() < 4) { 
     return; 
    } 
    in.markReaderIndex(); 
    int dataLength = in.readInt(); 
    if (in.readableBytes() < dataLength) { 
     in.resetReaderIndex(); 
     return; 
    } 
    byte[] decoded = new byte[dataLength]; 
    in.readBytes(decoded); 
    out.add(decoded); 
    //out.add(in.readBytes(in.readableBytes())); 
} 

在處理程序:

void channelRead(final ChannelHandlerContext ctx, Object msg) { 
    ByteBuf m = (ByteBuf) msg; 
    bufferIn.writeBytes(m); 
    m.release(); 
    if (bufferIn.readableBytes() >= 4) { 
     size = bufferIn.readInt(); 
     for (int i = 0; i < bufferIn.capacity(); i ++) { 
      byte b = bufferIn.getByte(i); 
     result += (char) b; 
     } 
    } 
    Log.d("WEB", "RESULT: " + size + " " + result.getBytes().length + " " + result); 
     bufferIn.release(); 

但現在我不想收到任何消息NettyHandler。

有人可以教我如何接收處理程序上的消息?

回答

0

我想你想擴展ByteToMessageDecoder並讓它做需要的聚合工作。有關更多詳細信息,請參閱它的javadocs。

+0

好的諾曼,我會找的,你知道我在哪裏可以找到一個例子嗎? –

+0

NETTY中有許多編解碼器使用它...只需檢查編解碼器模塊。 –