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