HTTP长连接技术实现方案

HTTP流式传输实现(通用方案)

Java8+ HttpURLConnection实现示例:

public void streamRequest(String apiUrl, String requestBody) throws IOException {
  URL url = new URL(apiUrl);
  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  conn.setRequestMethod("POST");
  conn.setDoOutput(true);
  conn.setRequestProperty("Content-Type", "application/json");
  conn.setRequestProperty("Accept", "text/event-stream");

  try (OutputStream os = conn.getOutputStream()) {
    os.write(requestBody.getBytes());
    os.flush();
  }

  try (BufferedReader reader = new BufferedReader(
      new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
    String line;
    StringBuilder chunk = new StringBuilder();
    while ((line = reader.readLine()) != null) {
      chunk.append(line);
      if (line.equals("")) {
        processCompleteChunk(chunk.toString());
        chunk.setLength(0);
      }
    }
  }
}

Java11+ HttpClient实现示例:

public void asyncStreamRequest() throws Exception {
  HttpClient client = HttpClient.newHttpClient();
  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://api.ai-model.com/stream"))
      .header("Content-Type", "application/json")
      .POST(HttpRequest.BodyPublishers.ofString("{\"prompt\":\"Hello\"}"))
      .build();

  client.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream())
      .thenAccept(response -> {
        try (InputStream is = response.body();
          BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
          String line;
          while ((line = reader.readLine()) != null) {
            if (!line.startsWith("data: ")) continue;
            String json = line.substring(6).trim();
            if ("[DONE]".equals(json)) break;
            processChunk(json);
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      });
}

SSE客户端实现方案

Maven依赖配置:

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-sse</artifactId>
  <version>3.1.1</version>
</dependency>

SSE客户端实现代码:

public class SseClient {
  public static void main(String[] args) {
    Client client = ClientBuilder.newClient();
    WebTarget target = client.target("http://ai-service/stream");
    SseEventSource eventSource = SseEventSource.target(target).build();

    eventSource.register(event -> {
      if (!event.isEmpty()) {
        String data = event.readData(String.class);
        System.out.println("Received event: " + data);
      }
    }, ex -> {
      System.err.println("Error: " + ex.getMessage());
    });

    eventSource.open();
    try { Thread.sleep(60_000); }
    catch (InterruptedException e) { /* 处理中断 */ }
    eventSource.close();
  }
}

生产环境优化策略

连接池配置示例:

HttpClient client = HttpClient.newBuilder()
    .executor(Executors.newVirtualThreadPerTaskExecutor())
    .connectTimeout(Duration.ofSeconds(30))
    .version(HttpClient.Version.HTTP_2)
    .build();

异常重试策略:

RetryConfig config = RetryConfig.custom()
    .maxAttempts(3)
    .waitDuration(Duration.ofMillis(500))
    .retryOnException(e -> !(e instanceof TimeoutException))
    .build();

结尾

获取到大模型返回的逐条流式数据后,可通过Java+SSE单向把数据返回给前端,可直接将分词结果响应到页面或模型对话框里,详情可以看这篇文章使用Java+SSE实现大模型流式返回前端(完整代码+优化方案)https://blog.csdn.net/weixin_71209411/article/details/148605716?sharetype=blogdetail&sharerId=148605716&sharerefer=PC&sharesource=weixin_71209411&spm=1011.2480.3001.8118

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