HTTPAPI サーバーを初めて使用する場合、クライアントが接続を閉じたときに OnDisconnect イベントがすぐに発火しないのは非常によくあることです。その理由は、HTTPAPI サーバーが Indy などの他のサーバーとは少し異なる動作をするためです。Indy サーバーでは、すべての接続に対してスレッドが 1 つあり、このスレッドは 接続がアクティブかどうかを x ミリ秒ごとにチェックします。HTTPAPI サーバーはすべての接続を処理するスレッドプールを使用しており、各接続がアクティブかどうかをチェックしません。
クライアントが接続を閉じたときに通知を受け取るには、次の設定を行います:
1. TsgcWebSocketClient を使用する場合は、Options.CleanDisconnect := True を設定してください。これにより、接続が閉じられる前に、クライアントが接続を閉じる旨のサーバーへの通知を送信しようとします。サーバーがこのメッセージを受信すると、OnDisconnect イベントが呼び出されます。
2. その他の切断については、ソケットに何かを書き込む方法しかありません。失敗した場合、接続は切断されます。HTTPAPI サーバーで HeartBeat を有効にし、 例えば 60 秒のインターバルとタイムアウト 0 を設定します。この設定では、60 秒ごとにすべての接続に ping が送信され、 切断している接続があれば OnDisconnect イベントが発生します。HeartBeat.Interval を低い値に設定することもできますが、 あまり低くしないでください (例えば 1 秒は低すぎます)。 サーバーのパフォーマンスに影響します。