广告
返回顶部
首页 > 资讯 > 精选 >Java NIO的基本使用实例
  • 801
分享到

Java NIO的基本使用实例

2023-06-17 12:06:22 801人浏览 薄情痞子
摘要

这篇文章主要介绍“Java NIO的基本使用实例”,在日常操作中,相信很多人在Java Nio的基本使用实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java NIO的基本使用实例”的疑惑有所帮助!接下来

这篇文章主要介绍“Java NIO的基本使用实例”,在日常操作中,相信很多人在Java Nio的基本使用实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java NIO的基本使用实例”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

NIO是Java提供的非阻塞I/O api

非阻塞的意义在于可以使用一个线程对大量的数据连接进行处理,非常适用于"短数据长连接"的应用场景,例如即时通讯软件。

在一个阻塞C/S系统中,服务器要为每一个客户连接开启一个线程阻塞等待客户端发送的消息.若使用非阻塞技术,服务器可以使用一个线程对连接进行轮询,无须阻塞等待.这大大减少了内存资源的浪费,也避免了服务器在客户线程中不断切换带来的CPU消耗,服务器对CPU的有效使用率大大提高.

其核心概念包括Channel,Selector,SelectionKey,Buffer。

Channel是I/O通道,可以向其注册Selector,应用成功可以通过select操作获取当前通道已经准备好的可以无阻塞执行的操作.这由SelectionKey表示。

SelectionKey的常量字段SelectionKey.OP_***分别对应Channel的几种操作例如connect(),accept(),read(),write()。

select操作后得到SelectionKey.OP_WRITE或者READ即可在Channel上面无阻塞调用read和write方法,Channel的读写操作均需要通过Buffer进行.即读是讲数据从通道中读入Buffer然后做进一步处理.写需要先将数据写入Buffer然后通道接收Buffer。

下面是一个使用NIO的基本C/S示例.该示例只为显示如何使用基本的API而存在,其代码的健壮性,合理性都不具参考价值。

这个示例,实现一个简单的C/S,客户端想服务器端发送消息,服务器将收到的消息打印到控制台.现实的应用中需要定义发送数据使用的协议,以帮助服务器解析消息.本示例只是无差别的使用默认编码将收到的字节转换字符并打印.通过改变初始分配的ByteBuffer的容量,可以看到打印消息的变化.容量越小,对一条消息的处理次数就越多,容量大就可以在更少的循环次数内读完整个消息.所以真是的应用场景,要考虑适当的缓存大小以提高效率。

首先是Server:

