如果不使用 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 技术。

Golang 实现主动消息推送:长轮询替代 WebSocket

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

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