Golang 实现主动消息推送:长轮询替代 WebSocket
如果不使用 WebSocket 技术,可以使用长轮询 (long-polling) 技术来实现主动发送消息给前端。长轮询是指客户端向服务器发送一个请求,服务器不立即返回结果,而是等待有数据更新时再返回结果,客户端收到结果后再重新发起请求,以此循环。
下面是一个简单的示例代码:
后端代码:
func longPollingHandler(w http.ResponseWriter, r *http.Request) {
// 设置长连接
w.Header().Set("Connection", "keep-alive")
// 设置返回类型
w.Header().Set("Content-Type", "text/plain")
// 等待消息更新
for {
msg := getMessage()
if msg != "" {
// 发送消息
fmt.Fprintln(w, msg)
return
}
// 等待1秒再次检查
time.Sleep(1 * time.Second)
}
}
func getMessage() string {
// 获取最新消息
// 如果没有更新,返回空字符串
return ""
}
func main() {
http.HandleFunc("/long-polling", longPollingHandler)
http.ListenAndServe(":8080", nil)
}
前端代码:
function longPolling() {
$.get("/long-polling", function(data) {
// 处理消息
console.log(data);
// 再次发起请求
longPolling();
});
}
longPolling();
在这个例子中,后端的 longPollingHandler 函数会设置长连接和返回类型,然后进入一个循环,等待消息更新。如果有新消息,就发送消息给前端。否则,等待1秒再次检查。前端的 longPolling 函数通过调用 $.get 方法来发起请求,如果收到了消息,就处理消息并再次发起请求。这样就可以实现主动发送消息给前端,而不使用 WebSocket 技术。
原文地址: https://www.cveoy.top/t/topic/oUHO 著作权归作者所有。请勿转载和采集!