NIO学习

文章目录

  • 前言
  • 一、主要模块
  • 二、使用步骤
    • 1.服务器端
    • 2.客户端
  • 三、NIO零拷贝(推荐)
  • 四、NIO另一种copy
  • 总结


前言

NIO是JDK1.4版本带来的功能,区别于以往的BIO编程,同步非阻塞极大的节省资源开销,避免了线程切换和上下文切换带来的资源浪费。


一、主要模块

  1. Selector:选择器,为事件驱动,做中央调度使用,一个选择器可以注册多个channel;
  2. Channel:通道,信息流通;支持读取和写入数据,一个通道可以有多个Buffer;
  3. Buffer:缓存区,存放数据,支持读取和写入的切换;

二、使用步骤

1.服务器端

代码如下(示例):

package nio;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Iterator;
import java.util.Set;/*** Create by zjg on 2022/9/11*/
public class NIOServer {public static void main(String[] args) {try {ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.configureBlocking(false);serverSocketChannel.bind(new InetSocketAddress(6666));Selector selector =Selector.open();serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while(true){if(selector.select(10000)==0){System.out.println("没有接收到监听事件");continue;}Set<SelectionKey> selectionKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectionKeys.iterator();while (iterator.hasNext()){SelectionKey selectionKey = iterator.next();if(selectionKey.isAcceptable()){System.out.println("获取到新的连接");SocketChannel socketChannel = serverSocketChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(selector,SelectionKey.OP_READ,ByteBuffer.allocate(1024));}if(selectionKey.isReadable()){SocketChannel socketChannel = (SocketChannel)selectionKey.channel();ByteBuffer byteBuffer = (ByteBuffer) selectionKey.attachment();int read = socketChannel.read(byteBuffer);if(read==-1){selectionKey.cancel();}else{String req=new String(byteBuffer.array()).trim();System.out.println("nio客户端说:"+req);String res= "服务器响应["+LocalDateTime.now().format(DateTimeFormatter.ISO_DATE)+" "+LocalDateTime.now().format(DateTimeFormatter.ISO_TIME)+"]:"+req;System.out.println(res);socketChannel.write(ByteBuffer.wrap(res.getBytes()));}}iterator.remove();}}} catch (IOException e) {e.printStackTrace();}}
}

在这里插入图片描述

2.客户端

代码如下(示例):

package nio;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;/*** Create by zjg on 2022/9/11*/
public class NIOClient {public static void main(String[] args) {try {SocketChannel socketChannel = SocketChannel.open();socketChannel.configureBlocking(false);InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 6666);if(!socketChannel.connect(inetSocketAddress)){while (!socketChannel.finishConnect()){System.out.println("等待连接完成!");}}String message="向往自由!";ByteBuffer byteBuffer = ByteBuffer.wrap(message.getBytes());socketChannel.write(byteBuffer);System.out.println("请求完成!");ByteBuffer allocate = ByteBuffer.allocate(1024);while (true){int read = socketChannel.read(allocate);if(read==0){continue;}System.out.println("---"+new String(allocate.array()).trim());socketChannel.close();break;}} catch (IOException e) {e.printStackTrace();}}
}

在这里插入图片描述

三、NIO零拷贝(推荐)

package nio;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;/*** Create by zjg on 2022/9/11*/
public class NIOZeroCopy {public static void main(String[] args) {FileChannel src = null;FileChannel dest = null;try {src=new FileInputStream("2.txt").getChannel();dest=new FileOutputStream("3.txt").getChannel();long start = System.currentTimeMillis();src.transferTo(0,src.size(),dest);long end = System.currentTimeMillis();System.out.println("copy完成,共"+src.size()+"byte,用时"+(end-start)+"毫秒");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if(src!=null){try {src.close();} catch (IOException e) {e.printStackTrace();}}if(dest!=null){try {dest.close();} catch (IOException e) {e.printStackTrace();}}}}
}

在这里插入图片描述

四、NIO另一种copy

package nio;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;/*** Create by zjg on 2022/9/18*/
public class NIOTest {public static void main(String[] args) {File source=new File("2.txt");File target=new File("4.txt");try {long start = System.currentTimeMillis();Files.copy(source.toPath(),target.toPath());long end = System.currentTimeMillis();System.out.println("copy完成,共"+source.length()+"byte,用时"+(end-start)+"毫秒");} catch (IOException e) {e.printStackTrace();}}
}

在这里插入图片描述
效率稍微慢点,用起来简单。


总结

回到顶部
刚开始写,请大佬指点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623944.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ENSP-旁挂式AC

