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 サイトの他の関連記事を参照してください。