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);
        }
    }                

       

  • 相关阅读:
    史上最全web.xml配置文件元素详解
    SpringMVC后台接收list类型的数据的实现方式
    史上最全的maven的pom.xml文件详解
    阿里菜鸟同学迟到的2018年个人总结(文末彩蛋)
    可以落地的DDD到底长什么样?
    欠的债,这一次都还给你们
    主流分布式架构的风流韵事...
    分布式架构的前世今生...
    分布式架构之美~
    征服诱人的Vagrant!
  • 原文地址:https://www.cnblogs.com/zengyou/p/2839731.html
Copyright © 2011-2022 走看看