java实战---手写简易Tomcat

文章改自:手写一个简化版Tomcat - 刘半仙的个人空间 - OSCHINA - 中文开源技术交流社区

package com.ruoyi.common.enums;

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

class Response {
    public static final int BUFFER_SIZE = 2048;
    //浏览器访问D盘的文件
    private static final String WEB_ROOT ="D:";
    private Request request;
    private OutputStream output;

    public Response(OutputStream output) {
        this.output = output;
    }
    public void setRequest(Request request) {
        this.request = request;
    }

    public void sendStaticResource() throws IOException {
        char[] bytes = new char[BUFFER_SIZE];
        Reader fis = null;
        try {
            //拼接本地目录和浏览器端口号后面的目录
            File file = new File(WEB_ROOT, request.getUrL());
            //如果文件存在,且不是个目录
            if (file.exists() && !file.isDirectory()) {
                fis = new FileReader(file);
                 fis.read(bytes, 0, BUFFER_SIZE);

                String str=new String(bytes);
                String returnMessage ="HTTP/1.1 200 Content is \r\n" +
                        "Content-Type: text/html\r\n" +
                        "Content-Length: "+str.length()+"\r\n" +
                        "\r\n" +
                        str;
                output.write(returnMessage.getBytes());
            }else {
                //文件不存在,返回给浏览器响应提示,这里可以拼接HTML任何元素
                String retMessage = "<h1>"+file.getName()+" file or directory not exists</h1>";
                String returnMessage ="HTTP/1.1 404 File Not Found\r\n" +
                        "Content-Type: text/html\r\n" +
                        "Content-Length: "+retMessage.length()+"\r\n" +
                        "\r\n" +
                        retMessage;
                output.write(returnMessage.getBytes());
            }
        }
        catch (Exception e) {
            System.out.println(e.toString() );
        }
        finally {
            if (fis!=null)
                fis.close();
        }
    }
}

class Request {
    private InputStream is;
    private String url;

    public Request(InputStream input) {
        this.is = input;
    }
    public void parse() {
        //从socket中读取一个2048长度字符
        StringBuffer request = new StringBuffer(Response.BUFFER_SIZE);
        int i;
        byte[] buffer = new byte[Response.BUFFER_SIZE];
        try {
            i = is.read(buffer);
        }
        catch (IOException e) {
            e.printStackTrace();
            i = -1;
        }
        for (int j=0; j<i; j++) {
            request.append((char) buffer[j]);
        }
        //打印读取的socket中的内容
        System.out.print(request.toString());
        url = parseUrL(request.toString());
    }

    private String parseUrL(String requestString) {
        int index1, index2;
        index1 = requestString.indexOf(' ');//看socket获取请求头是否有值
        if (index1 != -1) {
            index2 = requestString.indexOf(' ', index1 + 1);
            if (index2 > index1)
                return requestString.substring(index1 + 1, index2);
        }
        return null;
    }

    public String getUrL() {
        return url;
    }

}

public class HttpServer {
    // 用于判断是否需要关闭容器
    private boolean shutdown = false;

    public void acceptWait() {
        ServerSocket serverSocket = null;
        try {
            //端口号,最大链接数,ip地址
            serverSocket = new ServerSocket(8080, 1, InetAddress.getByName("127.0.0.1"));
        }
        catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
        // 等待用户发请求
        while (!shutdown) {
            try {
                Socket socket = serverSocket.accept();
                InputStream is = socket.getInputStream();
                OutputStream os = socket.getOutputStream();
                // 接受请求参数
                Request request = new Request(is);
                request.parse();
                // 创建用于返回浏览器的对象
                Response response = new Response(os);
                response.setRequest(request);
                response.sendStaticResource();
                //关闭一次请求的socket,因为http请求就是采用短连接的方式
                socket.close();
                //如果请求地址是/shutdown  则关闭容器
                if(null != request){
                    shutdown = request.getUrL().equals("/shutdown");
                }
            }
            catch (Exception e) {
                e.printStackTrace();
                continue;
            }
        }
    }

    public static void main(String[] args) {
        HttpServer server = new HttpServer();
        server.acceptWait();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值