【Netty】零拷贝案例 ( transferTo | transferFrom )(一)

简介: 【Netty】零拷贝案例 ( transferTo | transferFrom )(一)

一、 案例需求


给出两个案例 , 一个是 使用普通的 BIO 模型 传输文件的案例 , 一个是 NIO + 零拷贝 传输文件案例 ;


传输 20M 的文件 , 对比二者的传输效率 ;






二、 传统 BIO 拷贝案例


服务器端使用 ServerSocket , 客户端使用 Socket , 在客户端将文件传输给服务器端 , 并统计整体的时间消耗 ;



1 . 服务器端代码 : 服务器端程序启动后 , 监听 8888 端口 , 等待客户端连接 , 客户端连接成功后 , 读取客户端上传的数据 , 服务器端将接收到的数据存储在 book2.pdf 文件中 ;


package kim.hsl.nio.zerocopy;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class BIOFileServerDemo {
    public static void main(String[] args) {
        try {
            // 1. 创建服务器套接字, 并等待客户端连接
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("服务器启动,监听 8888 端口");
            //阻塞, 等待客户端连接请求 ( 此处是第一个阻塞点 )
            Socket socket = serverSocket.accept();
            long startTime = System.currentTimeMillis();
            System.out.println("客户端连接成功");
            // 2. 接收客户端传输的数据, 并写出到文件中
            InputStream inputStream = socket.getInputStream();
            FileOutputStream fileOutputStream = new FileOutputStream("book2.pdf");
            byte[] buffer = new byte[4096];
            int readLen;
            // 读取的字节个数大于等于 0 才写出数据
            while ( ( readLen = inputStream.read(buffer) ) >= 0 ) {
                // 写出数据到服务器
                fileOutputStream.write(buffer, 0, readLen);
            }
            System.out.println("文件传输完毕, 用时 : " + (System.currentTimeMillis() - startTime) + " ms");
            // 3. 关闭流
            socket.close();
            inputStream.close();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



2 . 客户端代码 : 客户端连接本地的 8888 端口服务器 , 读取本地的 book.pdf 文件 , 将其传输到服务器中 ;


package kim.hsl.nio.zerocopy;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;
public class BIOFileClientDemo {
    public static void main(String[] args) {
        try {
            // 1. 客户端连接服务器
            Socket socket = new Socket();
            InetSocketAddress inetSocketAddress =
                    new InetSocketAddress(Inet4Address.getLocalHost(), 8888);
            socket.connect(inetSocketAddress);
            System.out.println("客户端连接服务器成功, 开始传输文件 ...");
            long startTime = System.currentTimeMillis();
            // 2. 从文件中读取数据数据并传给服务器
            FileInputStream fileInputStream = new FileInputStream("book.pdf");
            byte[] buffer = new byte[4096];
            int readLen;
            // 读取的字节个数大于等于 0 才写出数据
            while ( ( readLen = fileInputStream.read(buffer) ) >= 0 ) {
                // 写出数据到服务器
                socket.getOutputStream().write(buffer, 0, readLen);
            }
            System.out.println("文件传输完毕, 用时 : " + (System.currentTimeMillis() - startTime) + " ms");
            //3. 关闭连接
            socket.close();
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



3 . 代码运行 :



① 开启服务器 : 服务器开启后阻塞监听 ;

image.png



② 开启客户端 : 客户端开启 , 连接服务器 , 连接成功后 , 将 20M 的文件传输给服务器 ; 客户端用时 229 ms 将数据传输给服务器 , 服务器用时 229 ms 接收并存储数据 , 二者时间基本差不多 ;

image.pngimage.png



目录
相关文章
|
3月前
|
前端开发 网络协议 Java
Netty | 工作流程图分析 & 核心组件说明 & 代码案例实践
Netty | 工作流程图分析 & 核心组件说明 & 代码案例实践
110 0
|
7月前
|
网络协议
由浅入深Netty聊天室案例
由浅入深Netty聊天室案例
33 0
|
7月前
|
消息中间件 分布式计算 NoSQL
由浅入深Netty入门案例
由浅入深Netty入门案例
97 0
|
8月前
|
存储
前中电技术总监带你了解,什么是零拷贝,Netty是如何实现的?
呢作为一个高性能的网络通信框架,被越来越多互联网公司关注和重视。最近,有小伙伴在面试过程中被问到Netty是如何实现零拷贝的问题?,今天,我给大家来聊一聊。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。
36 0
|
9月前
Netty入门到超神系列-聊天室案例
对于服务端而言需要做如下事情 selector监听客户端的链接 如果有“读”事件,就从通道读取数据 把数据转发给其他所有的客户端,要过滤掉发消息过来的客户端不用转发 对于客户端而言需要做如下事情 selector监听服务端的“读”事件 如果有数据从通道中读取数据,打印到控制台 监听键盘输入,向服务端发送消息
85 0
|
9月前
|
存储 消息中间件 缓存
Netty入门到超神系列-零拷贝技术
内存主要作用是在计算机运行时为操作系统和各种程序提供临时储存,操作系统的进程和进程之间是共享CPU和内存资源的。为了防止内存泄露需要一套完善且高效的内存管理机制。因此现代操作系提供了一种基于主内存抽象出来的概念:虚拟内存(Virtual Memory)。 虚拟内存 虚拟内存是计算机系统内存管理的一种技术,主要为每个进程提供私有的地址空间,让每个进程拥有一片连续完整的内存空间。而实际上,虚拟内存通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换,加载到物理内存中来 物理内存 物理内存指通过内存条而获得的内存空间,而虚拟内存则是指将硬盘的一块区域划分来
97 0
|
9月前
|
Java
Netty入门到超神系列-Java NIO零拷贝实战
这一章我们来操作一下NIO的零拷贝,这里我会先写代码样式一下传统IO数据拷贝场景下的耗时,然后再对比NIO场景下的考别耗时,通过耗时差异就能看到NIO零拷贝和传统IO拷贝的区别了。
81 0
|
9月前
|
存储 Java Linux
Netty ByteBuf 的零拷贝(Zero Copy)详解
Netty ByteBuf 的零拷贝(Zero Copy)详解
123 0
|
11月前
Netty - 探究零拷贝Zero Copy
Netty - 探究零拷贝Zero Copy
35 0
|
11月前
|
Rust Dubbo 网络协议
通过 HTTP/2 协议案例学习 Java & Netty 性能调优:工具、技巧与方法论
通过 HTTP/2 协议案例学习 Java & Netty 性能调优:工具、技巧与方法论
12560 3