关于BIO,NIO,AIO的理解

BIO:同步阻塞式IO

NIO:同步非阻塞式IO

AIO(NIO2.0):异步非阻塞式IO

同步:指虚拟机来完成IO读写,如果读写没有完成程序一直等待。

异步:指将读写交给操作系统来做,java代码要干的事就是将想读的写的东西给操作系统然后返回状态值,最后让操作系统通知程序是否完成。

阻塞:指对网络通信,一个客户端对应一个服务器线程,当链接数量多的时候,就会发生阻塞,其余的客户端连不上服务器。

非阻塞:将所谓的一个链接对应一个线程转化为一个请求对应一个线程,这里引入了通道和多路复用技术,由多路复用器来轮询通道是否请求读写,然后创建一个线程来处理他。

异步一般与操作系统关系比较密切,不同的操作系统异步的效率也是不一样的。

阻塞是可以用代码方式体现的:

1.创建服务器类,创建私有多路复用器,和buffer缓冲区对象。

2.创建服务器类的构造方法,通道绑定地址并且绑定通道设置监听。

3.创建客户端类,绑定通道,并用buffer输入通道。

  1 package com.fan;
  2
  3 import java.io.IOException;
  4 import java.net.InetSocketAddress;
  5 import java.nio.ByteBuffer;
  6 import java.nio.channels.SelectionKey;
  7 import java.nio.channels.Selector;
  8 import java.nio.channels.ServerSocketChannel;
  9 import java.nio.channels.SocketChannel;
 10 import java.util.Iterator;
 11
 12 public class Server implements Runnable {
 13
 14     private Selector selector;//创建多路复用器。
 15
 16     private ByteBuffer byteBuffer = ByteBuffer.allocate(1024);//创建ByteBuffer,并分配长度。
 17
 18     public Server(int port) {//创建构造函数。
 19         try {
 20
 21             this.selector = Selector.open();//打开多路复用器。
 22
 23             ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//打开服务器通道channel。
 24
 25             serverSocketChannel.configureBlocking(false);//设置该多通道为非阻塞的。
 26
 27             serverSocketChannel.bind(new InetSocketAddress(port));//给通道绑定服务器地址。
 28
 29             serverSocketChannel.register(this.selector, SelectionKey.OP_ACCEPT);//通道注册到多路复用器中,并设置监听事件。
 30
 31             System.out.println("Server start, port :" + port);
 32
 33         } catch (Exception e) {
 34
 35         }
 36     }
 37
 38     @Override
 39     public void run() {
 40         while (true) {
 41             try {
 42                 this.selector.select();//让多路复用器进行监听。
 43
 44                 Iterator<SelectionKey> iterator = this.selector.selectedKeys().iterator();//返回多路选择器已经选择的集。
 45
 46                 while (iterator.hasNext()) {//进行遍历。
 47
 48                     SelectionKey selectionKey = iterator.next();//获取一个选择的元素。
 49
 50                     iterator.remove();//将容器移除。
 51
 52                     if (selectionKey.isValid()) {
 53                         if (selectionKey.isAcceptable()) {
 54                             this.accept(selectionKey);
 55                         }
 56                         if (selectionKey.isReadable()) {
 57                             this.read(selectionKey);
 58                         }
 59                         if (selectionKey.isWritable()) {
 60                             //this.write(selectionKey); //ssc
 61                         }
 62                     }
 63                 }
 64
 65             } catch (Exception e) {
 66
 67             }
 68         }
 69     }
 70
 71     private void write(SelectionKey key) {
 72         //ServerSocketChannel ssc =  (ServerSocketChannel) key.channel();
 73         //ssc.register(this.seletor, SelectionKey.OP_WRITE);
 74     }
 75
 76     private void read(SelectionKey key) {
 77         try {
 78             this.byteBuffer.clear();//清空缓冲区旧的数据
 79
 80             SocketChannel socketChannel = (SocketChannel) key.channel();//获取之前注册的socket通道对象
 81
 82             int read = socketChannel.read(this.byteBuffer);//将通道数据读到buffer中
 83
 84             if(read==-1){//如果没数据就返回
 85                 key.channel().close();
 86                 key.cancel();
 87                 return;
 88             }
 89
 90             this.byteBuffer.flip();//有数据则进行读取 读取之前需要进行复位方法(把position 和limit进行复位)
 91
 92             byte[] bytes = new byte[this.byteBuffer.remaining()];//根据缓冲区的数据长度创建相应大小的byte数组,接收缓冲区的数据
 93
 94             this.byteBuffer.get(bytes);// 接收缓冲区数据
 95
 96             String body = new String(bytes).trim();
 97
 98             System.out.println("Server : " + body);
 99
100         }catch (Exception e){
101
102         }
103     }
104     private void accept(SelectionKey key) {
105
106         try {
107             ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
108             SocketChannel accept = serverSocketChannel.accept();
109             accept.configureBlocking(false);
110             accept.register(this.selector, SelectionKey.OP_READ);
111         }catch (Exception e){
112
113         }
114     }
115
116     public static void main(String[] args) {
117
118         new Thread(new Server(8765)).start();
119
120     }
121
122 }

 1 package com.fan;
 2
 3 import java.io.IOException;
 4 import java.net.InetSocketAddress;
 5 import java.nio.ByteBuffer;
 6 import java.nio.channels.SocketChannel;
 7
 8 public class Client {
 9
10
11     public static void main(String[] args) {
12         InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8765);
13
14         SocketChannel sc = null;
15
16         ByteBuffer buf = ByteBuffer.allocate(1024);
17
18         try {
19
20             sc = SocketChannel.open();
21
22             sc.connect(address);
23
24             while (true) {
25
26                 byte[] bytes = new byte[1024];
27
28                 System.in.read(bytes);
29
30                 buf.put(bytes);
31
32                 buf.flip();
33
34                 sc.write(buf);
35
36                 buf.clear();
37
38             }
39
40         } catch (IOException e) {
41
42             e.printStackTrace();
43
44         } finally {
45
46             if (sc != null) {
47
48                 try {
49
50                     sc.close();
51
52                 } catch (IOException e) {
53
54                     e.printStackTrace();
55
56                 }
57
58             }
59
60         }
61
62     }
63
64 }

