今天开始学习 Tomcat 源码, 本系列采用的是 Tomcat 8.5.57 源码构建, 在学习 Tomcat 源码之前, 先来学习基础知识 : 网络 I/O 模型
Java 共支持 3 种网络 /IO 模型:BIO、NIO、AIO
BIO
Blocking IO, 同步并阻塞 (传统阻塞型),一般搭配线程池来使用, 否则只有一条线程在工作! 其中 : ServerSocket#accept() 和 Socket#read()/write() 会阻塞, 如果没有线程池, 只能 一次处理一个连接, 其他连接都会阻塞
BIO 方式适用于 连接数目比较小且固定 的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,程序简单易理解
编写BIO程序
// 线程池应该用 ThreadPoolExcuter 创建
ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 10,
5, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
try {
ServerSocket serverSocket = new ServerSocket(6666);
while (true) {
// accept 会阻塞
Socket socket = serverSocket.accept()
pool.execute(() -> link(socket));
}....
}
private static void link(Socket socket) {
byte[] bytes = new byte[1024];
try {
InputStream inputStream = socket.getInputStream();
while (true) {
// read 也会阻塞
int read = inputStream.read(bytes);
if (read > 0) {
System.out.println("客户端发送 : " + new String(bytes, 0, read));
}