1. Zero Copy传输
一般情况下,将服务器上的文件传输到客户端时,文件在服务端会经历如下copy过程:调用read方法从硬盘读文件到内核空间,从内核空间读到用户内存空间,然后调用socket的write方法,这时用户内存空间的文件数据又会进入到内存空间,然后发送到网卡经过网络传输。这一过程文件数据多次在用户空间和内核空间copy。linux上使用sendfile可避免这种copy,文件数据读到内核空间后直接从内核空间到网卡。
Netty显然也是支持这种机制的,无需把文件读出来然后发送。使用方法如下。
2. netty zero copy传输文件
这里假设是client端发送文件到server端,client端handler如下:
public class FileHandler extends ChannelOutboundHandlerAdapter {
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
//假设msg是client端发送的文件名
String fileName = (String)msg;
// 创建FileRegion,netty FileRegion使用了FileChannel # transferTo实现Zero Copy
FileRegion region = new DefaultFileRegion(new File(fileName),0,1000);
ctx.writeAndFlush(region);
}
}