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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 13:26:02237ブラウズ

How can I keep WebSocket connections alive in Go?

Go で WebSocket 接続を維持する

リアルタイム通信が不可欠な Web アプリケーションでは、クライアントとサーバーは、非アクティブな期間であってもアクティブなままです。 Go の websocket パッケージ (code.google.com/p/go.net/websocket) のコンテキストでは、このアクティビティの欠如により、サーバーが EOF エラーを返し、接続が中断される可能性があります。

WebSocket ハートビート (ピンポン)

WebSocket プロトコルには、ピンポンとして知られるハートビート メカニズムが含まれています。これには、クライアントからサーバーに ping メッセージを送信し、サーバーから返される pong 応答を受信することが含まれます。これらのメッセージを定期的に交換すると、他のデータが転送されていない場合でも接続を維持できます。

Go の Websocket パッケージでのサポート

残念ながら、code.google.com /p/go.net/websocket パッケージは、ピンポン ハートビート メカニズムをネイティブにサポートしていません。したがって、接続を維持するには代替ソリューションが必要です。

カスタム実装

1 つのアプローチは、Go のチャネルとタイマーを使用してカスタム ハートビートを実装することです。このソリューションでは、クライアントは定期的な間隔 (たとえば、5 秒ごと) でサーバーにハートビート メッセージを送信します。サーバーはこれらのハートビート メッセージをリッスンし、確認応答で応答します。指定されたタイムアウト期間 (10 秒など) 内にサーバーがハートビートを受信しない場合、サーバーは接続を閉じます。

ゴルーチンを使用してこのようなカスタム ハートビート実装を実現する方法の例を次に示します。

<code class="go">func startHeartbeat(ws *websocket.Conn, timeout time.Duration) {
    heartbeatTicker := time.NewTicker(timeout)
    defer heartbeatTicker.Stop()

    go func() {
        for {
            select {
            case <-heartbeatTicker.C:
                ws.WriteMessage(websocket.PingMessage, []byte("heartbeat"))
            }
        }
    }()
}

// Server-side:
func handleConnection(ws *websocket.Conn) {
    startHeartbeat(ws, time.Second*10)
    for {
        _, _, err := ws.ReadMessage()
        if err != nil {
            ws.Close()
            break
        }
        // Handle incoming data ...
    }
}</code>

このカスタム実装により、クライアントとサーバー間で定期的なハートビートが維持され、接続のタイムアウトが防止されます。あるいは、自動再接続や正常なシャットダウンを処理する機能など、WebSocket ハートビートのより高度なサポートを提供する Go 用のサードパーティ ライブラリも利用できます。

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

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