2017-03-03 76 views
1

我寫了一個netty服務器使用http://netty.io/wiki/user-guide-for-4.x.html鏈接。但是我只能獲得高達16384字節的數據。netty SimpleChannelInboundHandler消息接收只能達到16384

public class DiscardServerHandler extends ChannelInboundHandlerAdapter 
{ 
    byte bNullArray[] = "".getBytes(); 
    String strFullData= new String(bNullArray,StandardCharsets.UTF_8);   
    @Override 
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception 
    { 
     try 
     { 
      String MsgRead; 
      ByteBuf in = (ByteBuf) msg; 
      MsgRead=in.toString(io.netty.util.CharsetUtil.UTF_8); 
      // here I get data only upto 1024 and this method get called 16 times. 
      // So total data received is == 1024*16 = 16384   
      strFullData = strFullData + MsgRead;  
     } 
     finally 
     { 
      ReferenceCountUtil.release(msg); 
     } 
    }  
    @Override 
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception 
    { 
     //WriteMyLog(strFullData);  
     //Here size of strFullData is 16384   
     strFullData = ProcessMyData(strFullData);  
     byte[] respByteBuf = strFullData.getBytes();     
     ByteBuf Resp1 = ctx.alloc().buffer(respByteBuf.length);  
     Resp1.writeBytes(respByteBuf);     
     ctx.write(Resp1);    
     ctx.flush(); 
     ctx.close(); 
    } 
} 

如何獲取更多數據?

回答

1

當你的操作系統從套接字中讀取一些數據時,它會將它傳遞給用戶空間(在你的情況下,使用netty的Java)。 16 * 1024是您的OS從套接字讀取的緩衝區大小,並傳遞給您。這意味着ChannelInboundHandlerAdapter處理程序不適合您的情況,如果您的消息超過此大小。您需要使用ByteToMessageDecoder。喜歡的東西:

public class MyBigMessageDecoder extends ByteToMessageDecoder { 
    @Override 
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { 
     if (in.readableBytes() < MY_BIG_MESSAGE_SIZE) { 
      return; 
     } 

     out.add(in.readBytes(MY_BIG_MESSAGE_SIZE)); 
    } 
} 

Netty的也有一堆不同情況下準備處理程序,如LineBasedFrameDecoderLengthFieldBasedFrameDecoderFixedLengthFrameDecoder,等等。我相信你可以使用其中的一些。

一般而言,它們都是這樣做的 - 繼續讀取收入字節,直到滿足某些條件。準備就緒後 - 它們會進一步傳遞讀取字節。