2017-03-03 3 views
1

http://netty.io/wiki/user-guide-for-4.x.htmlリンクを使用してネットサーバーを作成しました。しかし、私は16384バイトまでしかデータを取得していません。netty SimpleChannelInboundHandlerメッセージは最大16354まで受信

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

あなたのOSがソケットからデータを読み取るとき、あなたのOSはそれをユーザスペースに渡します(あなたのケースではJava with netty)。 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)); 
    } 
} 

ネッティーもなどLineBasedFrameDecoderLengthFieldBasedFrameDecoderFixedLengthFrameDecoder、同様に私はあなたがそれらのいくつかを使用することができると信じて、さまざまなシナリオのための準備ができてハンドラの束を持っています。

一般的に、彼らはすべて同じことをします - いくつかの条件が満たされるまで収入バイトの読みを続けます。準備ができたら、readバイトをさらに渡します。

関連する問題