1

当客户端发送大文件时,如何限制 netty 创建的入站缓冲区的大小?我希望客户端在 ByteBuf 已满时停止通过网络发送数据,并在准备好接收更多数据时恢复。

这是我的处理程序代码:

public class MyDecoder extends ChannelInboundHandlerAdapter {

@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
    // limit the size of recieving buffer to 1024
    ctx.channel().config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(1024));
    }

@Override public void messageReceived(ChannelHandlerContext ctx, MessageList<Object> msgs) throws Exception {
    ByteBuf byteBuf = msgs.<ByteBuf>cast().get(0);
    // stop after this line in debugger to check size of the actual payload per messageReceived invocation
    int bufferSize = byteBuf.readableBytes();
    }
}

现在假设在我的测试中我写:

EmbeddedChannel ch = new EmbeddedChannel(new MyDecoder());
ch.writeInbound(Unpooled.wrappedBuffer(<<<here is a byte representation of a large file, say 100 mb>>>));
ch.readInbound(); // etc... 

现在,当我在调试器中到达计算 bufferSize 的行时,我总是得到我的大文件的完整大小。FixedRecvByteBufAllocator 在这一点上的唯一区别是它的大小设置为 0 - 所有其他值产生相同的结果。

在 netty 4 cr2 中有一个方法可以达到这个目的,newInboundBuffer,但在 cr6 及更高版本中没有这样的构造。

4

1 回答 1

1

如果不是这种情况,FixedRecvByteBufAllocator 应该将缓冲区限制为最大 1024 字节,这是一个错误。

于 2013-07-01T20:43:25.537 回答