NIO学习

原创 2017年01月03日 18:08:22

NIO

简介

  • 随着JavaIO类库的不断发展和改进,基于Java的网络编程会变得越来越简单。随着异步IO功能的增强,基于JavaNIO开发的网络服务器甚至不逊色与C++开发的网络程序。
  • 记录一下学习BIO、NIO以及JDK1.7提供的NIO2.0的使用。

传统的BIO编程

  • 这个可以搜索一下socket,就有很多。
  • 通过一个线程来监听所有的socket连接,连接成功则新建线程去处理客户端操作。
  • 问题是伸缩性差,随着并发访问量增大,会很好系统资源,可能造成处理失败。由于是阻塞时的读写,会造成较大的读写延迟。
  • 源码略。

伪异步IO编程

  • 为了解决传统的编程模型问题,有人使用线程池或者消息队列实现N各线程处理M个客户端的模型。M远大于N。

模型图

伪异步IO模型图

  • Acceptor是一个线程,通过死循环来监听socket连接,如果有连接成功,则新建Runnable对象,提交给线程池处理。

源码分析

  • 跟BIO的代码差不多,只是在Server端加了线程池,来处理客户端socket连接。并将连接封装到Runnable对象,并交给ThreadPool处理。

弊端

  • 通过以上模型及代码分析,很容易知道通信底层还是使用的socket,读写还是同步阻塞的,因此,以上优化只是减小了过多创建销毁线程的开销,并不能从根本上解决阻塞读写产生的问题。

NIO编程

简介

  • NIO(New I/O),较多人喜欢称作Non-block I/O.
  • NIO新增了SocketChannel和ServerSocketChannel两种套接字通道。都支持阻塞和非阻塞两种模式。
  • 相关概念
    • 缓冲区Buffer
      • 缓冲区实际上是一个数组,封装了对数据结构化访问以及维护读写位置等信息。
      • 在NIO库中,所有数据都是用缓冲区处理的,在读取数据时,直接读取到缓冲区。写入数据时,直接写入写缓冲区。任何时候访问NIO中的数据,都是 通过缓冲区进行操作。
      • 最常用的的缓冲区是ByteBuffer。大部分Java基本类型都对应一种缓冲区。类图如下
        Buffer类图
    • 通道channel
      • Channel 是一个通道,可以通过它读取和写入数据。InputStream和OutputStream各自只能在一个方向上操作。
      • Channel是全双工的,所以它可以比流更好地映射底层的api。
      • Channel类图如下:
        Channel类图
    • 多路复用器Selector
      • Selector是NIO的编程基础。多路复用器提供选择已经就绪的任务的能力。
      • Selector会不断轮询注册在其上的Channel,如果channel上面有了新的TCP连接、读取或者写事件,这个channel就是就绪状态,会被Selector轮询出来。然后通过SelectionKey集合可以获取就绪的Channel集合,进行IO操作。
        *一个Selector可以同时轮询多个Channel,由于JDK使用了epoll()代替传统的select实现,所以没有最大连接句柄1024/2048的限制。这意味着只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端。

NIO服务端序列图


* 未完待续

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java NIO入门学习(一)

本文为NIO入门学习的第一篇,将会介绍NIO中几个重要的概念。 I/O即输入输出,指的是计算机和外界的接口,或者是单个程序同计算机其他部分的接口。 在Java1.4之前的I/O系统中,提供的都是面向流...
  • u011500793
  • u011500793
  • 2014年03月19日 08:20
  • 2439

JAVA NIO 学习总结(上)

最近看到《java核心技术》的io部分,学习如何访问文件,如何以二进制格式以及文本格式来读写文件,以及jdk后续更新的nio新特性,这里主要总结nio的新内容。demo文件在:https://gith...
  • lovejj1994
  • lovejj1994
  • 2017年01月23日 15:05
  • 355

Netty学习3-NIO详解

1 代码 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; impo...
  • woshixuye
  • woshixuye
  • 2016年12月18日 20:51
  • 638

NIO学习笔记——缓冲区(Buffer)详解

缓冲区是包在一个对象内的基本数据元素数组,Buffer类相比一个简单的数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。Buffer的属性容量(capacity):缓冲区能够容纳的数据元...
  • fuyuwei2015
  • fuyuwei2015
  • 2017年06月20日 21:40
  • 570

Java NIO学习总结一(非阻塞特性)

NIO(New IO)是从Java 1.4版开始引入的新的IO API,其与标准的JAVA IO API的差异本质上体现在资源的利用方式上。可以从现实中餐厅排队的例子来理解这一点,饭点到了,某顾客选择...
  • c_craft
  • c_craft
  • 2015年12月29日 11:09
  • 891

java nio 传统标准io socket 和nio socket比较与学习

在计算机系统中,最不可靠的就是网络请求,我们通过服务器端给客户端echo信息(客户端请求什么信息服务端就返回给客户端什么信息)。比较两种socket io的优劣。 一.标准io socket:    ...
  • sean417
  • sean417
  • 2017年04月09日 16:33
  • 1731

攻破JAVA NIO技术壁垒

现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty。学习和掌握NIO技术已经不是一个JAVA攻城狮的加分技能,而是一个必备技能。再者,现在互联网的面...
  • u013256816
  • u013256816
  • 2016年05月19日 21:25
  • 20753

JAVA NIO SOCKET大文件上传服务器

当前很多手机应用或者是网络应用都需要支持大文件上传功能,有些用FTP来实现上传但是FTP存在许多的问题。比如FTP的安全问题还有不支持GZIP压缩等问题。采用SOCKET来实现文件上传,很轻松就可以实...
  • reaganjava
  • reaganjava
  • 2013年03月19日 12:48
  • 2516

BIO与NIO、AIO的区别(这个容易理解)

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO      在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一...
  • skiof007
  • skiof007
  • 2016年10月20日 15:52
  • 36021

NIO,BIO,AIO,JAVA通讯编程学习笔记3

下文内容摘自《Netty 权威指南》 JDK1.7升级了NIO类库,升级后的NIO类库被称为NIO2.0,引人注目的是Java正式提供了异步文件IO操作,同时提供了与Unix网络编程事件驱动IO...
  • rishengcsdn
  • rishengcsdn
  • 2016年11月01日 16:44
  • 759
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NIO学习
举报原因:
原因补充:

(最多只允许输入30个字)