Golang 实现主动推送消息给前端 (无 WebSocket)
在没有使用 WebSocket 技术的情况下,可以使用长轮询技术来实现主动推送消息给前端。
具体实现过程如下:
-
前端通过 Ajax 发送一个长轮询请求给后端,后端接收到请求后不立即返回响应,而是等待有新消息到来时再返回响应。
-
后端在接收到长轮询请求后,开启一个新的 goroutine 来等待有新消息到来,如果有新消息到来,则把消息返回给前端,并关闭响应。
-
前端在收到响应后,再次发送长轮询请求,重复上述过程。
以下是一个简单的示例代码:
package main
import (
"fmt"
"net/http"
"sync"
"time"
)
var (
mu sync.Mutex
cond = sync.NewCond(&mu)
hasNewMsg = false
msg = ""
)
func main() {
http.HandleFunc("/longpolling", func(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
if !hasNewMsg {
cond.Wait()
}
fmt.Fprintf(w, msg)
hasNewMsg = false
msg = ""
})
go func() {
for {
time.Sleep(5 * time.Second)
mu.Lock()
hasNewMsg = true
msg = "New Message"
cond.Signal()
mu.Unlock()
}
}()
http.ListenAndServe(":8080", nil)
}
在上述代码中,我们创建了一个 HTTP 服务器,当客户端发送请求到 /longpolling 时,服务器会检查是否有新消息,如果没有,则等待新消息到来。当有新消息到来时,服务器会返回该消息给客户端。同时,我们在另一个 goroutine 中每隔 5 秒钟发送一条新消息,以模拟实际场景。
原文地址: https://www.cveoy.top/t/topic/oUH1 著作权归作者所有。请勿转载和采集!