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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-02 12:01:02690ブラウズ

How to Keep WebSocket Connections Alive with Go.net/websocket?

Code.google.com/p/go.net/websocket を使用して WebSocket 接続を維持する

WebSocket 接続をアクティブに保つには、定期的なデータ交換が必要です。 WebSocket プロトコルの一部として、接続のハートビートを維持するためにピンポン メカニズムが使用されます。これにより、クライアントとサーバーの両方が一貫してデータを送受信できるようになり、接続のタイムアウトが防止されます。

WebSocket 機能のサポート

Code.google.com/p/go.net/ websocket はピンポン プロトコルをネイティブにサポートしていません。したがって、接続を維持するためのカスタム ソリューションを実装する必要があります。

接続をアクティブに維持するためのソリューション

シンプルで効果的なソリューションは、サーバーからクライアントに定期的に ping メッセージを送信することです。 。これらの ping メッセージは、クライアントからの pong 応答をトリガーし、接続が生きていることを示します。指定されたタイムアウト期間内に pong 応答が受信されない場合、サーバーは接続を閉じることができます。

code.google.com/p/go.net/ を使用してこのメ​​カニズムを実装するためのドロップイン ソリューションは次のとおりです。 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.net/websocket で WebSocket 接続を維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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