NIO

简介: NIO

NIO

三大组件

Channel & Buffer

channel有点类似于stream,它是读写数据的双向通道,可以从channel将数据读入buffer,也可以将buffer的数据写入channel,而之间文件操作使用的stream要么是输入,要么是输出,channel比stream更为底层。

常见的Channel
  • FileChannel:用于操作文件
  • DatagramChannel:用于UDP协议
  • SocketChannel:用于TCP协议
  • ServerSocketChannel:用于TCP协议
常见的Buffer
  • ByteBuffer

    • MappedByteBuffer
    • DirectByteBuffer
    • HeapByteBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer
  • CharBuffer
Selector
传统多线程版服务器程序设计

23f182627d0d4c95b04a07f016b15802.png

服务器会为每个客户端创建新的线程与套接字进行会话

缺点
  • 内存占用高
  • 线程上下文切换成本高

    与cpu有直接关系,cpu线程数表示当前可并行的线程数量,唤醒状态的线程失去cpu时间片段后需要保存当前的线程执行信息(例如指令执行到哪一行等)

  • 只适合连接数少的场景
线程池版服务器程序设计

89048a3e9c124745b5e9dd9c435e39ac.png

客户端需要等待线程池有空闲线程时才能继续处理请求

缺点
  • 阻塞模式下,线程仅能处理一个socket连接
  • 仅适合短连接场景
Selector版服务器设计

selector的作用就是配合一个线程来管理多个channel,获取这些channel上发生的事件,这些channel工作在非阻塞模式下,不会让线程吊死在一个channel上。适合连接数特别多,但流量低的场景

e4a575abe07741ebb311c70a9f59c4f4.png

调用selector的select()方法会阻塞直到channel发生了读写就绪事件,这些事件发生,select方法就会返回这些事件交给thread来处理

相关文章
|
消息中间件 安全 Java
NIO -学习分享
NIO -学习分享
70 0
|
存储 索引
NIO学习一
NIO相比普通IO提供了功能更为强大、处理数据更快的解决方案。 常用于高性能服务器上。NIO实现高性能处理的原理是使用较少的线程来处理更多的任务 常规io使用的byte[]、char[]进行封装,而NIO采用ByteBuffer类来操作数据,再结合 针对File或socket技术的channel,采用同步非阻塞技术来实现高性能处理,而Netty 正是采用ByteBuffer(缓冲区)、Channel(通道)、Selector(选择器)进行封装的。 因此我们需要先了解NIO相关的知识。
104 0
NIO学习一
|
前端开发 Java Linux
NIO学习笔记(三) 甚欢篇
NIO学习笔记(三) 甚欢篇
NIO学习笔记(三) 甚欢篇
【NIO】NIO三剑客之一ByteBuffer介绍与使用
【NIO】NIO三剑客之一ByteBuffer介绍与使用
【NIO】NIO三剑客之一ByteBuffer介绍与使用
|
存储 监控 网络协议
NIO
所谓NIO,就是New IO的缩写。是从JDK 1.4开始引入的全新的IO API。NIO将以更高效的方式进行文件的读写操作,可完全代替传统的IO API使用。而且JDK 1.7对NIO又进行了更新,可以称作NIO 2.0。
NIO
|
存储 安全 Java
【NIO】Java NIO之缓冲
在笔者打算学习Netty框架时,发现很有必要先学习NIO,因此便有了本博文,首先介绍的是NIO中的缓冲。
108 0
【NIO】Java NIO之缓冲
|
存储 安全 网络协议
【NIO】Java NIO之通道
 前面学习了缓冲区的相关知识点,接下来学习通道。
123 0
【NIO】Java NIO之通道
|
前端开发 网络协议 Java
netty和nio
netty是一个nio客户机-服务器框架,它简化了tcp和udp网络编程,相对于java传统nio,netty还屏蔽了操作系统的差异性,并且兼顾了性能。 Channel channel封装了对socket的原子操作,实质是对socket的封装和扩展。
1351 0
|
Java 应用服务中间件 Linux
NIO究竟牛X在哪?
在进入NIO之前,先回顾一下Java标准IO方式实现的网络server端: public class IOServerThreadPool { private static final Logger LOGGER = LoggerFactory.
1068 0
|
前端开发 Java
使用netty的NIO来实现一个简单的TimeServer
只想以此来加深java的NIO这方面的知识点~~~ 参考书籍《netty权威指南》(第二版) 这本书,第一二三章,前面讲java的bio,nio,nio2, 讲得蛮好的。
1388 0