NioSocketChannel.doWrite(ChannelOutboundBuffer in)
和flush类型,循环spin次一直write,只是write的方法调用不一样
} else if (msg instanceof FileRegion) {
FileRegion region = (FileRegion) msg;
boolean done = region.transferred() >= region.count();
if (!done) {
long flushedAmount = 0;
if (writeSpinCount == -1) {
writeSpinCount = config().getWriteSpinCount();
}
for (int i = writeSpinCount - 1; i >= 0; i--) {
long localFlushedAmount = doWriteFileRegion(region);
if (localFlushedAmount == 0) {
setOpWrite = true;
break;
}
flushedAmount += localFlushedAmount;
if (region.transferred() >= region.count()) {
done = true;
break;
}
}
in.progress(flushedAmount);
}
if (done) {
in.remove();
} else {
// Break the loop and so incompleteWrite(...) is called.
break;
}
}
fileRegion的write方法是调用transferTo,零拷贝
@Override
protected long doWriteFileRegion(FileRegion region) throws Exception {
final long position = region.transferred();
return region.transferTo(javaChannel(), position);
}
本文深入探讨了NioSocketChannel的写操作机制,包括doWrite和flush类型的循环spin写入过程,以及FileRegion的transferTo零拷贝写方法。通过分析writeSpinCount配置和region.transferred状态,揭示了NioSocketChannel内部高效的数据传输策略。
1015

被折叠的 条评论
为什么被折叠?



