JAVA IO通信

我们使用的APP类似于QQ,MSN,WECHAT,都有即时通讯的功能,那么有人会想这个功能到底是如何实现的呢?我们就一起来看一下JAVA中的JAVAIO通信。

JAVA中网络IO有几种实现方式,分别是BIO,NIO

传统的BIO编程

BIO通信模型会为客户端的每一个Socket建立一个连接,每一个连接都会再服务端创建一个线程,每一个线程进行读写的时候都是处于阻塞状态,可想而知当当有大量的连接时的话就会创建大量的线程,线程是虚拟机的最宝贵的资源,这样就有可能引起down机的可能,无法应对高并发,这就是典型的一应一答式的连接;

 

 

 

伪异步I/O编程

为了解决这个问题我们可以使用线程池来管理这些线程,实现了一个或者多个线程来处理多个客户端的模型。这个通常被称为“伪异步IO模型”

 

在服务端 有一个acceptor线程。有这个线程 之后他会把客户端的socket封装成一个task,然后把这个task丢到线程池当中,由于线程池可以限制线程的个数,这样就很好的解决了down的行为, 但是就是由于限制了个数,超过了线程个数的链接就必须等待,直到有空闲的线程才能被服用,而对线程进行读取时,会一直阻塞,直到发生了,1.读取玩数据 2.有数据可读 3.发生异常,这就是伪异步IO的最大缺陷,后面所说的NIO很好的解决了这个问题

NIO 编程

   NIO提供了与传统的BIO模型中的 Socket与ServerSocket不相同的SocketChannel和ServerSocketChannel两种不同的套接字通道实现,新增的两种通道支持阻塞和非阻塞两种形式模式

阻塞模式与传统的一样,比较简单,但是性能和可靠性都不好,非阻塞模式正好相反,下面介绍下基础知识

 缓冲区buffer

buffer是一个对象,包括了要读取和存入的数据

在NIO库中,所有的数据都是通过buffer缓冲区来处理的,再读取数据时,他是直接读取的缓冲区的数据,存入也是直接存到缓冲区中, 所有的操作都是通过缓冲区进行操作的

 通道Channel

channel就是水管一样,可以是双向的,他跟流不同的是,流仅仅是单向的,Channel主要分为两大类,

 *SelectableChannel 用户网络读写

 *FileChannel  用于文件进行读写

  多路复用器Selector

Selector是NIO编程的基础。

  selector提供了 就绪任务的能力,selectore会轮询在它上面注册的channel , 当其中的channel继续了读或者写的操作的时候,该channel就会处于就绪状态,会被轮询出来,然后通过selectionkey获取Channel的集合,进行后面的操作

由于jdk中使用了epool代替了传统的selector,所以没有最大的连接限制,所以只需要一个线程进行selector的轮询,就能接入成千上万的客户端。

 市面上有很多都是基于NIO的框架以及工具,比如netty,http-socket等等等等

下一篇会教大家如何使用BIO模型,NIO模型,包括Netty框架,以及Netty框架与Springboot整合

展开阅读全文

没有更多推荐了,返回首页