>  기사  >  백엔드 개발  >  Go에서 WebSocket 연결을 유지하는 방법은 무엇입니까?

Go에서 WebSocket 연결을 유지하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-03 19:16:29351검색

How to Keep WebSocket Connections Alive in Go?

Go에서 WebSocket 연결 유지

code.google.com/p/go.net/websocket을 사용하여 구축된 WebSocket 서버에서 클라이언트는 서버로부터 알림을 받을 수 있습니다. . 그러나 장기간의 비활성으로 인해 발생하는 시간 초과 메커니즘으로 인해 클라이언트-서버 연결이 조기에 종료될 수 있습니다.

이 문제를 해결하기 위해 WebSocket 프로토콜에는 "핑퐁" 하트비트 메커니즘이 포함되어 있습니다. 이 메커니즘을 사용하면 클라이언트와 서버가 서로 연결 유지 메시지를 보내 연결이 끊어지는 것을 방지할 수 있습니다.

안타깝게도 code.google.com/p/go.net/websocket 패키지는 그렇지 않습니다. 기본적으로 이 핑퐁 프로토콜을 지원합니다. 해결 방법으로 다음과 같은 사용자 정의 핑퐁 핸들러를 구현할 수 있습니다.

import (
    "time"

    "github.com/gorilla/websocket"
)

func keepAlive(c *websocket.Conn, timeout time.Duration) {
    lastResponse := time.Now()
    c.SetPongHandler(func(msg string) error {
        lastResponse = time.Now()
        return nil
    })

    go func() {
        for {
            err := c.WriteMessage(websocket.PingMessage, []byte("keepalive"))
            if err != nil {
                return
            }

            time.Sleep(timeout / 2)
            if time.Since(lastResponse) > timeout {
                c.Close()
                return
            }
        }
    }()
}

이 핸들러를 WebSocket 서버에 내장하면 주기적인 핑 메시지를 클라이언트에 보내고 그 대가로 퐁 응답을 받을 수 있습니다. . 이렇게 하면 비활성 기간에도 연결이 활성 상태로 유지됩니다.

위 내용은 Go에서 WebSocket 연결을 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.