网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通讯,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端经过链接操做向服务器监听的地址发起链接请求,经过三次握手创建链接,若是链接创建成功,双方就能够经过网络套接字(Socket)进行通讯。编程
在基于传统同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口; Socket负责发起链接操做。链接成功以后,双方经过输入和输出流进行同步阻塞式通讯。服务器
BIO通讯模型图网络
经过上图所示的通讯模型图来熟悉下BIO的服务端通讯模型:采用BIO通讯模型的服务端,一般由一个独立的Acceptor线程负责监听客户端的链接,它接收到客户端链接请求以后为每一个客户端建立一个新的线程进行链路处理,处理完成以后,经过输出流返回应答给客户端,线程销毁。这就是典型的——请求——应答通讯模型。并发
该模型最大的问题就是缺少弹性伸缩能力,当客户端并发访问量增长后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,因为线程是Java虚拟机很是宝贵的系统资源,当线程数膨胀以后,系统的性能将急剧降低,随着并发访问量的继续增大,系统会发生线程堆栈溢出,建立新线程失败等问题,并最终致使进程宕机或者僵死,不能对外提供服务。异步
同步阻塞式I/O 模型高并发
BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须建立一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端链接。在高性能服务器应用领域,每每须要面向成千上万个客户端的并发链接,这种模型显然没法知足高性能,高并发接入的场景。性能
为了改进一线程一链接模型,后来又演进出了一种经过线程池或者消息队列实现1个或者多个线程处理N个客户端的模型,因为它的底层通讯机制依然使用同步阻塞I/O,因此被称为“伪异步”,下一节会讲到。spa