外观
HTTP怎么解析的
约 255 字小于 1 分钟
2025-01-07
以下是一个简单的Java示例,展示如何解析HTTP请求:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class SimpleHTTPParser {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("服务器已启动,监听端口 8080");
while (true) {
Socket clientSocket = serverSocket.accept();
handleClient(clientSocket);
}
}
private static void handleClient(Socket socket) throws IOException {
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
// 解析请求行
String requestLine = reader.readLine();
if (requestLine == null || requestLine.isEmpty()) {
socket.close();
return;
}
String[] requestParts = requestLine.split(" ");
String method = requestParts[0];
String uri = requestParts[1];
String httpVersion = requestParts[2];
System.out.println("请求方法: " + method);
System.out.println("请求URI: " + uri);
System.out.println("HTTP版本: " + httpVersion);
// 解析头部字段
Map<String, String> headers = new HashMap<>();
String headerLine;
while (!(headerLine = reader.readLine()).isEmpty()) {
String[] headerParts = headerLine.split(": ", 2);
headers.put(headerParts[0], headerParts[1]);
}
System.out.println("请求头: " + headers);
// 解析消息体(如果存在)
if (headers.containsKey("Content-Length")) {
int contentLength = Integer.parseInt(headers.get("Content-Length"));
char[] body = new char[contentLength];
reader.read(body, 0, contentLength);
System.out.println("消息体: " + new String(body));
}
// 发送简单响应
String response = "HTTP/1.1 200 OK\r\n" +
"Content-Type: text/plain\r\n" +
"Content-Length: 12\r\n" +
"\r\n" +
"Hello World!";
socket.getOutputStream().write(response.getBytes());
socket.close();
}
}