• <满血复活之Tomcat原理实现> 创建一个基本的Server


    今天看了How Tomcat work的第一章。

    关键有三个类.

      ..HttpServer
      ..Request

      ..Response

    HttpServer  主要是有个方法能处理http发起请求的url 

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;

    public class HttpServer {
    public static final String WEB_ROOT=System.getProperty("user.dir")+File.separator+"webroot";

    private static final String SHUTDOWN_COMMAND="/shutdown";

    boolean shutdown = false;

    public void await() throws IOException{
    ServerSocket serverSocket = null;
    int port = 8080;

    try {
    serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
    } catch (UnknownHostException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    System.exit(1);
    }

    while(!shutdown){
    Socket socket = null;
    InputStream input = null;
    OutputStream output = null;


    socket = serverSocket.accept();
    input = socket.getInputStream();
    output = socket.getOutputStream();

    Request request = new Request(input);
    request.parse();


    Response response = new Response(output);
    response.setRequest(request);
    response.sendStaticResourse();

    socket.close();

    shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
    }

    }


    public static void main(String[] args) throws IOException {
    HttpServer hs = new HttpServer();
    hs.await();
    System.out.println(WEB_ROOT);
    }

    }

    Request类 处理socket流里面信息

    import java.io.IOException;
    import java.io.InputStream;

    public class Request {
    InputStream input = null;
    String uri = null;
    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(IOException e){
    e.printStackTrace();
    i = -1;
    }

    for (int j=0; j < i; j++){
    request.append(buffer[j]);
    }

    System.out.println(request.toString());
    uri = parseUri(request.toString());
    }


    public String parseUri(String url){
    int index1,index2;
    index1 = url.indexOf(" ");
    if(index1 != -1){
    index2 = url.indexOf(" ", index1 + 1);
    if(index2 > index1){
    return url.substring(index1+1,index2);
    }
    }

    return "";
    }

    public String getUri(){
    return uri;
    }
    }

    Response

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.OutputStream;

    public class Response {
    OutputStream output = null;
    Request request = null;

    public Response(OutputStream output) {
    this.output = output;
    }

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

    public void sendStaticResourse() throws IOException{
    byte[] b = new byte[2048];

    FileInputStream fis = null;
    try {
    File file = new File(HttpServer.WEB_ROOT,request.getUri());


    if(file.exists()){

    fis = new FileInputStream(file);
    int ch = fis.read(b,0,2048);

    while(ch != -1 ){
    output.write(b, 0,2048);
    }


    }else{
    String errorMessage = "HTTP/1.1 200 File Not Found " +
    "Content-Type: text/html;charset=ISO-8859-1 " +
    "Content-Length: 23 " +
    " " +
    "<h1>$)$)404 File not Found</h1>";
    System.out.println(errorMessage);
    output.write(errorMessage.getBytes());
    }
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }finally{
    if(fis != null){
    fis.close();
    }
    }

    }
    }

  • 相关阅读:
    websocket在线测试工具
    短信线上发送错误,线下成功
    nginx添加stream模块1.20
    sort 的使用
    实验、进程的同步与互斥——生产者消费者
    实验、可变分区存储管理系统模拟 —— 最先适应分配算法
    test
    c++的大数阶乘算法
    C#解析JSON字符串总结
    C++ 查看单个类对象模型利用Vs开发者命令提示工具
  • 原文地址:https://www.cnblogs.com/ai03/p/3675577.html
Copyright © 2020-2023  润新知