【发布时间】:2017-08-02 16:03:10
【问题描述】:
我正在尝试了解 netty 缓冲区和水印。
作为一个测试用例,我有一个写入客户端的 netty 服务器,客户端被阻塞(每次读取之间基本上有 10 秒的睡眠)
在正常 I/O 下,如果接收方被阻塞,TCP 发送方将受到限制(由于流量控制,发送速度变慢),这里不是这种情况。发件人似乎在每次发送时都在不断写入和刷新数据。这些数据写在哪里? netty 的 flush() 中也会有流控制吗? 见:https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Flow_control
它是否正在写入操作系统或 TCP 缓冲区,netty 通道是否也有内部缓冲区?如果可以,我该如何配置?
我跟踪 bytesBeforeUnwritable 但它们似乎没有减少
- 什么是默认的高水位线和低水位线?我没有在我的应用程序中设置任何东西。有什么方法可以代替它吗?
代码如下:
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) {
if (server2OutboundChannel.isActive()) {
if(server2OutboundChannel.isWritable()) {
server2OutboundChannel.writeAndFlush(msg).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
if (future.isSuccess()) {
// was able to flush out data, start to read the next chunk
//System.out.println(server2OutboundChannel.bytesBeforeUnwritable());
ctx.channel().read();
} else {
future.channel().close();
}
}
});
}else{
System.out.println("Channel is no longer writeable");
System.out.println(server2OutboundChannel.bytesBeforeUnwritable());
System.out.println(server2OutboundChannel.bytesBeforeWritable());
}
}
}
使用端到端源代码重新创建的详细步骤:
具体来说,代理代码在这里:
https://github.com/nipunarora/nettyDuplicator/tree/master/src/main/java/org/columbia/parikshan/proxy
-
编译和构建:
mvn package -
启动服务器
sh scripts/Server.sh 3380 -
启动网络代理
sh scripts/nettyProxy.sh -l 0.0.0.0:3379 -o 127.0.0.1:3380 -
启动客户端
sh scripts/Client.sh 127.0.0.1 3379 在客户端发送“hello”作为标准输入
netty 会在一段时间后阻止发送,并且 bytesTillUnwritable 不会减少。
【问题讨论】:
标签: java tcp buffer netty channel