在没有使用 WebSocket 技术的情况下,可以使用长轮询技术来实现主动推送消息给前端。

具体实现过程如下:

  1. 前端通过 Ajax 发送一个长轮询请求给后端,后端接收到请求后不立即返回响应,而是等待有新消息到来时再返回响应。

  2. 后端在接收到长轮询请求后,开启一个新的 goroutine 来等待有新消息到来,如果有新消息到来,则把消息返回给前端,并关闭响应。

  3. 前端在收到响应后,再次发送长轮询请求,重复上述过程。

以下是一个简单的示例代码:

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 秒钟发送一条新消息,以模拟实际场景。

Golang 实现主动推送消息给前端 (无 WebSocket)

原文地址: https://www.cveoy.top/t/topic/oUH1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录