【问题标题】:netty SimpleChannelInboundHandler message receive only upto 16384netty SimpleChannelInboundHandler 消息只接收到 16384
【发布时间】:2017-03-04 20:58:33
【问题描述】:

我使用http://netty.io/wiki/user-guide-for-4.x.html 链接编写了一个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(); 
    }
}

如何获取更多数据?

【问题讨论】:

    标签: netty


    【解决方案1】:

    当您的操作系统从套接字读取一些数据时,它会将其传递给用户空间(在您的情况下是带有 netty 的 Java)。 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));
        }
    }
    

    Netty 还有一堆针对不同场景的现成处理程序,如LineBasedFrameDecoderLengthFieldBasedFrameDecoderFixedLengthFrameDecoder 等。我相信你可以使用其中的一些。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 2014-07-14
      • 2018-04-26
      • 2021-06-07
      • 2020-10-27
      • 2018-03-30
      • 2015-09-28
      • 2018-12-15
      相关资源
      最近更新 更多