酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

java 如何读取text/event-stream

在Java中读取`text/event-stream`(Server-Sent Events, SSE)可以使用`HttpURLConnection`或第三方库如`OkHttp`。以下是两种实现方式: 1. 使用原生HttpURLConnection ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class SSEClient { public static void main(String[] args) throws Exception { URL url = new URL("http://example.com/sse-endpoint"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "text/event-stream"); try (BufferedReader reader = new BufferedReader( new InputStreamReader(connection.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { // 处理SSE事件(格式为 "data: {json}" 或 "event: xxx") if (line.startsWith("data:")) { System.out.println("Received: " + line.substring(5).trim()); } } } } } ``` 2. 使用OkHttp(推荐) ```java import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.sse.EventSource; import okhttp3.sse.EventSourceListener; import okhttp3.sse.EventSources; public class OkHttpSSE { public static void main(String[] args) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://example.com/sse-endpoint") .header("Accept", "text/event-stream") .build(); EventSourceListener listener = new EventSourceListener() { @Override public void onEvent(EventSource eventSource, String id, String type, String data) { System.out.println("SSE Event: " + data); } }; EventSources.createFactory(client).newEventSource(request, listener); } } ``` 关键点说明: 1. 连接保持:SSE是长连接,服务器会持续推送数据,需确保连接不会超时或被关闭。 2. 事件格式:SSE数据以`data:`开头,可能包含`event:`(事件类型)、`id:`(事件ID)等字段。 3. 错误处理:需监听连接中断或错误事件(如`onFailure`方法中实现重连逻辑)。 --- 额外注意事项: - 如果使用Spring框架,可考虑`SseEmitter`或WebFlux的`ServerSentEvent`类。 - 生产环境建议添加连接超时和重试机制。 - 注意线程阻塞问题,异步处理更高效。 [2025-06-30 10:38:40 | AI写代码神器 | 599点数解答]

相关提问