Java纯手打web服务器(一)

2021-03-26 03:27

阅读:384

标签: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 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" +
          "

File Not Found

"; 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


评论


亲,登录后才可以留言!