返回顶部
首页 > 资讯 > 精选 >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://lsjlt.com/news/288815.html(转载时请注明来源链接)

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

猜你喜欢
  • Java NIO的基本使用实例
    这篇文章主要介绍“Java NIO的基本使用实例”,在日常操作中,相信很多人在Java NIO的基本使用实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java NIO的基本使用实例”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • java NIO SocketClinet和ServerSocket的实例用法
    本篇内容介绍了“java NIO SocketClinet和ServerSocket的实例用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-06-02
  • java基础之NIO介绍及使用
    目录一、NIO二、三大组件三、ByteBuffer的使用四、测试Demo五、Channel的使用六、网络编程七、Selector八、网络编程(多路复用)一、NIO java.nio...
    99+
    2024-04-02
  • egg.js的基本使用实例
    目录安装egg.js写第一个api接口创建控制器编写路由关闭csrf开启跨域数据库配置和创建迁移文件创建数据迁移表模型创建模型错误和异常处理中间件参数验证安装egg.js 全局切换镜...
    99+
    2024-04-02
  • Java NIO开发的实例介绍
    本篇内容介绍了“Java NIO开发的实例介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先来看下传统的阻塞型网络I/O的不足Java ...
    99+
    2023-06-17
  • Java NIO框架Netty简单使用的示例
    之前写了一篇文章:Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码),介绍了如何使用Java原生IO支持进行网络编程,本文介绍一种更为简单的方式,即Java NIO框架。Netty是业界最流行的NIO框架之一,具有良好的健...
    99+
    2023-05-30
  • java基于NIO实现群聊模式
    本文实例为大家分享了java基于NIO实现群聊模式的具体代码,供大家参考,具体内容如下 Client package com.qst.chat; import java.io....
    99+
    2024-04-02
  • Java基于NIO实现群聊功能
    本文实例为大家分享了Java基于NIO实现群聊功能的具体代码,供大家参考,具体内容如下 一、群聊服务器 package com.dashu.netty.group_chat; ...
    99+
    2024-04-02
  • Java基于NIO实现群聊系统
    本文实例为大家分享了Java基于NIO实现群聊系统的具体代码,供大家参考,具体内容如下 实例要求: 1.编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) ...
    99+
    2024-04-02
  • Java之Jackson的基本使用案例讲解
    Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看...
    99+
    2024-04-02
  • minio的基本使用——java
    第一步:下载minio服务安装包 去官网下载:MinIO | 用于创建高性能对象存储的代码和下载内容 minio的使用文档:MinIO Object Storage for Kubernetes — MinIO Object Storag...
    99+
    2023-09-01
    java 开发语言
  • Java NIO Channel 使用详情
    目录FileChannel输入 FileInputStream输出 FileOutputStreamRandomAccessFile两个 SocketChannelServerSoc...
    99+
    2024-04-02
  • Java中NIO的示例分析
    这篇文章主要介绍了Java中NIO的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Java思维导图二、I/O模型I/O模型的本质是用什么样的通道进行数据的发送和接...
    99+
    2023-06-29
  • Java基于NIO实现聊天室功能
    本文实例为大家分享了Java基于NIO实现聊天室功能的具体代码,供大家参考,具体内容如下 Sever端 package com.qst.one; import java.io....
    99+
    2024-04-02
  • vue具名插槽的基本使用实例
    前言 具有名字的插槽slot使用 中的 "name" 属性绑定元素 注意: 1,如果没有匹配到 则放到匿名的插槽中 2,具名插槽的渲染顺序,完全取决于模板,而不是取决于父组件中...
    99+
    2024-04-02
  • Vue3中vuex的基本使用方法实例
    目录一、基本结构二、基本使用三、将store中的数据模块化后的使用1.模块化2.使用补充:如何改变vuex中的属性总结 一、基本结构 src/store/index.js中...
    99+
    2024-04-02
  • SQL中游标(cursor)的基本使用实例
    目录 类型:1.普通游标2.滚动游标具体FETCH用法:Arguments总结 类型:   1.普通游标   只有NEXT操作   2.滚动游标 有多种操作 1.普通游标 DEC...
    99+
    2024-04-02
  • ES6中常见基本知识点的基本使用实例汇总
    目录前言1、字面量的增强2、解构Destructuring3、let和const4、作用域5、模板子符串6、函数7、展开语法8、数值表示9、Symbol的基本使用10、Set11、W...
    99+
    2024-04-02
  • Java基于NIO如何实现群聊系统
    这篇文章主要为大家展示了“Java基于NIO如何实现群聊系统”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java基于NIO如何实现群聊系统”这篇文章吧。具体内容如下实例要求:编写一个 NIO ...
    99+
    2023-06-21
  • java基于NIO如何实现群聊模式
    这篇文章将为大家详细讲解有关java基于NIO如何实现群聊模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下Clientpackage com.qst.chat;import&nbs...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作