You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot向服务器及Java ServerSocket发送GET请求的方法咨询

Spring Boot与Java ServerSocket通信问题解答

1. Spring Boot向ServerSocket发送GET请求的实现方法

由于Java ServerSocket是底层套接字实现,并非现成的HTTP服务器,因此需要手动构造符合HTTP协议规范的GET请求报文,再通过Socket发送。具体实现步骤如下:

  • 用Java原生Socket类建立与ServerSocket的连接
  • 构造标准HTTP GET请求格式(注意必须以\r\n\r\n结尾,标识请求头结束)
  • 通过Socket的OutputStream发送请求报文
  • 用BufferedReader读取ServerSocket返回的响应

示例代码(Spring Boot端)

import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

@Component
public class SocketHttpRequestClient {
    public String sendGet(String host, int port, String requestPath) throws IOException {
        // 资源自动关闭的try-with-resources语法
        try (Socket socket = new Socket(host, port);
             OutputStream outputStream = socket.getOutputStream();
             BufferedReader inputReader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            
            // 构造标准HTTP GET请求
            String getRequest = String.format(
                "GET %s HTTP/1.1\r\nHost: %s:%d\r\n\r\n",
                requestPath, host, port
            );
            // 发送请求
            outputStream.write(getRequest.getBytes());
            outputStream.flush();
            
            // 读取并拼接响应
            StringBuilder responseBuilder = new StringBuilder();
            String line;
            while ((line = inputReader.readLine()) != null) {
                responseBuilder.append(line).append("\n");
            }
            return responseBuilder.toString();
        }
    }
}

在Spring Boot的控制器中调用这个工具类:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;

@RestController
public class TestSocketController {
    private final SocketHttpRequestClient requestClient;

    // 构造注入
    public TestSocketController(SocketHttpRequestClient requestClient) {
        this.requestClient = requestClient;
    }

    @GetMapping("/trigger-get")
    public String sendGetToSocketServer() throws IOException {
        // 替换为你的ServerSocket地址和端口
        return requestClient.sendGet("localhost", 9090, "/test-path");
    }
}

2. 现有ServerSocket实现是否支持处理GET请求

完全支持,只要你的ServerSocket能正确解析HTTP格式的请求报文即可。你当前使用BufferedReader读取输入、OutputStream发送响应的方式,完全适配HTTP报文的处理逻辑:

ServerSocket端处理GET请求的核心逻辑

  1. 调用ServerSocket.accept()获取客户端Socket连接
  2. 用BufferedReader读取第一行请求行(格式为GET /path HTTP/1.1),解析请求方法、路径和协议版本
  3. 继续读取后续请求头,直到读到空行(\r\n\r\n),标志请求头结束
  4. 构造符合HTTP规范的响应报文(包含状态行、响应头、响应体),通过OutputStream发送给客户端

示例代码(ServerSocket端)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleSocketHttpServer {
    public static void main(String[] args) throws IOException {
        // 绑定端口9090
        try (ServerSocket serverSocket = new ServerSocket(9090)) {
            System.out.println("Server running on port 9090");
            while (true) {
                // 阻塞等待客户端连接
                try (Socket clientSocket = serverSocket.accept();
                     BufferedReader inputReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                     OutputStream outputStream = clientSocket.getOutputStream()) {
                    
                    // 读取请求行
                    String requestLine = inputReader.readLine();
                    if (requestLine == null) continue;
                    System.out.println("Received request: " + requestLine);
                    
                    // 跳过所有请求头,直到空行
                    String headerLine;
                    while ((headerLine = inputReader.readLine()) != null && !headerLine.isEmpty()) {
                        System.out.println("Request header: " + headerLine);
                    }
                    
                    // 构造HTTP响应
                    String response = "HTTP/1.1 200 OK\r\n" +
                                      "Content-Type: text/plain; charset=UTF-8\r\n" +
                                      "Content-Length: 22\r\n" +
                                      "\r\n" +
                                      "GET请求已成功处理!";
                    outputStream.write(response.getBytes());
                    outputStream.flush();
                }
            }
        }
    }
}

核心注意点:不管是发送还是接收,都必须严格遵循HTTP协议的报文格式,否则会出现解析失败或响应异常的情况。


内容的提问来源于stack exchange,提问作者user20879521

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:35:35