如何使用Socket实现HTTP协议?代码举例讲解

实现HTTP协议主要涉及:

  1. 解析HTTP请求:获取请求方法、URI、协议版本、请求头和请求体等信息。
  2. 构建HTTP响应:包含协议版本、状态码、响应头和响应体等信息。
  3. 连接管理: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服务器。