实现HTTP协议主要涉及:
- 解析HTTP请求:获取请求方法、URI、协议版本、请求头和请求体等信息。
- 构建HTTP响应:包含协议版本、状态码、响应头和响应体等信息。
- 连接管理:HTTP协议是无状态的,需要在服务端维护客户端连接。
实现一个简单的HTTP服务器可以这样做:
public class HTTPServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8000);
while (true) {
Socket socket = server.accept();
new Thread(new RequestHandler(socket)).start();
}
}
}
class RequestHandler implements Runnable {
private Socket socket;
public RequestHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
// 1. 获取输入输出流
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
// 2. 读取请求数据
byte[] buffer = new byte[1024];
int length = in.read(buffer);
String request = new String(buffer, 0, length);
// 3. 解析请求
String[] lines = request.split("\r\n");
String firstLine = lines[0];
String[] tokens = firstLine.split(" ");
String method = tokens[0]; // GET
String uri = tokens[1]; // /hello
String version = tokens[2]; // HTTP/1.1
// 4. 构建响应
String statusLine = version + " 200 OK";
String contentLengthLine = "Content-Length: 11";
String contentTypeLine = "Content-Type: text/plain";
String response = statusLine + "\r\n" + contentLengthLine + "\r\n"
+ contentTypeLine + "\r\n\r\n" + "Hello World";
// 5. 发送响应
out.write(response.getBytes());
// 6. 连接关闭
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述代码实现了一个简单的HTTP服务器,可以解析GET请求和返回Hello World响应。我们继续完善代码,添加其他请求方法、URI路由、完善响应体等,就可以实现一个功能较完备的HTTP服务器。