三叶草 发表于 2021-10-20 18:00:43

Java 实现 web服务器的简单实例

Java 实现 web服务器的简单实例
实例代码:

import java.util.*;

// Chapter 8, Listing 3
public class WebServerDemo {
// Directory of HTML pages and other files
protected String docroot;
// Port number of web server
protected int port;
// Socket for the web server
protected ServerSocket ss;

// Handler for a HTTP request
class Handler extends Thread {
    protected Socket socket;
    protected PrintWriter pw;
    protected BufferedOutputStream bos;
    protected BufferedReader br;
    protected File docroot;

    public Handler(Socket _socket, String _docroot) throws Exception {
      socket = _socket;
      // Get the absolute directory of the filepath
      docroot = new File(_docroot).getCanonicalFile();
    }

    public void run() {
      try {
      // Prepare our readers and writers
      br = new BufferedReader(new InputStreamReader(
            socket.getInputStream()));
      bos = new BufferedOutputStream(socket.getOutputStream());
      pw = new PrintWriter(new OutputStreamWriter(bos));

      // Read HTTP request from user (hopefully GET /file...... )
      String line = br.readLine();

      // Shutdown any further input
      socket.shutdownInput();

      if (line == null) {
          socket.close();
          return;
      }
      if (line.toUpperCase().startsWith("GET")) {
          // Eliminate any trailing ? data, such as for a CGI GET
          // request
          StringTokenizer tokens = new StringTokenizer(line, " ?");
          tokens.nextToken();
          String req = tokens.nextToken();

          // If a path character / or / is not present, add it to the
          // document root
          // and then add the file request, to form a full filename
          String name;
          if (req.startsWith("/") || req.startsWith("//"))
            name = this.docroot + req;
          else
            name = this.docroot + File.separator + req;

          // Get absolute file path
          File file = new File(name).getCanonicalFile();

          // Check to see if request doesn't start with our document
          // root ....
          if (!file.getAbsolutePath().startsWith(
            this.docroot.getAbsolutePath())) {
            pw.println("HTTP/1.0 403 Forbidden");
            pw.println();
          }
          // ... if it's missing .....
          else if (!file.exists()) {
            pw.println("HTTP/1.0 404 File Not Found");
            pw.println();
          }
          // ... if it can't be read for security reasons ....
          else if (!file.canRead()) {
            pw.println("HTTP/1.0 403 Forbidden");
            pw.println();
          }
          // ... if its actually a directory, and not a file ....
          else if (file.isDirectory()) {
            sendDir(bos, pw, file, req);
          }
          // ... or if it's really a file
          else {
            sendFile(bos, pw, file.getAbsolutePath());
          }
      }
      // If not a GET request, the server will not support it
      else {
          pw.println("HTTP/1.0 501 Not Implemented");
          pw.println();
      }

      pw.flush();
      bos.flush();
      } catch (Exception e) {
      e.printStackTrace();
      }
      try {
      socket.close();
      } catch (Exception e) {
      e.printStackTrace();
      }
    }

    protected void sendFile(BufferedOutputStream bos, PrintWriter pw,
      String filename) throws Exception {
      try {
      java.io.BufferedInputStream bis = new java.io.BufferedInputStream(
            new FileInputStream(filename));
      byte[] data = new byte;
      int read = bis.read(data);

      pw.println("HTTP/1.0 200 Okay");
      pw.println();
      pw.flush();
      bos.flush();

      while (read != -1) {
          bos.write(data, 0, read);
          read = bis.read(data);
      }
      bos.flush();
      } catch (Exception e) {
      pw.flush();
      bos.flush();
      }
    }

    protected void sendDir(BufferedOutputStream bos, PrintWriter pw,
      File dir, String req) throws Exception {
      try {
      pw.println("HTTP/1.0 200 Okay");
      pw.println();
      pw.flush();

      pw.print("<html><head><title>Directory of ");
      pw.print(req);
      pw.print("</title></head><body><h1>Directory of ");
      pw.print(req);
      pw.println("</h1><table border=/"0/">");

      File[] contents = dir.listFiles();

      for (int i = 0; i < contents.length; i++) {
          pw.print("<tr>");
          pw.print("<td><a href="/" rel="external nofollow" rel="external nofollow" mce_href="/" rel="external nofollow" rel="external nofollow" "");
          pw.print(req);
          pw.print(contents.getName());
          if (contents.isDirectory())
            pw.print("/");
          pw.print("/">");
          if (contents.isDirectory())
            pw.print("Dir -> ");
          pw.print(contents.getName());
          pw.print("</a></td>");
          pw.println("</tr>");
      }
      pw.println("</table></body></html>");
      pw.flush();
      } catch (Exception e) {
      pw.flush();
      bos.flush();
      }
    }
}

// Check that a filepath has been specified and a port number
protected void parseParams(String[] args) throws Exception {
    switch (args.length) {
    case 1:
    case 0:
      System.err.println("Syntax: <jvm> " + this.getClass().getName()
          + " docroot port");
      System.exit(0);

    default:
      this.docroot = args;
      this.port = Integer.parseInt(args);
      break;
    }
}

public WebServerDemo(String[] args) throws Exception {
    System.out.println("Checking for paramters");

    // Check for command line parameters
    parseParams(args);

    System.out.print("Starting web server...... ");

    // Create a new server socket
    this.ss = new ServerSocket(this.port);

    System.out.println("OK");

    for (;;) {
      // Accept a new socket connection from our server socket
      Socket accept = ss.accept();

      // Start a new handler instance to process the request
      new Handler(accept, docroot).start();
    }
}

// Start an instance of the web server running
public static void main(String[] args) throws Exception {
    WebServerDemo webServerDemo = new WebServerDemo(args);
}
} 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

https://www.uoften.com/program/jsp/20180413/48159.html
页: [1]
查看完整版本: Java 实现 web服务器的简单实例