6

您好,我有一个带有应该接受字符串的处理程序的 Netty 服务器。它似乎只接收最多 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();
}

}

4

2 回答 2

9

你在使用 UDP 吗?如果是这样,数据包将最大为 1024 字节。此代码注释在 QOTM 代码示例中:

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

另请注意,无论您如何配置此选项,路由器都可能截断或丢弃大型 UDP 数据包。在 UDP 中,如果数据包大于特定大小,则数据包将被截断或丢弃,具体取决于路由器配置。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);
}

说得通 ?

于 2012-10-26T15:23:23.187 回答
5

在 4.0.10.Final 版本中,UDP 缓冲区大小设置为 2048 字节。

如果你想增加它设置 ChannelOptions 如下:

option(ChannelOption.SO_RCVBUF, int bytes)

并且

option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(int Bytes))
于 2013-12-05T06:00:38.507 回答