码迷,mamicode.com
首页 > 编程语言 > 详细

Java纯手打web服务器(一)

时间:2020-09-24 22:16:03      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:web服务器   index   server1   request对象   root   ESS   sub   throw   turn   

在主线程中进行等待客户端请求:

   public static void main(String[] args) {
    HttpServer1 server = new HttpServer1();
    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);
    }
   }

这里主要说下解析流程:

  • 新建serverSocket对象,并等待客户端的访问。
     socket = serverSocket.accept();
     input = socket.getInputStream();
     output = socket.getOutputStream();
  • 客户端访问的时候,根据生成的input参数解析http请求得到访问的uri文件名或者是停 止服务的命令。
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;
  }
  • 将解析出来的uri信息放到request对象中,供response使用。
  response.setRequest(request);
  • response根据访问的文件名读入文件,然后返回给浏览器。
  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();
    }
  }
  • 关闭socket。
socket.close();

Java纯手打web服务器(一)

标签:web服务器   index   server1   request对象   root   ESS   sub   throw   turn   

原文地址:https://www.cnblogs.com/jimoliunian/p/13725595.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!