我想控制数据传输的带宽。
根据Netty文件,他们建议:
在处理程序中,您应该考虑使用channel.isWritable()和channelWritabilityChanged(ctx)来处理可写性,或者在ctx.write()返回的将来通过future.addListener(new GenericFutureListener())来处理可写性。
这是我的通道初始化程序源代码:
public class MyChannelInitializer extends ChannelInitializer<Channel>
{
private int mode;
private Server server;
private String fileName;
public MyChannelInitializer(Server server, int mode,String fileName)
{
this.mode=mode;
this.server=server;
this.fileName=fileName;
}
@Override
protected void initChannel(Channel ch) throws Exception
{
if (this.mode==MyFtpServer.RECEIVEFILE)
{
ch.pipeline().addLast(new ChannelTrafficShapingHandler(0L,10240L));
ch.pipeline().addLast(new ReceiveFileHandler(this.fileName,server));
}
else
{
ch.pipeline().addLast(new ChannelTrafficShapingHandler(10240L,0L));
ch.pipeline().addLast("streamer", new ChunkedWriteHandler());
ch.pipeline().addLast("handler",new SendFileHandler(this.fileName,server));
}
}
}
这是发送文件处理程序源代码:
public class SendFileHandler extends SimpleChannelInboundHandler<ByteBuf>
{
String fileName;
PassiveServer txServer=null;
public SendFileHandler(String fileName, PassiveServer txServer)
{
this.fileName=fileName;
this.txServer=txServer;
}
public void channelWritabilityChanged(ChannelHandlerContext ctx)throws IOException
{
System.out.println("isWritable="+ctx.channel().isWritable());
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws IOException
{
System.out.println("SendFileHandler active");
}
}
您能告诉我为什么我的SendFileHandler中的“ channelWritabilityChanged”方法从不触发,而仅触发channelActive方法。
在我将SendFileHandler.channelActive方法更改为以下内容之后:
public void channelActive(ChannelHandlerContext ctx) throws IOException
{
Calendar startTime;
System.out.println("SendFileHandler active");
startTime=Calendar.getInstance();
ctx.fireChannelWritabilityChanged();
}
SendFileHandler.channelWritabilityChanged方法仍未触发。
谁能告诉我为什么?
最佳答案
我相信因为ChunkedWriteHandler可以直接考虑可写性来完成这项工作。但是,由于channelWritabilityChanged
中的最后一个代码是:
ctx.fireChannelWritabilityChanged();
您应该更改可写性信号。
但是,您发送任何文件吗?因为在您的代码中,没有,因此没有
channelWritabilityChanged
,因为似乎根本没有写操作,所以不应该对它进行更改(当然,可写性仅发生在写部分,而不发生在读部分)。您也可以查看this thread regarding traffic shaping。