Golang中如何实现长连接?代码举例讲解

在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长连接支持,使得实现长连接变得非常简单。