Go 的 http.ResponseWriter 实现 SSE 时需保持连接不关闭:设置正确响应头、使用 http.Flusher 显式刷新、监听上下文取消信号防 goroutine 泄漏,并严格遵循 SSE 协议格式发送消息。Go 的 http.ResponseWriter 怎么避免提前关闭连接Server-Sent Events 依赖长连接不中断,而 Go 默认的 HTTP handler 在函数返回时会隐式关闭响应体。一旦你写完数据就 return,连接立刻断开,客户端收不到后续事件。关键不是"怎么发",而是"怎么不让连接关":必须在 handler 函数内持续持有 http.ResponseWriter,不能让它被 GC 或作用域释放务必设置 Content-Type: text/event-stream 和 Cache-Control: no-cache,否则浏览器可能缓存或拒绝解析每次写入后调用 flusher.Flush() ------ 不是 w.Write() 就完事了;没 flush,数据卡在缓冲区,客户端永远等不到别用 log.Fatal 或 panic 中断 handler,会导致连接异常终止;用 return 前先 close channel、清理 goroutinefunc sseHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "streaming unsupported", http.StatusInternalServerError) return } // 后续写入 + flush...}用 net/http 实现 SSE 时如何安全推送消息直接往 ResponseWriter 写字符串容易出错:漏换行、格式错位、编码不一致,导致浏览器解析失败,表现为静默无事件或反复重连。SSE 协议对字段名和换行极其敏感,必须严格遵循 data: ... 或 event: xxx data: ... 格式:立即学习"go语言免费学习笔记(深入)";data: 行必须以 结尾,整个消息块以 结束(两个换行)如果 data 值含换行,需拆成多行 data:,每行一个;不能直接嵌 中文或 emoji 要确保响应头声明 charset=utf-8,否则可能乱码避免用 fmt.Fprintf 拼接,改用 io.WriteString + 显式 ,减少格式失控风险// 正确示例(发送 JSON 数据)msg := map[string]interface{}{"id": 123, "msg": "hello"}b, _ := json.Marshal(msg)io.WriteString(w, "data: ")w.Write(b)io.WriteString(w, " ")flusher.Flush()goroutine 泄漏:为什么你的 SSE 服务跑几天就 OOM每个 SSE 连接对应一个长期运行的 goroutine,如果客户端断开但服务端没感知,goroutine 就卡在 write 或 time.Sleep 上,永不退出。 Mokker AI AI产品图添加背景
相关推荐
weelinking4 小时前
【2026】08_Claude与版本控制:Git协作技巧黄焖鸡能干四碗8 小时前
固定资产管理系统建设方案和源码(Java源码)JoneBB9 小时前
ABAP Webservice连接解决问题no解决代码问题9 小时前
从乱码到脱敏导出:TiDB CSV 导出实战全指南scan7249 小时前
智能体多个工具调用未若君雅裁9 小时前
MySQL高可用与扩展-主从复制读写分离分库分表2401_867623989 小时前
CSS Flex布局中如何设置子元素间距_掌握gap属性的现代用法月落归舟10 小时前
一篇文章了解Redis内存淘汰机制与过期Key清理即使再小的船也能远航10 小时前
【Python】安装weixin_4217252610 小时前
Linux 编程语言全解析:C、C++、Python、Go、Rust 谁更强?