提醒&#xff1a;如果AC不能成功上线AP&#xff0c;一般问题不会出在AC上&#xff0c;优先关注AC-AP线路上的二层或三层组网的三层交换机 拓扑图 管理VLAN&#xff1a;99 | 业务VLAN&#xff1a;100 注意点&#xff1a; 1.连接AP的接口需要打上pvid为管理vlan的标签 2.AC和…

Vitis HLS 学习笔记--readVec2Stream 函数-探究

目录 1. 高效内存存取的背景 2. readVec2Stream() 参数 3. 函数实现 4. 总结 1. 高效内存存取的背景 在深入研究《Vitis HLS 学习笔记--scal 函数探究》一篇文章之后&#xff0c;我们对于scal()函数如何将Y alpha * X这种简单的乘法运算复杂化有了深刻的理解。本文将转向…

imgcat 工具

如果经常在远程服务器或嵌入式设备中操作图片&#xff0c;要查看图片效果&#xff0c;就要先把图片dump到本地&#xff0c;比较麻烦。可以使用这个工具&#xff0c;直接在终端上显示。类似于这种效果。 imgcat 是一个终端工具&#xff0c;使用 iTerm2 内置的特性&#xff0c;允…

FOR循环指令计算累加和(CODESYS ST+SMART梯形图代码)

1、SMART PLC FOR循环指令应用 SMART PLC FOR循环指令_smart plc可以调用多少次for循环-CSDN博客文章浏览阅读2.4k次&#xff0c;点赞2次&#xff0c;收藏6次。SMART PLC的FOR循环&#xff1a; PLC里写需要加上&#xff1a; NEXT指令_smart plc可以调用多少次for循环https://r…

2024 年10个最佳 Ruby 测试框架

QA一直在寻找最好的自动化测试框架&#xff0c;这些框架提供丰富的功能、简单的语法、更好的兼容性和更快的执行速度。如果您选择结合使用Ruby和Selenium进行Web测试&#xff0c;可能需要搜索基于Ruby的测试框架进行Web应用程序测试。 Ruby测试框架提供了广泛的功能&#xff0…

打一把王者的时间,学会web页面测试方法与测试用例编写

一、输入框 1、字符型输入框&#xff1a; &#xff08;1&#xff09;字符型输入框&#xff1a;英文全角、英文半角、数字、空或者空格、特殊字符“~&#xff01;#&#xffe5;%……&*&#xff1f;[]{}”特别要注意单引号和&符号。禁止直接输入特殊字符时&#xff0c;…

纯golang开发的mqtt server

Mochi-MQTT Server github地址&#xff1a;https://github.com/mochi-mqtt/server Mochi-MQTT 是一个完全兼容的、可嵌入的高性能 Go MQTT v5&#xff08;以及 v3.1.1&#xff09;中间件/服务器。 Mochi MQTT 是一个完全兼容 MQTT v5 的可嵌入的中间件/服务器&#xff0c;完…

网络编程day4

目录 使用多进程实现并发服务器 使用多线程实现并发服务器 流式域套接字服务器 流式域套接字客户端 报式域套接字服务器 报式域套接字客户端 tftp客户端 思维导图 使用多进程实现并发服务器 #include <myhead.h> void sighandler(int signum){if(signumSIGCHLD)…

watchdog,监控文件变化的强大的python库

大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - watchdog。 Github地址&#xff1a;github.com/gorakhargos… 在软件开发和系统管理领域&#xff0c;经常需要监控文件和目录的变化&#xff0c;以便在文件被创建、修改或删除时触发相应的操作。Python Watchdog是一…

BTC生态新贵Giants Planet:BTC L2如何与现实世界整合

前言 获新加坡主权基金鼎力扶持&#xff0c;Giants Planet将引爆Web3新风向。 随着年前BTC现货 ETF 的获批&#xff0c;加密世界涌入大量的资金&#xff0c;BTC价格也成功突破新高。与之相比&#xff0c;传统金融的弊端日益凸显&#xff0c;且大部分资产涨幅都低于BTC&#xf…

AI绘画分享 日漫男主背景自绘

用AI绘画可以生成各种各样我们曾经认为只能靠手工绘画的神奇的作品&#xff0c;包括以前一些日式的漫画画风也可以一键生成。今天我们就用AI绘画试试以前爆火的日漫男主的特写画风&#xff0c;看看AIGC的能力究竟有多强大&#xff01; 绘画准备 绘画思路&#xff1a;男主需以特…

招聘技术研发类岗位的人才测评方案

传统的招聘方式&#xff0c;无法顺应时代发展的趋势&#xff0c;通过职业测试去进行初步筛选&#xff0c;然后再确定是否进一步预约安排面试。下面就以技术公司为例&#xff0c;说是技术岗位的人才测评&#xff0c;应该考虑到哪些维度&#xff0c;也叫岗位胜任力模型的制定&…