netty SimpleChannelInboundHandler消息最多只能接收16384条

netty SimpleChannelInboundHandler消息最多只能接收16384条,netty,Netty,我已经使用link编写了一个netty服务器。但我得到的数据最多只有16384字节 public class DiscardServerHandler extends ChannelInboundHandlerAdapter { byte bNullArray[] = "".getBytes(); String strFullData= new String(bNullArray,StandardCharsets.UTF_8); @Override

我已经使用link编写了一个netty服务器。但我得到的数据最多只有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(); 
    }
}

如何获取更多数据?

当您的操作系统从套接字读取一些数据,然后将其传递到用户空间(在您的例子中是Java和netty)。16*1024是操作系统从套接字读取并传递给您的缓冲区大小。这意味着如果您的邮件超过此大小,
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));
    }
}
公共类MyBigMessageDecoder扩展为ByteToMessageDecoder{
@凌驾
受保护的无效解码(ChannelHandlerContext ctx、ByteBuf输入、列表输出){
if(in.readableBytes()
Netty还为不同的场景提供了一系列现成的处理程序,如
LineBasedFrameDecoder
LengthFieldBasedFrameDecoder
FixedLengthFrameDecoder
,等等。我相信您可以使用其中的一些

一般来说,它们都做相同的事情——继续读取收入字节,直到满足某些条件。当准备就绪时,它们会进一步传递读取字节