在Golang中,可以使用net/http包的HTTP长连接功能来实现长连接。
代码示例:
服务端:
go
func main() {
http.HandleFunc("/long_polling", func(w http.ResponseWriter, r *http.Request) {
// 检查客户端连接是否已关闭
// 如果关闭,停止发送数据并退出 handler
if r.Context().Done() == true {
return
}
// 模拟耗时操作,每2秒产生一次数据
time.Sleep(2 * time.Second)
w.Write([]byte("data"))
// 保持连接打开,等待下次发送
w.(http.Flusher).Flush()
http.ServeContent(w, r, "", time.Now(), strings.NewReader(""))
})
http.ListenAndServe(":8000", nil)
}
客户端:
go
func main() {
// 链接服务器
conn, err := net.Dial("tcp", "localhost:8000")
if err != nil {
log.Fatal(err)
}
// 发送HTTP请求
request := "GET /long_polling HTTP/1.1\r\nHost: localhost:8000\r\n\r\n"
conn.Write([]byte(request))
reader := bufio.NewReader(conn)
for {
// 读取服务器数据
data, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
// 处理数据
// ...
// 服务器响应空白行,表示数据发送完毕,等待下次数据
if data == "\r\n" {
continue
}
}
}
服务端会周期性地向客户端发送数据,客户端则会持续监听,一旦接收到数据就立即处理,然后继续监听等待新的数据。这样就实现了长连接并且可以进行服务器推送。
Golang通过net/http包提供的HTTP长连接支持,使得实现长连接变得非常简单。