Netty增加ChannelBuffer大小

时间:2012-10-26 12:01:57

标签: java netty

你好我有一个Netty Server,它有一个应该接受字符串的处理程序。它似乎只接收最多1024个字节的内容。如何增加缓冲区大小。我已经尝试了

bootstrap.setOption("child.sendBufferSize", 1048576); 
bootstrap.setOption("child.receiveBufferSize", 1048576);

没有成功。

处理程序如下

public class TestHandler extends SimpleChannelHandler {


@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {

    ChannelBuffer buf = (ChannelBuffer) e.getMessage();

    String response = "";

    if (buf.readable()) {

        response = buf.toString(CharsetUtil.UTF_8);
        System.out.println("CONTENT: " + response);
    }

    System.out.println(response);


}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
    e.getCause().printStackTrace();

    Channel ch = e.getChannel();
    ch.close();
}

}

2 个答案:

答案 0 :(得分:9)

您使用的是UDP吗?如果是这样,数据包将以1024字节最大。此代码注释位于QOTM代码示例中:

  

允许最大1024字节的数据包(默认为768)。你可以   增加或减少此值以避免截断的数据包或   分别改善内存占用。

     

请注意,大型UDP数据包可能会被截断或丢弃   无论您如何配置此选项,您的路由器。在UDP中,a   如果数据包大于某个大小,则会被截断或丢弃,   取决于路由器配置。 IPv4路由器截断和IPv6   路由器丢弃一个大包。这就是为什么小发送是安全的原因   UDP中的数据包。

如果您使用的是TCP,则应在处理之前将一个帧解码器和一个字符串解码器添加到管道中;像这样:

pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(80960, Delimiters.lineDelimiter()));
pipeline.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8));
pipeline.addLast("myHandler", new TestHandler());

请注意,您需要修改测试处理程序,因为MessageEvent实际上将包含您的字符串。

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    String response = (String) e.getMessage();
    System.out.println(response);
}

有意义吗?

答案 1 :(得分:5)

在版本4.0.10中.Final for UDP Buffer size设置为2048字节。

如果您想增加它,请按如下方式设置ChannelOptions:

option(ChannelOption.SO_RCVBUF, int bytes)

以及

option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(int Bytes))