java nio 第一弹

java NIO 第一弹----概览

摘要:

Non-blocking I/O (usually called NIO, and sometimes called "New I/O") is a collection of Java programming language APIs that offer features for intensive I/Ooperations. It was introduced with the J2SE 1.4 release of Java by Sun Microsystems to complement an existing standard I/O. NIO was developed under the Java Community Process as JSR 51.[1]

大意:非阻塞I/O(通常叫做NIO,有时也叫新的I/O),是一组提供了加强版I/O操作特性的java api。在java1.4时由sun公司引入。

本系列主要着眼于网络部分,对本地文件操作没有涉及。接下来先看一段代码,展示了最简单Echo服务端。

代码示例

 1         ByteBuffer bb = ByteBuffer.allocate(1024);
 2         /**创建选择器*/
 3         Selector selector = Selector.open();
 4         /**打开一个服务端通道*/
 5         ServerSocketChannel ssc = ServerSocketChannel.open();
 6         /**设置为非阻塞*/
 7         ssc.configureBlocking(false);
 8         /**从通道中拿到服务端socket*/
 9         ServerSocket ss = ssc.socket();
10         /**绑定一个端口*/
11         InetSocketAddress addr = new InetSocketAddress(1234);
12         ss.bind(addr);
13         /**注册感兴趣事件,服务端通道只能注册接受事件*/
14         ssc.register(selector, SelectionKey.OP_ACCEPT);
15         String receivedMsg = "";
16         /**主循环*/
17         while(true){
18             int num = selector.select();
19             System.out.println(num+"个事件发生。。。");
20             Set<SelectionKey> selectedKeys = selector.selectedKeys();
21             Iterator<SelectionKey> it = selectedKeys.iterator();
22
23             /**循环处理每个通道事件*/
24             while(it.hasNext()){
25                 SelectionKey key = it.next();
26                 it.remove();
27                 if(key.readyOps() == SelectionKey.OP_ACCEPT){
28                     System.out.println("新连接建立事件");
29                     ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
30                     SocketChannel sc = serverSocketChannel.accept();
31                     sc.configureBlocking(false);
32                     sc.register(selector, SelectionKey.OP_READ);
33                 }else if((key.readyOps()&SelectionKey.OP_READ) == SelectionKey.OP_READ){
34                     System.out.println("读事件");
35                     SocketChannel sc = (SocketChannel) key.channel();
36                     sc.read(bb);
37                     receivedMsg = new String(bb.array(),0,bb.position());
38                     bb.clear();
39                     sc.register(selector, SelectionKey.OP_WRITE);
40                 }else if(key.readyOps() == SelectionKey.OP_WRITE){
41                     System.out.println("写数据");
42                     SocketChannel sc = (SocketChannel) key.channel();
43                     sc.write(ByteBuffer.wrap(receivedMsg.getBytes()));
44                     /**没有cancel就会一直循环进入此处,因为只要通道不阻塞会一直有写事件,所以使用完需要取消*/
45                     key.cancel();
46                 }else{
47                     System.out.println("other event");
48                 }
49             }
50         }

此处代码是一个将收到的信息发回去的服务端代码,给出了使用nio写服务端的一般流程。

此处可以先有个概念和总体认识,接下来会对涉及到的重要的类进行介绍,欢迎批评指正,大家讨论进步。

注:本例没有处理IOException,实际代码要处理,不然一个客户端强行关闭socket就会使服务端挂掉。

java nio 第一弹

时间: 2024-10-14 19:26:16

java nio 第一弹的相关文章

【Java基础第一弹】Java序列化基础篇

Java类通过实现java.io.Serializable 接口便可启用其序列化功能.实现了序列化的类的实例可以在不同的系统或JVM间传递,并且不会丢失原实例的相关状态及值. 为一个类开启序列化功能只需实现Serializable 接口即可,仅仅作为使用者可以不必了解其内部的更深层次的实现及流程,但是如果想要更好的使用序列化功能就需要与我一起详细的学习和了解它. 1.什么是Java序列化 Java类通过实现java.io.Serializable 接口以启用其序列化功能: import java

