Java Socket实现HTTP客户端及服务端

HTTP(Hypertext Transfer Protocol)是一种用于在Web上传输数据的协议。它是一种无状态的、应用层的协议,用于客户端和服务器之间的通信。HTTP协议基于请求-响应模型,客户端发送请求给服务器,服务器返回响应。本文主要介绍通过Java中的socket实现HTTP协议通信的客户端和服务端,以及相关的示例代码。

1、HTTP协议详解

参考文档HTTP协议详解及使用

2、Java实现HTTP协议客户端

客户端(例如Web浏览器)向服务器发送HTTP请求。请求由请求行、请求头部和请求体组成。请求行包含请求方法(GET、POST等)、请求的URL和HTTP协议版本。

import java.io.*;
import java.net.Socket;
// HTTP 客户端
public class HTTPClient {
    public static void main(String[] args) throws IOException {
        // 1. HTTP 客户端,要发送 HTTP 请求,先建立 TCP 连接
        // 我们当前进程和www.baidu.com主机上绑定 8080 端口的进程使用 TCP 通信(要求 建立 TCP 连接)
        Socket socket = new Socket("localhost", 80);

        OutputStream os = socket.getOutputStream();
        PrintWriter writer = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));

        // 只有请求行,请求头为空,没有请求体
        String request = "GET / HTTP/1.0\r\n\r\n";
        writer.print(request);
        // 冲刷缓冲区
        writer.flush();

        // 读取百度返回的 HTTP 响应
        InputStream is = socket.getInputStream();
        byte[] buf = new byte[10240];    // 不超过 1024 字节的数据
        int n = is.read(buf);
        String response = new String(buf, 0, n, "UTF-8");
        System.out.println(response);
    }
}

3、Java实现HTTP协议服务端

服务器接收处理请求,并将请求处理结果返回客户端。

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
// HTTP 服务端
public class HTTPServer {
    public static void main(String[] args) throws IOException {
        // 我们使用短连接
        ServerSocket serverSocket = new ServerSocket(80);
        while (true) {
            try {
                Socket socket = serverSocket.accept();
                // 统一的响应回复对方
                OutputStream os = socket.getOutputStream();
                PrintWriter writer = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
                String html = "百度一">https://www.baidu.com/'>百度一下";   // 响应体的内容
                byte[] bytes = html.getBytes("UTF-8");
                int contentLength = bytes.length;
                String response = "HTTP/1.0 200 OK\r\n" +
                        "Content-Type: application/octet-stream; charset=utf-8\r\n" +
                        "Content-Length: 49\r\n" +
                        "\r\n" +
                        html;

                writer.print(response);
                writer.flush();

                socket.close();
            } catch (IOException exc) {
                exc.printStackTrace();
            }
        }
    }
}

推荐阅读
cjavapy编程之路首页