转自:http://blog.csdn.NET/liuxiao723846/article/details/45066095

Java中的IO主要源自于网络和本地文件

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO

在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服

务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒
绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。

BIO与NIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程。

NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程
中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。

在NIO的处理方式中,当一个请求来的话,开启线程进行处理,可能会等待后端应用的资源(JDBC连接等),其实这个线程就被阻塞了,当并发上来的话,还是会有BIO一样的问题。

AIO:  

HTTP/1.1出现后,有了Http长连接,这样除了超时和指明特定关闭的http
header外,这个链接是一直打开的状态的,这样在NIO处理中可以进一步的进化,在后端资源中可以实现资源池或者队列,当请求来的话,开启的线程把请

求和请求数据传送给后端资源池或者队列里面就返回,并且在全局的地方保持住这个现场(哪个连接的哪个请求等),这样前面的线程还是可以去接受其他的请求,
而后端的应用的处理只需要执行队列里面的就可以了,这样请求处理和后端应用是异步的.当后端处理完,到全局地方得到现场,产生响应,这个就实现了异步处
理。

BIO是一个连接一个线程。

   NIO是一个请求一个线程。

   AIO是一个有效请求一个线程。

大家都知道自从jdk5开始,java中多了java.nio和java.util.concurent包,这两个包可谓威力无穷啊,像tomcat最新版本(用了concurrent包),mina等纷纷在此基础上进行了更新(mina更是直接就通过java.nio来实现的)。其实nio说起来很简单。java通信的基础是socket.和serversocket
在此基础上封装一下,就是socketchannel和serversocketchannel,封装成channel的最大好处就是可以实现non-blocking的通信。然后再加入了一个多路轮询机制,通过观察者模式使得通过单线程就可以同时管理多个channel. 明白了这些之后,放出我的例子来。分别使用socket,channel,selector

实现了java的通信。

Server:

 

import
import
import
import
import
import
import

public TestChannel {

  • main(String args[])  IOException{
  • TestChannel tt= TestChannel();
  • tt.initSelector();
  • initServerSocket( port)  IOException{
  • ServerSocket(port);
  • (){
  • [] buf= [];
  • {
  • (Exception ex){
  • socket.close();
  • String(buf));
  • initServerChannel( port)  IOException{
  • ServerSocketChannel ssc=ServerSocketChannel.open();
  • );
  • ServerSocket ss=ssc.socket();
  • InetSocketAddress(port));
  • (){
  • (sc!=){
  • [] buf= [];
  • {
  • (Exception ex){
  • socket.close();
  • String(buf));
  • initSelector( port)  IOException{
  • Selector selector=Selector.open();
  • ServerSocketChannel ssc=ServerSocketChannel.open();
  • );
  • ServerSocket ss=ssc.socket();
  • InetSocketAddress(port));
  • ssc.register(selector, SelectionKey.OP_ACCEPT);
  • (){
  • interestNo=selector.select();
  • (interestNo==)
  • ;
  • (SelectionKey key:keys){
  • (key.isAcceptable()){
  • {
  • );
  • sc.register(selector, SelectionKey.OP_READ);
  • (Exception ex){
  • (key.isReadable()){
  • );
  • {
  • sc.read(bbuf);
  • (Exception ex){
  • String(bbuf.array()));
  • keys.remove(key);
  • ;
  • }

client:

 

public TestChannelClient {

  • main(String args[])  UnknownHostException, IOException{
  • Socket(,);
  • OutputStream out=sc.getOutputStream();
  • .getBytes());
  • out.flush();
  • }

java aio nio bio的更多相关文章

  1. 关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO的总结

    相关资料 IO基本概念 Linux环境 同步异步阻塞非阻塞 同步与异步 阻塞与非阻塞 IO模型Reference Link 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动异步IO模型 异步IO模 ...

  2. Java之NIO,BIO,AIO

    Hollis知识星球的一些学习笔记,有兴趣的朋友可以微信搜一下 什么是NIO 什么是IO? 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 ...

  3. java IO NIO BIO 最权威的总结

    1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 1.4 总结 2. NIO (New I/O) 2.1 NIO 简介 2.2 NIO的特性/N ...

  4. Java IO 之 BIO、NIO、AIO

    1.BIO.NIO.AIO解释 Java BIO : 同步并阻塞 (Blocking IO) 一个连接一个线程 即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不 ...

  5. 【转载】Java NIO学习 & NIO BIO AIO 比较

    可以参考这个页面: http://www.iteye.com/magazines/132-Java-NIO (下面这个页面也有) http://ifeve.com/overview/ 另,在这篇文章里 ...

  6. Java中NIO、BIO、AIO相关概念及应用场景

    1.同步阻塞IO(JAVA BIO):同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时,服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通 ...

  7. JAVA SOCKET 通信总结 BIO、NIO、AIO ( NIO 2) 的区别和总结

    1 同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 自己上街买衣服,自己亲自干这件事,别的事干不了.2 异步 异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已 ...

  8. Java:NIO 学习笔记-3

    Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...

  9. Java:NIO 学习笔记-2

    Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...

随机推荐

  1. 让这三个月来的更猛烈些吧,前端react同构项目

    昨天一篇文章讲述了我在这三个月中由.net到java的过程,其中踩坑填坑的细节真不是三言两语可以道尽,而完成时的喜悦也远非寻常可比(仅次于涨工资).然而到这并不算完结,作为前后端分离的忠实粉丝,我认为 ...

  2. Java restful web service 开发入门

    可用的框架有不少,我用的是jersey. 直接上代码,其实,如果你会web service 这个restful的就很好理解了,自己跑一遍就OK了 用到的类 User.java package demo ...

  3. 弱校ACM奋斗史

    看到这篇文章, 已是大三了, 我的ACM之路也即将走向终点, 感慨自己还是不够努力, 给自己的大学留下诸多遗憾. 和他们相比, 我差的就是太远了, 值得高兴的是我们学校有一个好老师-----赵靖老师, ...

  4. java异常捕获的一点感悟

    class Annoyance extends Exception {} class Sneeze extends Annoyance {} class Human { public static v ...

  5. Java将数据写入word文档(.doc)

    Java可用org.apache.poi包来操作word文档.org.apache.poi包可于官网上下载,解压后各jar作用如下图所示: 可根据需求导入对应的jar. 一.HWPFDocument类 ...

  6. 易云捷讯MySQL云数据库上线,推进IaaS与PaaS融合战略布局

    日前宣布,其基于MySQL的关系型云数据库已经正式上线公测,用户可通过易云管理控制台创建.监控与管理mysql数据库.此服务包括在线扩容.自动备份.灵活配置和监控告警等功能,旨在帮助用户实现便捷的运维 ...

  7. vTPM环境部署(ubuntu)

    注:1.系统:ubuntu16.04LTS2.ISO镜像:/home/huanghaoxiang/ubuntu-server.iso3.IMG路径:/home/TPM-Machine4.Login: ...

  8. sns社交系统ThinkSNS+ 更新至V0.8.2,新增圈子功能

    sns社交系统"ThinkSNS+"于7月15日发布了V0.8.0,含开源版本web+H5,及Android APP和iOS APP客户端. V0.8.2版本将于7月29日(本周六 ...

  9. Vue组件选项props

    前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props ...

  10. 如何编写更好的SQL查询:终极指南-第一部分

    结构化查询语言(SQL)是数据挖掘分析行业不可或缺的一项技能,总的来说,学习这个技能是比较容易的.对于SQL来说,编写查询语句只是第一步,确保查询语句高效并且适合于你的数据库操作工作,才是最重要的.这 ...