[笔记]深入剖析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);
    }
}                

   

原文地址:https://www.cnblogs.com/zengyou/p/2839731.html