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