catalina 中的主要两个模块是 连接器和容器。
一个规范的连接器必须是创建了
javax.servlet.http.HttpServletRequest 和 javax.servlet.http.HttpServletResponse。并将这两个对象传递给被调用servlet的service方法。
连接器解析HTTP请求头部,并让servlet 可以获得头部,cookies,参数名/值等。
HttpConnector 类指代一个连接器,职责是创建一个服务器套接字用来等待前来的HTTP请求。
public class HttpConnector implements Runnable {
boolean stopped;
private String scheme = "http";
public String getScheme() {
return scheme;
}
public void run() {
ServerSocket serverSocket = null;
int port = 8080;
try {
serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
while (!stopped) {
// Accept the next incoming connection from the server socket
Socket socket = null;
try {
socket = serverSocket.accept();
} catch (Exception e) {
continue;
}
// Hand this socket off to an HttpProcessor
HttpProcessor processor = new HttpProcessor(this);
processor.process(socket);
}
}
public void start() {
Thread thread = new Thread(this);
thread.start();
}
}
主要做的事情是:
- 等待HTTP请求
- 为每个请求创建一个HttpProcessor 实例
- 调用HttpProcessor 的process 方法
而HttpProcessor 的process 方法主要是会做下面的事情:
- 创建一个HttpRequest 对象
- 创建一个HttpResponse 对象
- 解析HTTP请求的第一行和头部,并放到HttpRequest 对象
- 解析HttpRequest 对象