原文地址:https://www.cnblogs.com/fan123yh/p/11262855.html

时间: 2024-08-28 10:55:08

关于BIO,NIO,AIO的理解的相关文章

JAVA 中BIO,NIO,AIO的理解

JAVA 中BIO,NIO,AIO的理解 博客分类: 网络编程 [转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词.如有不足之处,还

Java中BIO,NIO,AIO的理解

在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 先来举个实例生活中的例子: 如果你想吃一份宫保鸡丁盖饭: 同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊! 同步非阻塞:在饭馆点完餐,就去遛狗了.不过溜一会儿,就回饭馆喊一声:好了没啊! 异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自

BIO NIO AIO区别

JAVA 中BIO,NIO,AIO的理解 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下:  序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词.如有不足之处,还望告知. 在弄清楚上面的几个问题之前,我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,

一站式学习Java网络编程 全面理解BIO/NIO/AIO

第1章 [开宗明义]网络编程三剑客BIO.NIO.AIO网络编程是RPC的奠基,RPC编程贯穿了程序员生涯的始终.本章首先分析为什么要学网络编,本课为谁设计,然后介绍课程内容主线脉络,让大家清晰知道本课程并非光说不练的假把式,而是处处有实战,实战项目步步优化,最后通过综合项目巩固所学.... 第2章 网络层的解析与协议本章首先对网络中涉及的网络链路层的解析进行讲解,进一步引出网络基本协议知识.使学员了解分层思想,对三种协议的定位及作用有所了解. 第3章 解读java.io专业术语也可以变得生动精

初理解Java中的BIO,NIO,AIO

初识: java 中的 BIO.NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装.程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码.只需要使用Java的API就可以了. 在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞. 同步与异步: 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回. 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但

一站式学习Java网络编程 全面理解BIO/NIO/AIO完整版

一站式学习Java网络编程 全面理解BIO/NIO/AIO 资源获取链接:点击获取完整教程 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题,以创新性的“对比式学习”搭建网络编程课程,课程主线清晰(网络层基础铺垫-->java网络编程前置技术讲解-->阻塞式编程BIO-->非阻塞式编程NIO-->异步编程AIO-->综合实战)适合每一位需要理解网络编程的同学们学习.以“项目驱动”为导向的学习,与企业刚需灵魂契合. 适合人群 网络编程作为编程者的必备

拿搬东西来解释udp tcpip bio nio aio aio异步

[群主]雷欧纳德简单理解 tcpip是有通信确认的面对面通信   有打招呼的过程  有建立通道的过程 有保持通道的确认    有具体传输 udp是看到对面的人好像在对面等你 就往对面扔东西[群主]雷欧纳德基本上 好比从货车a  运东西到货车b   tcpip是建立人手互传的方式   udp是 a货车里搬出的东西直接往b货车的人方向扔  你接成功没有  散架没 我扔的一方不管的 tcp管这个 ip是通道[群主]雷欧纳德ip是手语  高速对面 我在等你  或者我要发过来了 这一类的 [群主]雷欧纳德

也谈BIO | NIO | AIO (Java版--转)

关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个层面: 编程语言 实现原理 底层基础 从编程语言层面 BIO | NIO | AIO 以Java的角度,理解,linux c里也有AIO的概念(库),这些概念不知道什么原因被炒火起来,这里只从Java角度入手. BIO,同步阻塞式IO,简单理解:一个连接一个线程 NIO,同步非阻塞IO,简单理解:一

转载:BIO | NIO | AIO

http://my.oschina.net/bluesky0leon/blog/132361 也谈BIO | NIO | AIO (Java版) 转载自:zheng-lee博客 发布时间: 2013/05/21 12:56 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个层面: 编程语言 实现原理 底层基础 从编程语言层面 BIO | NIO |