ホームページ  >  記事  >  バックエンド開発  >  Go で WebSocket 接続を維持するにはどうすればよいですか?

Go で WebSocket 接続を維持するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-03 19:16:29350ブラウズ

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 サーバーに埋め込むことで、クライアントに定期的に ping メッセージを送信し、その返信としてポン応答を受信できます。 。これにより、非アクティブな期間でも接続がアクティブなままになります。

以上がGo で WebSocket 接続を維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。