一个简单的servlet容器实现(2)--Connector实现

Connector实现(1)–整体架构


实现一个servlet容器首先从其输入和输出开始编写:

从上文中(https://blog.csdn.net/qq_34861102/article/details/79915762)已经介绍到:

  • Connector是一个servlet容器进行requestresponse的接口

  • 因此先从Connector的实现开始servlet容器的实现


HttpConnector类的实现:

  • 对一个servlet容器来说首先应该设置成多线程
  • 对于每一个线程要做的:
    • 等待HTTP请求
      • 创建一个服务器套接字用来等待HTTP请求
    • 为每一个请求创建支撑类(HttpProcessor
      • 在服务器套接字accept的时候调用
    • 调用支撑类中的方法(process

按照以上要求的代码:

package Connector;

import Connector.Process.HttpProcessor;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpConnector implements Runnable {

    volatile boolean stop = false;

    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();
        }
        while (!stop){
            //waiting the request
            Socket socket = null;
            try {
                socket = serverSocket.accept();
            } catch (Exception e){
                continue;
            }
            HttpProcessor httpRequestProcess = new HttpProcessor(this);
            httpRequestProcess.process(socket);
        }
    }
    public void start(){
        Thread thread = new Thread(this);
        thread.start();
    }
}

HttpProcessor类的实现:

  • process
    • 传入了一个Servlet类的对象
    • 通过其进行HTTP请求的解析
      • 获得套接字的输入流(关于此处流可以参见JavaIO:)
      • 创建一个HttpRequest实例
    • 并且完成HTTP响应的创建
      • 获得套接字的输出流
      • 创建一个HttpResponse实例
      • 创建内容
        • 方法–URI–协议/版本
        • 响应的头部
        • 主体内容
    • 对于请求又可以分成静态资源请求和动态servlet
      • 对应两种不同的类又可以分别对应类ServletProcessorStaticResourceProcessor

按照以上要求的代码:

package Connector.Process;
import Connector.HttpConnector;
import Connector.HttpRequest;
import Connector.HttpResponse;
import Container.ServletProcessor;
import Container.StaticResourceProcessor;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class HttpProcessor {

    private  HttpConnector httpConnector = null;
    private HttpRequest httpRequest = null;
    private HttpResponse httpResponse = null;

    public HttpProcessor(HttpConnector httpConnector) {
        this.httpConnector = httpConnector;
    }

    public void process(Socket socket) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            inputStream = socket.getInputStream();
            outputStream = socket.getOutputStream();
            // create httprequest
            httpRequest = new HttpRequest(inputStream);

            // create httpresponse
            httpResponse = new HttpResponse(outputStream);
            // there need some functions to finish the httpResponse
            httpResponse.setRequest(httpRequest);

            //check whether the request is a static source
            if (httpRequest.getRequestURI().startsWith("/servlet/")){
                ServletProcessor processor = new ServletProcessor();
                processor.process(httpRequest, httpResponse);
            } else {
                StaticResourceProcessor processor = new StaticResourceProcessor();
                processor.process(httpRequest, httpResponse);
            }

            //close the sotket
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

对于start up中的启动类,调用连接器方法即可:

package startup;

import Connector.HttpConnector;

public class Bootstrap {
    public static void main(String[] args){
        HttpConnector connector = new HttpConnector();
        connector.start();
    }
}

git地址:https://github.com/Outliwer/SimpledWebContainer

猜你喜欢

转载自blog.csdn.net/qq_34861102/article/details/80098513