跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Golang怎么实现SSE推送_Golang如何用HTTP流式响应实现服务端事件推送【教程】

Go原生HTTP服务器支持SSE,需设置Content-Type、Cache-Control、Connection响应头,事件格式为data: xxx\n\n,每次发送后必须调用http.Flusher.Flush(),并监听客户端断连及时退出goroutine。 Go 原生 HTTP 服务器完全支持 SSE(Server-Sent Events),不需要额外框架,关键在于正确设置响应头、保持连接不关闭、按规范输出事件流数据——否则浏览器会直接关闭连接或解析失败。 必须设置的三个响应头 SSE 要求服务端明确声明内容类型和缓存策略,否则 Chrome/Firefox 会拒绝解析为事件流:
Content-Type: text/event-stream
—— 缺少这个,
EventSource
实例状态永远卡在
connecting
Cache-Control: no-cache
—— 浏览器可能缓存初始响应,导致后续事件不触发
message
事件
Connection: keep-alive
—— 显式声明长连接,避免代理(如 Nginx)或负载均衡器中途断连 示例写法:
func 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") // 后续写入事件... }
每次事件必须以 data: 开头并以双换行结尾 SSE 协议对格式极其敏感:每条消息必须以
data:
开头,末尾必须是两个连续的
\n
(即
\n\n
),中间不能有空格或多余字符。漏掉一个换行,整个事件就会被丢弃。 立即学习 “ go语言免费学习笔记(深入) ”; ✅ 正确:
data: hello\n\n
❌ 错误:
data: hello\n
(少一个
\n
) ❌ 错误:
data:hello\n\n
(
:
后缺空格,部分浏览器不认) ❌ 错误:
data: hello\r\n\r\n
(Windows 换行符,应统一用
\n
) 推荐封装成辅助函数避免手误:
func sendEvent(w io.Writer, msg string) { fmt.Fprintf(w, "data: %s\n\n", msg) w.(http.Flusher).Flush() // 强制刷出缓冲 }
必须调用 Flush(),否则事件永远发不出去 Go 的
http.ResponseWriter
默认带缓冲,不主动
Flush()
,数据会一直卡在内存里。SSE 是流式响应,每条事件都得立刻送达客户端。 必须把
w
断言为
http.Flusher
并调用
Flush()
不能只依赖
fmt.Println
或
w.Write
—— 它们不触发刷新 如果用了
bufio.Writer
包裹,要确保它也 flush,但更推荐直接用原生
Flusher
典型错误写法:
// ❌ 不会实时推送 fmt.Fprint(w, "data: ping\n\n")

// ✅ 正确(需先断言) if f, ok := w.(http.Flusher); ok { fmt.Fprint(w, "data: ping\n\n") f.Flush() }

客户端断连后,服务端 goroutine 必须能及时退出 每个 SSE 连接对应一个长生命周期的 goroutine。如果客户端关掉页面或网络中断,而服务端还在往已关闭的连接里写数据,会触发
write: broken pipe
错误,并且 goroutine 泄露。 务必检查
w.Write
或
Flush()
的返回值,遇到
io.ErrClosedPipe
或
net.ErrClosed
就立即 return 不要用
time.Ticker
无条件推送,应在每次写之前判断连接是否还活跃 可配合
r.Context().Done()
监听请求取消(比如客户端关闭连接时 context 会被 cancel) 简单防护示例:
for { select { case <-r.Context().Done(): return // 客户端断开 default: sendEvent(w, "tick") time.Sleep(5 * time.Second) } }
真正难的不是写出第一行
data:
,而是让连接在各种网络抖动、代理转发、浏览器重连机制下稳定维持——header、换行、flush、错误回收,四者缺一不可。

相关文章