java建立一个超级简单的HTTP Server

146 阅读3分钟

首先建立一个socket

 import java.net.ServerSocket;
 ​
 public class SimpleHTTPServer {
     public static void main(String[] args) throws Exception{
         final ServerSocket server = new ServerSocket(8181);
         System.out.println("Listening for connection on port 8181");
         while(true){
             //让浏览器一直加载;
         }
     }
 }

浏览器进入 http://localhost:8181 后,会发现一直在加载,等待,即我们的 server 已经准备好了,正在监听8181端口的连接(connection)。(只是对于连接我们没有做任何事情,也没有拒绝连接)

为了让端口接收连接,在 Java 中可以使用 accept() 方法来接受即将到来的连接:

 final Socket client = server.accept();

Socket 对象能够被用来读 client 的请求(request)并给与答复(response),一旦你完成一次整个过程,你应该关闭这个 Socket ,准备去接受下一个 connection (使用 accpet() )。所以,整个 HTTPServer 的流程应该是:

 import java.net.ServerSocket;
 import java.net.Socket;
 public class SimpleHTTPServer {
 ​
   public static void main(String args[] ) throws Exception {
     final ServerSocket server = new ServerSocket(8080);
     System.out.println("Listening for connection on port 8080 ....");
     while (true) {
       final Socket client = server.accept();
       // 1. Read HTTP request from the client socket
       // 2. Prepare an HTTP response
       // 3. Send HTTP response to the client
       // 4. Close the socket
     }
   }
 }

这就是标准的 HTTP Server,它不用在意之前的连接,只关心即将到来的连接。除非 server 被关闭,否则会一直执行下去。

当连接到 http://localhost:8181 时,浏览器会发送一个 request 给 server,我们可以用 InputStream 来读出 request 的内容,另外最好使用 BuffeeredReader ,因为浏览器会发送多行的数据。下面是在你的HTTP Server 中读出 request 的代码。

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.ServerSocket;
 import java.net.Socket;
 ​
 public class SimpleHTTPServer{
     public static void main(String[] args) throws IOException{
         ServerSocket server = new ServerSocket(8181);
         System.out.println("Listening for connection on port 8181 ...");
         while(true){
             Socket clientSocket = server.accept();
             InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
             BufferedReader reader = new BufferedReader(isr);
             String line = reader.readLine();
             while(!line.isEmpty()){
                 System.out.println(line);
                 line = reader.readLine();
             }
         }
     }
 }

运行程序,进入 http://localhost:8181 后,程序执行结果如下:

 Listening for connection on port 8181 ...
 GET / HTTP/1.1
 Host: localhost:8181
 Connection: keep-alive
 Cache-Control: max-age=0
 sec-ch-ua: "Microsoft Edge";v="107", "Chromium";v="107", "Not=A?Brand";v="24"
 sec-ch-ua-mobile: ?0
 sec-ch-ua-platform: "Windows"
 Upgrade-Insecure-Requests: 1
 DNT: 1
 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.26
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
 Sec-Fetch-Site: cross-site
 Sec-Fetch-Mode: navigate
 Sec-Fetch-User: ?1
 Sec-Fetch-Dest: document
 Accept-Encoding: gzip, deflate, br
 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6

即我们的 HTTP client(浏览器)传递这个信息给我们的 HTTP server (这个Java程序)。现在我们的 server 不仅可以监听连接,还可以接受并且读出 HTTP 的 request, 现在我们还需要给 HTTP 的 request 发送回应(response):

最终代码:

 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.Date;
 ​
 public class SimpleHTTPServer {
     public static void main(String[] args) throws Exception {
         final ServerSocket server = new ServerSocket(8181);
         System.out.println("Listening for connection on port 8181");
         while(true) {
             try (Socket socket = server.accept()) {
                 Date today = new Date();
                 String httpResponse = "HTTP/1.1 200 OK\r\n\r\n" + today;
                 socket.getOutputStream().write(httpResponse.getBytes("UTF-8"));
             }
         }
     }
 }

进入 http://localhost:8181 , 显示信息: Fri Nov 04 20:32:21 CST 2022

ServerSocket is used to receive connections in the Server application ;

Socket is used to send and receive data from the individual clients .

reference:

How to create HTTP Server in Java - ServerSocket Example;(需要科学上网 :)