zoukankan      html  css  js  c++  java
  • [笔记]深入剖析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);
        }
    }                

       

  • 相关阅读:
    HDU 2236 无题Ⅱ
    Golden Tiger Claw(二分图)
    HDU 5969 最大的位或 (思维,贪心)
    HDU 3686 Traffic Real Time Query System (图论)
    SCOI 2016 萌萌哒
    Spring Boot支持控制台Banner定制
    构建第一个Spring Boot程序
    Spring Boot重要模块
    Java fastjson JSON和String互相转换
    BCompare 4 Windows激活方法【试用期30天重置】
  • 原文地址:https://www.cnblogs.com/zengyou/p/2839731.html
Copyright © 2011-2022 走看看