Netty 使用Zero Copy传输文件

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);
    }
}

你可能感兴趣的:(Netty 使用Zero Copy传输文件)