Java网络IO编程
一、概述
网络编程的基本模型是C/S模型,即两个进程间的通信。 服务端提供IP和监听端口,客户端向服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。
二、Java对网络IO编程的支持
Java对网络IO编程的支持,可以分为传统的BIO、伪异步IO、NIO和AIO,下面分别对其进行介绍。
1、传统的BIO(blocking I/O):同步并阻塞
采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理没处理完成后,通过输出流返回应答给客户端,线程销毁。即典型的一请求一应答通信模型。
该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,Java中的线程也是比较宝贵的系统资源,线程数量快速膨胀后,系统的性能将急剧下降,随着访问量的继续增大,系统最终就死-掉-了。
2、伪异步IO编程
为了解决同步阻塞IO一个客户端连接需要一个服务器线程的问题,有人对服务器的线程模型进行优化,服务端采用线程池来处理多个客户端请求,形成客户端请求数M,服务端最大线程数N的比例关系,其中M可以远大于N,通过线程池可以灵活的调配线程资源,设置线程的最大值,放置由于海量并发导致服务端产生过多线程,引起服务器资源耗尽的问题。
该模型的弊端在于,正是因为限制了线程数量,如果发生大量并发请求,超过最大数量的线程就只能等待,直到线程池中的有空闲的线程可以被复用。
3、NIO (non-blocking I/O):同步非阻塞
服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。