You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Go to file
xiaoifei 819e070286
add readme
10 months ago
IMG add readme 10 months ago
lib Add annotations to dynamically load classes through reflection 10 months ago
src/main/java/com.xiaoyi add readme 10 months ago
webapps/hello/classes/com/xiaoyi Add annotations to dynamically load classes through reflection 10 months ago
.gitignore Upload 10 months ago
README.md add readme 10 months ago

README.md

基础

  • MyHttpRequest
    • parse()(解析流)
    • parseUri()请求的内容存储到uri
    • getUri()返回uri
  • MyHttpResponse
    • sendRedirect(String uri)判断资源是否存在不存在返回404 ,存在返回目标资源)
    • getResponseMessage(String code, String message)(构造响应消息)
  • MyHttpServer
    • start()(循环接收浏览器请求,并且处理请求)
  • Test`
    • main()(主方法测试类)
MyHttpRequest
import java.io.IOException;
import java.io.InputStream;

public class MyHttpRequest {
    private InputStream inputStream;
    private String uri;

    public MyHttpRequest(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    /**
     * 解析流
     */
    public void parse(){
        try {
            byte[] bytes = new byte[1024];
            inputStream.read(bytes);
            String request = new String(bytes);
            parseUri(request);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 请求判断
     */
    public void parseUri(String request) {
        int index1,index2;
        index1 = request.indexOf(" ");//找空格下标
        index2 = request.indexOf(" ",index1+1);//找空格下标2
        uri = request.substring(index1+1,index2);//输出资源位置
        System.out.println(uri);
    }

    public String getUri() {
        return this.uri;
    }
}
MyHttpResponse
import java.io.*;

public class MyHttpResponse {
    private int statusCode;
    private String statusMessage;

    private OutputStream outputStream;

    public MyHttpResponse(OutputStream outputStream){
        this.outputStream = outputStream;
    }

    public void sendRedirect(String uri){
        //判断资源是否存在
        // 不存在返回404
        // 存在返回目标资源
        File file = new File(System.getProperty("user.dir")+"/WebContent" + uri);
        if (file.exists()){
            try {
                FileInputStream fileInputStream = new FileInputStream(file);
                byte[] bytes = new byte[(int)file.length()];
                fileInputStream.read(bytes);
                String result = new String(bytes);
//                System.out.println(result);
                String response = getResponseMessage("200,",result);
                this.outputStream.write(response.getBytes());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

        }else {
            try {
                String error = getResponseMessage("404","404 File Not Found!");
                this.outputStream.write(error.getBytes());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public String getResponseMessage(String code, String message){
        return "HTTP/1.1 " + code + "\r\n" +
                "Content-Type: text/html\r\n" +
                "Content-Length: " + message.length() +
                "\r\n" +
                "\r\n" +
                message;

    }
}
MyHttpServer
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyHttpServer {
    private int port = 8080;

    public void receiving()
    {
        try{
            //create socket service
            ServerSocket serverSocket = new ServerSocket(port);
            while(true){
                //获取连接对象
                Socket socket = serverSocket.accept();
                //获取链接对象输入流
                InputStream inputStream = socket.getInputStream();
                //创建request
                MyHttpRequest request = new MyHttpRequest(inputStream);
                //解析请求
                request.parse();
                //创建响应
                OutputStream outputStream = socket.getOutputStream();
                MyHttpResponse response = new MyHttpResponse(outputStream);
                //进行响应
                response.sendRedirect(request.getUri());

            }
            //loop accept requests
        }catch (Exception e){

        }

    }
}
Test
public class Test {
    public static void main(String[] args) {
        System.out.println("server startup successfully");
        MyHttpServer server = new MyHttpServer();
        server.receiving();
    }
}

进阶

Tomcat的两个重要身份

  1. http服务器
  2. Tomcat是一个Servlet容器

使用Servlet规范来实现Tomcat

  • AbstractHttpServletRequest (implements HttpServletRequest)
  • AbstractHttpServletResponse (implements HttpServletResponse)
  • ResponseServletOutputStream (extends ServletOutputStream)
    • write(int b)
    • getBytes()
    • getPos()
  • MyHttpRequest (extends AbstractHttpServletRequest)
    • parse()(解析流)
    • parseMessageLine()(请求行解析)
    • getMethod()(返回请求方式)
    • getRequestURL()(返回请求地址,通常为appName/Servlet
    • getProtocol()(返回协议)
  • MyHttpResponse (extends AbstractHttpServletResponse)
    • public MyHttpResponse(MyHttpRequest request, OutputStream outputStream)(构造方法)
    • setStatus(int i, String s)
    • getStatus()
    • addHeader(String s, String s1)
    • ResponseServletOutputStream getOutputStream()servlet的doGet所write的消息体
    • complete()(完成响应,调用下面三个方法)
    • sendResponseMsgLine()
    • sendResponseMsgHeader()
    • sendResponseMsgBody()
  • Tomcat (添加线程池)
    • main(String[] args)启动Tomcat
    • deployApps()(利用反射部署指定目录下的应用)
    • start()(循环接收浏览器请求,并且处理请求)
    • getAllFilePath()(递归的获得项目内所有文件)
    • getContextMap()(添加应用映射)
  • SocketProcessor (implements Runnable)
    • run()调用processSocket
    • processSocket(Socket socket)(处理请求)
  • Context
    • addUrlPatternMapping(String pattern, Servlet servlet)添加应用下Servlet映射
    • getByUrlPatternMapping(String urlPattern) 得到Servlet对象
  • DefaultServlet (extends HttpServlet)