java面试第一弹

1.  一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?. 可以有多个类,但只能有一个public的类,并且public的类名与文件名相同 2.  Java有没有goto? Java中的保留字,但现在不在用java中使用 3.  说说&和&&的区别. &是位运算和逻辑运算,&&是用于逻辑运算,&&是用于短路的,短路就是当表达式两边第一个位false时,则不在执行第二个 4.  在JAVA中如何跳出当

Java基础の第一弹

一.虚拟机的工作机制 (1) :通过 ClassLoader 寻找和装载 class 文件 (2) :解释字节码成为指令并执行,提供 class 文件的运行环境 (3) :进行运行期间垃圾回收 (4) :提供与硬件交互的平台 二.Java 从代码到运行的全过程 1.创建类:创建Java类文件,文件名(文件后缀名为java)必须跟其中一个类名完全一致,只有该类可以带public修饰符,一个类文件中最多只有一个类被public修饰(内部类不算) 类包含如下部分:①包(package)定义,②引用(i

Java 初学 第一弹--编译并运行书上的简单程序(猜数字小游戏)

(博主原创) 首先说明一下,博主是大一上学期结束寒假时自己看的Java,然后我看的是Head First Java的中文版,因为大一学了c,所以里面的一些基本思想还是了解的,在看这本书时就浏览了一下(就是那种光看没有自己动手去敲代码的),然后看到书上的一个猜数字小游戏,就想手动敲一下,熟悉熟悉Java的语法,但是真正去做时,发现比看起来要困难一些. 首先是Java在建立一个源码文件之前要先建一个package,然后我用的Eclipse写的Java(感觉和pycharm风格差不多),再新建一个文件

Java NIO中的缓冲区Buffer(一)缓冲区基础

什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的源码),Buffer类内部其实就是一个基本数据类型的数组,以及对这个缓冲数组的各种操作: 常见的缓冲区如ByteBuffer.IntBuffer.DoubleBuffer...内部对应的数组依次是byte.int.double... 与通道的关系 在Java NIO中,缓冲区主要是跟通道(Chann

Java NIO(六) Selector

Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是本文所涉及到的主题列表: 为什么使用Selector? Selector的创建 向Selector注册通道 SelectionKey 通过Selector选择通道 wakeUp() close() 完整的示例 为什么使用Selector? 仅用单个线程来处理多个Channels的好处是,只需要更少的

Linux IO模型与Java NIO

概述看Java NIO一篇文章的时候又看到了"异步非阻塞"这个概念,一直处于似懂非懂的状态,想解释下到底什么是异步 什么是非阻塞,感觉抓不住重点.决定仔细研究一下.本文试图研究以下问题: web server原理,bio的connector与nio的connector在架构上到底什么区别? NIO的优势到底在哪里,是如何应用到实践中的? 同步/异步.阻塞/非阻塞到底是什么概念,引出的IO模型同步阻塞.同步非阻塞.异步阻塞.异步非阻塞的具体使用场景,适用的场景是怎样的? bio nio也

Java NIO (二) 缓冲区(Buffer)

缓冲区(Buffer):一个用于特定基本数据类型的容器,由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类. Java NIO 中的Buffer 主要用于和NIO中的通道(Channel)进行交互, 数据从通道(Channel)读入缓冲区(Buffer)或者从缓冲区(Buffer)写入通道(Channel).如下,我画的一个简图,Chanenl直接和数据源或者目的位置接触,Buffer作为中介这,从一个Channel中读取数据,然后将数据写入另一个Channel中. Bu

说说Java NIO【转】

转自:http://www.molotang.com/articles/894.html 在Java发布JDK1.4之后,NIO也随之出现了.NIO的出现实际上是为了给Java开发提供更多更多更灵活的接口,当然也是为了提高性能.我们本篇对NIO做一个概述. 0. IO的同步异步和阻塞 Java NIO就是Java New IO.但NIO也通常会和BIO和AIO放在一起来提,有人把NIO理解为non-blocking IO,即非阻塞IO.这个理解其实也是有道理的,因为NIO使得非阻塞IO成为了可能