美文网首页
how tomcat works 1:一个简单web服务器

how tomcat works 1:一个简单web服务器

作者: icecrea | 来源:发表于2017-12-19 16:23 被阅读7次

    实现一个简单的socket通信

    public class TCPServer {  
        public static void main(String[] args) throws Exception {  
            ServerSocket ss = new ServerSocket(6666);      //在本机的TCP6666号端口上监听  
            while(true) {  
                Socket s = ss.accept();                //ServerSocket的accept为阻塞式方法,只有当它监听到一个请求时  
                                                       //它才会执行  
                            System.out.println("a client connect!");  
                DataInputStream dis = new DataInputStream(s.getInputStream());//获得客户端向自己说的"话"  
                                                       //InputStream 从外部指向内存  
                System.out.println(dis.readUTF());     //按照uft-8的格式读取内容  
                dis.close();  
                s.close();  
            }  
              
        }  
    }  
    
    public class TCPClient {  
        public static void main(String[] args) throws Exception {  
            Socket s = new Socket("127.0.0.1", 6666);       //连接127.0.0.1(本机)的tcp端口6666  
            OutputStream os = s.getOutputStream();          //获得一条线路,来给服务器"说话"  
            DataOutputStream dos = new DataOutputStream(os);//对这个线路进行包装  
            Thread.sleep(3000);                             //"暂停"3秒  
            dos.writeUTF("hello server!");                  //对服务器说 hello server!   
            dos.flush();  
            dos.close();  
            s.close();  
        }  
    }  
    
    public class HttpServer {
    
      /** WEB_ROOT is the directory where our HTML and other files reside.
       *  For this package, WEB_ROOT is the "webroot" directory under the working
       *  directory.
       *  The working directory is the location in the file system
       *  from where the java command was invoked.
       */
      public static final String WEB_ROOT =
        System.getProperty("user.dir") + File.separator  + "webroot";
    
      // shutdown command
      private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";
    
      // the shutdown command received
      private boolean shutdown = false;
    
      public static void main(String[] args) {
        HttpServer server = new HttpServer();
        server.await();
      }
    
      public void await() {
        ServerSocket serverSocket = null;
        int port = 8080;
        try {
          serverSocket =  new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
        }
        catch (IOException e) {
          e.printStackTrace();
          System.exit(1);
        }
    
        // Loop waiting for a request
        while (!shutdown) {
          Socket socket = null;
          InputStream input = null;
          OutputStream output = null;
          try {
            socket = serverSocket.accept();
            input = socket.getInputStream();
            output = socket.getOutputStream();
    
            // create Request object and parse
            Request request = new Request(input);
            request.parse();
    
            // create Response object
            Response response = new Response(output);
            response.setRequest(request);
            response.sendStaticResource();
    
            // Close the socket
            socket.close();
    
            //check if the previous URI is a shutdown command
            shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
          }
          catch (Exception e) {
            e.printStackTrace();
            continue;
          }
        }
      }
    }
    
    public class Request {
    
      private InputStream input;
      private String uri;
    
      public Request(InputStream input) {
        this.input = input;
      }
    
      public void parse() {
        // Read a set of characters from the socket
        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((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 uri;
      }
    
    }
    
    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 {
            // file not found
            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) {
          // thrown if cannot instantiate a File object
          System.out.println(e.toString() );
        }
        finally {
          if (fis!=null)
            fis.close();
        }
      }
    }
    

    浏览器中访问http://localhost:8080/index.html即可。在工程的根目录建立webroot文件夹添加index.html。

    相关文章

      网友评论

          本文标题:how tomcat works 1:一个简单web服务器

          本文链接:https://www.haomeiwen.com/subject/zkdlwxtx.html