package hadix.demo.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.util.*; import java.util.concurrent.ConcurrentHashMap;   public class Server {     private Selector selector;     private ByteBuffer readBuffer = ByteBuffer.allocate(8);//调整缓存的大小可以看到打印输出的变化     private Map<SocketChannel, byte[]> clientMessage = new ConcurrentHashMap<>();      public void start() throws IOException {         ServerSocketChannel ssc = ServerSocketChannel.open();         ssc.configureBlocking(false);         ssc.bind(new InetSocketAddress("localhost", 8001));         selector = Selector.open();         ssc.reGISter(selector, SelectionKey.OP_ACCEPT);         while (!Thread.currentThread().isInterrupted()) {             selector.select();             Set<SelectionKey> keys = selector.selectedKeys();             Iterator<SelectionKey> keyIterator = keys.iterator();             while (keyIterator.hasNext()) {                 SelectionKey key = keyIterator.next();                 if (!key.isValid()) {                     continue;                 }                 if (key.isAcceptable()) {                     accept(key);                 } else if (key.isReadable()) {                     read(key);                 }                 keyIterator.remove();             }         }     }      private void read(SelectionKey key) throws IOException {         SocketChannel socketChannel = (SocketChannel) key.channel();          // Clear out our read buffer so it's ready for new data         this.readBuffer.clear();          // Attempt to read off the channel         int numRead;         try {             numRead = socketChannel.read(this.readBuffer);         } catch (IOException e) {             // The remote forcibly closed the connection, cancel             // the selection key and close the channel.             key.cancel();             socketChannel.close();             clientMessage.remove(socketChannel);             return;         }          byte[] bytes = clientMessage.get(socketChannel);         if (bytes == null) {             bytes = new byte[0];         }         if (numRead > 0) {             byte[] newBytes = new byte[bytes.length + numRead];             System.arraycopy(bytes, 0, newBytes, 0, bytes.length);             System.arraycopy(readBuffer.array(), 0, newBytes, bytes.length, numRead);             clientMessage.put(socketChannel, newBytes);             System.out.println(new String(newBytes));         } else {             String message = new String(bytes);             System.out.println(message);         }     }      private void accept(SelectionKey key) throws IOException {         ServerSocketChannel ssc = (ServerSocketChannel) key.channel();         SocketChannel clientChannel = ssc.accept();         clientChannel.configureBlocking(false);         clientChannel.register(selector, SelectionKey.OP_READ);         System.out.println("a new client connected");     }       public static void main(String[] args) throws IOException {         System.out.println("server started...");         new Server().start();     } }

然后是Client:

package hadix.demo.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.SocketChannel; import java.util.Iterator; import java.util.Scanner; import java.util.Set;   public class Client {      public void start() throws IOException {         SocketChannel sc = SocketChannel.open();         sc.configureBlocking(false);         sc.connect(new InetSocketAddress("localhost", 8001));         Selector selector = Selector.open();         sc.register(selector, SelectionKey.OP_CONNECT);         Scanner scanner = new Scanner(System.in);         while (true) {             selector.select();             Set<SelectionKey> keys = selector.selectedKeys();             System.out.println("keys=" + keys.size());             Iterator<SelectionKey> keyIterator = keys.iterator();             while (keyIterator.hasNext()) {                 SelectionKey key = keyIterator.next();                 keyIterator.remove();                 if (key.isConnectable()) {                     sc.finishConnect();                     sc.register(selector, SelectionKey.OP_WRITE);                     System.out.println("server connected...");                     break;                 } else if (key.isWritable()) {                      System.out.println("please input message");                     String message = scanner.nextLine();                     ByteBuffer writeBuffer = ByteBuffer.wrap(message.getBytes());                     sc.write(writeBuffer);                 }             }         }     }      public static void main(String[] args) throws IOException {         new Client().start();     } }

此外有一个代码写得更好的例子,非常值得参考。Http://rox-xmlrpc.sourceforge.net/niotut/index.html

这个例子里面的客户端将消息发送给服务器,服务器收到后立即写回给客户端.例子中代码虽然也没有做有意义的处理,但是其结构比较合理,值得以此为基础进行现实应用的扩展开发

到此,关于“Java NIO的基本使用实例”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Java NIO的基本使用实例

本文链接: https://www.lsjlt.com/news/288815.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java NIO的基本使用实例
    这篇文章主要介绍“Java NIO的基本使用实例”,在日常操作中,相信很多人在Java NIO的基本使用实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java NIO的基本使用实例”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • egg.js的基本使用实例
    目录安装egg.js写第一个api接口创建控制器编写路由关闭csrf开启跨域数据库配置和创建迁移文件创建数据迁移表模型创建模型错误和异常处理中间件参数验证安装egg.js 全局切换镜...
    99+
    2022-11-13
  • java NIO SocketClinet和ServerSocket的实例用法
    本篇内容介绍了“java NIO SocketClinet和ServerSocket的实例用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-06-02
  • java基础之NIO介绍及使用
    目录一、NIO二、三大组件三、ByteBuffer的使用四、测试Demo五、Channel的使用六、网络编程七、Selector八、网络编程(多路复用)一、NIO java.nio...
    99+
    2022-11-12
  • Java NIO开发的实例介绍
    本篇内容介绍了“Java NIO开发的实例介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先来看下传统的阻塞型网络I/O的不足Java ...
    99+
    2023-06-17
  • Java之Jackson的基本使用案例讲解
    Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看...
    99+
    2022-11-12
  • Java NIO框架Netty简单使用的示例
    之前写了一篇文章:Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码),介绍了如何使用Java原生IO支持进行网络编程,本文介绍一种更为简单的方式,即Java NIO框架。Netty是业界最流行的NIO框架之一,具有良好的健...
    99+
    2023-05-30
  • minio的基本使用——java
    第一步:下载minio服务安装包 去官网下载:MinIO | 用于创建高性能对象存储的代码和下载内容 minio的使用文档:MinIO Object Storage for Kubernetes — MinIO Object Storag...
    99+
    2023-09-01
    java 开发语言
  • ES6中常见基本知识点的基本使用实例汇总
    目录前言1、字面量的增强2、解构Destructuring3、let和const4、作用域5、模板子符串6、函数7、展开语法8、数值表示9、Symbol的基本使用10、Set11、W...
    99+
    2022-11-13
  • vue具名插槽的基本使用实例
    前言 具有名字的插槽slot使用 中的 "name" 属性绑定元素 注意: 1,如果没有匹配到 则放到匿名的插槽中 2,具名插槽的渲染顺序,完全取决于模板,而不是取决于父组件中...
    99+
    2022-11-12
  • Vue3中vuex的基本使用方法实例
    目录一、基本结构二、基本使用三、将store中的数据模块化后的使用1.模块化2.使用补充:如何改变vuex中的属性总结 一、基本结构 src/store/index.js中...
    99+
    2022-11-13
  • SQL中游标(cursor)的基本使用实例
    目录 类型:1.普通游标2.滚动游标具体FETCH用法:Arguments总结 类型:   1.普通游标   只有NEXT操作   2.滚动游标 有多种操作 1.普通游标 DEC...
    99+
    2022-11-12
  • JavaScript中Set基本使用方法实例
    目录介绍基本API1. 创建Set实例2. Set实例转数组3. size属性4. add()5. has()6. delete()7. clear()8. 迭代补充:JS...
    99+
    2022-11-16
    js set使用 js中set用法 javascript set
  • Java执行hadoop的基本操作实例代码
    Java执行hadoop的基本操作实例代码向HDFS上传本地文件public static void uploadInputFile(String localFile) throws IOException{ Configuratio...
    99+
    2023-05-31
    java hadoop
  • sass在react中的基本使用(实例详解)
    目录1. 安装sass2. 编写App.tsx中的基本DOM3. sass变量4. sass中的选择器嵌套和属性嵌套5. sass中的@import和Partials6. Sass中...
    99+
    2022-11-13
  • JavaWeb之Ajax的基本使用与实战案例
    目录一、Ajax是什么?二、为什么使用Ajax?三、Ajax基本使用1、$.ajax()2、$.post() 3.$.get() 四、案例无刷新登录(ajax、g...
    99+
    2022-11-13
    java web ajax javaweb ajax使用 Ajax的使用
  • Redis实战:Redis在Java中的基本使用
    本片将介绍 Redis 在 Java 中的基本使用 文章目录 1、使用jedis操作redis1.1、Jedis简介1.2、引入jedis的Maven依赖1.2、获取连接1.3、使用实...
    99+
    2023-08-31
    redis java 数据库
  • java程序中protobuf的基本用法示例
    目录简介为什么使用protobuf定义.proto文件编译协议文件详解生成的文件Builders 和 Messages序列化和反序列化协议扩展总结简介 Protocol Buffe...
    99+
    2022-11-12
  • Java正则表达式的基本用法和实例大全
    目录一、概述:二、单个符号三、快捷符号四、常用的正则表达式五、Java 中正则表达式的应用1、判断功能2、分割功能3、替换功能六、常用正则表达式七、实例总结一、概述: 用来描述或者匹...
    99+
    2022-11-13
  • 关于SpringSecurity的基本使用示例
    目录一、使用1、直接引入依赖使用(不连接数据库)1.1 引入依赖1.2 启动项目随机访问controller的一个接口2、结合数据库使用2.1 编写类实现UserDetailsSer...
    99+
    2023-05-19
    SpringSecurity SpringSecurity 示例
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作