[笔记]深入剖析Tomcat-servlet容器和连接器
http客户端通过socket类与服务器通信,new Socket("yahoo.com",80);服务器通过ServerSocket套接字创建时绑定的地址和端口等待客户端请求,new ServerSocket(8080,1,InetAddress.getByName("127.0.0.1")),
当接收到请求后,accept函数才会返回。
//服务端
ServerSocket serverSocket = new ServerSocket(8080,1,InetAddress.getByName("127.0.0.1"));
Socket socket = serverSocket.accept();
InputStream input = socket.getInputStream();
OutputStream input = socket.getOutputStream();
Request类
用来表示一个http请求
Request request = new Request(input);
Response
用来表示http响应
Response response = newResponse(output);
Servlet 容器
javax.servlet.Servlet接口声明5个方法
init //初始化一次
service//客户端请求到达后调用,可多次调用,将javax.servlet.ServerRequest和javax.servlet.ServerResponse作为参数传入。
destory
getservletConfig
getServletInfo
public class HttpServer{
public static void main(String[] arg){
while(!loop){
//...省略
ServerSocket serverSocket = new(...)
Socket socket = setverSocket.accept();
InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();
Request request = new Request(input);
Response response = new Response(output);
ServletProcessor servletProcessor = new ServletProcessor();
servletProcessor.process(request, Response);
}
}
}
//servlet类
public class clientServlet implements Servlet{
//init()
//destory()
//getServletInfo()
//getServletConfig()
public void service(ServletRequest request, ServletResponse response){
//处理
}
}
//Request类
public class Request implement ServletRequest{
}
//Response类
public class Response implement ServletResponse{
}
//ServletProcessor类
public class ServletProcessor{
public void process(Request request, Response response){
URL[] urls = new URL(1);
//...url 处理
String servletName = null;
//...servletName处理
URLClassLoader loader = new URLClassLoader(urls);
Class class = loader.loadClass(servletName);
Servlet servlet = class.newInstance();
servlet.service((ServletRequest)request, (ServletResponse)response);
}
}
连接器
和httpserver类似,过程如下:
public final class Bootstrap{
public static void main(String[] args){
HttpConnector httpConnector = new HttpConnector();
httpConnector.start();
}
}
public class HttpConnector implements Runnable{
public void run(){
while(!loop){
//...省略
ServerSocket serverSocket = new(...)
Socket socket = setverSocket.accept();
HttpProcessor httpProcessor = new HttpProcessor(this);
httpProcessor.process(socket);
}
}
public void start(){
Thread thread = new Thread(this);
thread.strart();
}
}
//HTTPProcessor类
public class HttpProcessor{
public void process(Socket socket){
SocketInputStream input = new(SocketInputStream(socket.getInputStream(), 2048);
OutputStream output = socket.getOutputStream();
HttpRequest request = new HttpRequest(input);
HttpResponse response = new HttpResponse(output);
response.setRequest(request);
parseRequest(input, output); //处理请求
parseHeaders(input); //解析头部
socket.close();
ServletProcessor servletProcessor = new ServletProcessor();
servletProcessor(request, response);
}
public void parseRequest(SocketInputStream input , OutputStream output){
//解析请求行
input.readRequestLine(requestLine);//读取j请求行
String method = new String(requestLine.method, 0, request.lineEnd);//获取方法
String url =. ..;
String protocal = ...;
String queryString = ...; //从uri中获取querystring
//读取jsessionid
//修正uri
//解析header
HttpHeader header =new HttpHeader();
input.readHeader(header);
//解析cookie
//获取参数
//get请求时,通过RequestUtil.parseParameters解析到HashMap
//post请求时,通过header的contenttype和contentlength读取,再调用RequestUtil
}
}
//servlet类
public class clientServlet implements Servlet{
//init()
//destory()
//getServletInfo()
//getServletConfig()
public void service(ServletRequest request, ServletResponse response){
//处理
}
}
//ServletProcessor类
public class ServletProcessor{
public void process(Request request, Response response){
URL[] urls = new URL(1);
//...url 处理
String servletName = null;
//...servletName处理
URLClassLoader loader = new URLClassLoader(urls);
Class class = loader.loadClass(servletName);
Servlet servlet = class.newInstance();
servlet.service((ServletRequest)request, (ServletResponse)response);
}
}
页:
[1]