首先建立一个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;(需要科学上网 :)