IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 六.Netty入门到超神系列-Java NIO零拷贝实战 -> 正文阅读

[Java知识库]六.Netty入门到超神系列-Java NIO零拷贝实战

前言

这一章我们来操作一下NIO的零拷贝,这里我会先写代码样式一下传统IO数据拷贝场景下的耗时,然后再对比NIO场景下的考别耗时,通过耗时差异就能看到NIO零拷贝和传统IO拷贝的区别了。
在这里插入图片描述

传统IO拷贝

服务端

服务端主要是接收一下客户端传输过来的数据


//普通拷贝 - 服务端
public class SocketServer {

    public static void main(String[] args) throws Exception {

        //创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(5000);

        while(true){
            //接待请求
            Socket socket = serverSocket.accept();

            //获取输入流
            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());

            //读取数据
            byte[] bytes = new byte[1024];

            int size = 0;

            while(true){
                try{
                    size = dataInputStream.read(bytes,0,bytes.length);
                    if(size == -1)break;
                    //读数据
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

客户端

客户端我们从磁盘读取一个文件,然后通过socket进行网络传输,并记录下消耗的时间

public class SocketClient {

    public static void main(String[] args) throws Exception {
        //创建Socket
        Socket socket = new Socket("127.0.0.1",5000);
        //文件输入流
        FileInputStream fileInputStream = new FileInputStream("D:\\idea-space\\idea-code\\netty-demo\\src\\main\\java\\cn\\itsource\\nio\\zerocopy\\img.zip");

        //输出流
        OutputStream outputStream = socket.getOutputStream();

        byte[] bytes = new byte[10240];
        int size = 0 ;
        int total = 0;
        long start = System.currentTimeMillis();

        //把文件中的数据写到socket
        while((size = fileInputStream.read(bytes)) != -1){
            total += size;
            outputStream.write(bytes);
        }
        //发送:1813047字节,耗时:16
        System.out.println("发送:"+total+"字节,耗时:"+(System.currentTimeMillis() - start));
        outputStream.close();
        fileInputStream.close();
        socket.close();
    }
}

我这里 发送:1813047字节,耗时:16

Java NIO拷贝

NIO拷贝要的事情和上面是一样的,只是代码有些差别

服务端

public class NIOCopyServer {

    public static void main(String[] args) throws IOException {
        //服务端
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        //监听
        serverSocketChannel.bind(new InetSocketAddress("127.0.0.1",6000));

        //缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

        while (true){
            SocketChannel socketChannel = serverSocketChannel.accept();

            while(true){
                if(-1 != socketChannel.read(byteBuffer)){
                    break;
                }
                //为了重复利用buffer,考完一次就清空
                byteBuffer.clear();
            }
        }
    }
}

客户端

JAVA中的NIO零拷贝可以通过 fileChannel.transferTo 方法来实现 ,具体代码如下

public class NIOCopyClient {
    public static void main(String[] args) throws IOException {
        //创建通道
        SocketChannel socketChannel = SocketChannel.open();

        //链接服务端
        socketChannel.connect(new InetSocketAddress("127.0.0.1",6000));

        //文件输入流
        FileInputStream fileInputStream = new FileInputStream("D:\\idea-space\\idea-code\\netty-demo\\src\\main\\java\\cn\\itsource\\nio\\zerocopy\\img.zip");

        //读文件的通道
        FileChannel fileChannel = fileInputStream.getChannel();

        long start = System.currentTimeMillis();
		//transferTo 方法使用到了零拷贝技术
		//注意:在window上该方法一次只是支持8m数据拷贝,如果数据比价大,需要切片后多次传输
        long total = fileChannel.transferTo(0, fileChannel.size(), socketChannel);
        //发送字节数:1813047 ,耗时:4
        System.out.println("发送字节数:"+total+" ,耗时:"+(System.currentTimeMillis() - start));

        fileInputStream.close();
        fileChannel.close();
        socketChannel.close();
    }
}

同样的文件,同样的大小,发送字节数:1813047 , NIO 耗时:4 ,而传统IO拷贝 16,我这里文件2M不到,如果文件再大一点,效果更加明显。

文章到这就结束了,这一章比较简单,只是一个小案例,凑个篇数。当然点赞还是要求一下的,万一屏幕面前的大帅哥,或者大漂亮一不小心就一键三连了啦,那我就是熬夜到头发掉光,也出下章

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 11:51:51  更:2021-08-07 11:53:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 5:48:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码