深入剖析Tomcat-实现简单的Web服务器

来源:互联网 发布:剑三新建角色捏脸数据 编辑:程序博客网 时间:2024/05/15 23:46

在深入剖析Tomcat中,用socket实现了一个简单的服务器,服务器监听80端口,接受浏览器的请求,如果请求了静态资源,比如index.html,那么会将webroot下的静态文件index.html通过socket发送给浏览器
HttpServer程序

public class HttpServer {    //静态资源目录为webroot    public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator +"webroot";    private  static final String SHUTDOWN_COMMAND = "/SHUTDOWN";    private  boolean shutdown = false;    public static void main(String[] args) {        System.out.println(System.getProperty("user.dir"));        HttpServer server = new HttpServer();        server.await();    }    public void await(){        int port =80;        ServerSocket serverSocket = null;        try {             serverSocket = new ServerSocket(port, 1,InetAddress.getByName("127.0.0.1"));        } catch (IOException e) {            e.printStackTrace();            System.exit(-1);        }        while(!shutdown){            Socket socket  = null;            InputStream input = null;            OutputStream out = null;            try{                socket = serverSocket.accept();                input = socket.getInputStream();                out = socket.getOutputStream();                Request request  = new Request(input);                request.parse();;                Response response = new Response(out);                response.setRequest(request);                response.sendStaticResource();                socket.close();            }catch (Exception e){                e.printStackTrace();            }        }    }}

Request类,解析请求的url

public class Request {    private InputStream input;    private String uri;    public Request(InputStream input){        this.input = input;    }    public  void parse(){        StringBuffer request = new StringBuffer(2048);        int i;        byte[] buffer = new byte[2048];        try{            i = input.read(buffer);        }catch (Exception e){            e.printStackTrace();;            i = -1;        }        for(int j = 0; j<i;j++){            request.append((char)buffer[j]);        }        System.out.print(request.toString());        uri = parseUri(request.toString());    }    private String parseUri(String requestString){        int index1,index2;        index1 = requestString.indexOf(' ');        if(index1 != -1){            index2 = requestString.indexOf(' ',index1+1);            if(index2 > index1){                return  requestString.substring(index1+1,index2);            }        }        return null;    }    public String getUri(){        return this.uri;    }}

Response类,返回数据到浏览器

public class Response {    private static final int BUFFER_SIZE =1024;    Request request;    OutputStream output;    public Response(OutputStream output){        this.output = output;    }    public void setRequest(Request request){        this.request = request;    }    public void sendStaticResource() throws IOException {        byte[] bytes = new byte[BUFFER_SIZE];        FileInputStream fis = null;        try{            File file = new File(HttpServer.WEB_ROOT,request.getUri());            if(file.exists()){                fis = new FileInputStream(file);                int ch = fis.read(bytes,0,BUFFER_SIZE);                while(ch != -1){                    output.write(bytes,0,ch);                    ch = fis.read(bytes,0,BUFFER_SIZE);                }            }else {                String errorMessage = "HTTP/1.1 404 File Not Found\r\n"+                        "Content-Type: text/html \r\n" +                        "Content-Length: 23\r\n"+                        "\r\n"+                        "<h1>File Not Found</h1>";                output.write(errorMessage.getBytes());            }        }catch (Exception e){            System.out.println(e.toString());        }finally {            if(fis !=null){                fis.close();            }        }    }}

服务器截图
这里写图片描述
浏览器截图
这里写图片描述

从上面的程序来看,浏览器发送的数据最终也是通过socket发送的,服务器程序监听端口,然后收到浏览器发送的头信息。然后吧index.html的内容用outputstream流发送到浏览器