Java读取text/event - stream:HttpURLConnection与OkHttp实现及要点解析
在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`类。 - 生产环境建议添加连接超时和重试机制。 - 注意线程阻塞问题,异步处理更高效。 ######[AI写代码神器 | 599点数解答 | 2025-06-30 10:38:40]
- 深度剖析:神秘技能对象代码的属性、逻辑与注意要点(字节豆包 | 211点数解答 | 2025-02-01 13:23:26)306
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)419
- 异步函数代码优化建议与关键逻辑注意点揭秘(字节豆包 | 179点数解答 | 2025-05-17 20:49:48)230
- 代码深度剖析:从语法纠错到优化,这些要点你必须掌握!(字节豆包 | 1422点数解答 | 2025-11-11 22:44:00)56
- JavaScript 代码深度剖析:错误分析、优化方案及注意要点(字节豆包 | 951点数解答 | 2025-11-11 22:46:53)116
- filter:function(event,player){ return player.isMaxHp(); }, function(event,player){ return event.card&&(get.type(event.card)=='trick'||get.type(event.card)=='basic'&&!['shan','tao','jiu','du'].contains(event.card.name))&&game.hasPlayer(function(current){ return current!=player&&get.distance(current,player)<=1; }); },(DeepSeek | 1399点数解答 | 2026-03-22 16:43:17)31
- 无名杀技能改造:去除特殊技能限制,代码修改与注意要点揭秘(DeepSeek | 556点数解答 | 2025-06-29 08:59:58)232
- 卡牌技能揭秘:“渐营”技能逻辑、存储机制与触发限制全解析(讯飞星火 | 713点数解答 | 2025-07-05 23:27:14)190
- 游戏脚本代码深度剖析:功能、问题、优化与注意要点(字节豆包 | 2075点数解答 | 2025-11-16 13:40:21)81
- "Complete and Optimize Your Video Player Class with C++: Audio Callback Included"(阿里通义 | 549点数解答 | 2024-08-08 15:59:25)336
- C++ 文件读取与内存分配:代码错误修正及完善示例(字节豆包 | 413点数解答 | 2024-11-02 18:16:35)321
- jingyu触发规则及过滤条件解析,却遇服务器繁忙! (GPT | 15点数解答 | 2024-06-06 17:40:23)431