前言
随着AI Agent的兴起,人机交互方式正在由表单转向自然语言对话。
传统HTTP短连接无法满足实时流式响应,HTTP长连接成为AI交互的核心支撑。
SSE和HTTP Stream作为HTTP长连接最主流的两种实现,支撑了ChatGPT、豆包、DeepSeek等大模型对话。
SSE (Server Send Events)
前端发1次HTTP请求,都需要创建1个新HTTP连接。
后端可以基于1次HTTP请求一直不停向前端推送信息,后端决定什么时候推送完毕信息,什么时候结束HTTP本次请求。
HTTP 流(SSE/Stream)是单向的,只能服务端推,不能双向实时协商。
package main import ( "fmt" "log" "net/http" "time" ) func main() { http.HandleFunc("/chart", sseHandler) log.Println("SSE server running on :8001") log.Println("访问: http://127.0.0.1:8001/chart") _ = http.ListenAndServe(":8001", nil) } // 视图函数 func sseHandler(w http.ResponseWriter, r *http.Request) { // SSE 必须的响应头 w.Header().Set("Content-Type", "text/event-stream; charset=utf-8") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") // 允许跨域(前端调试用) w.Header().Set("Access-Control-Allow-Origin", "*") // 刷新器,确保实时推送 flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "SSE not supported", http.StatusInternalServerError) return } // 持续推送消息 for i := 1; ; i++ { // SSE 消息格式:data: xxx\n\n msg := fmt.Sprintf("data: 第 %d 条消息 | 时间: %s\n\n", i, time.Now().Format("15:04:05")) _, _ = fmt.Fprint(w, msg) flusher.Flush() // 立即发送 // 每秒推一条 time.Sleep(1 * time.Second) // 客户端断开时退出 select { case <-r.Context().Done(): log.Println("客户端断开连接") return default: } } }
参考
浙公网安备 33010602011771号