Ao trabalhar pela primeira vez com o Servidor HTTPAPI, é muito comum observar que o evento OnDisconnect não é disparado imediatamente quando um cliente fecha a conexão. O motivo é que o Servidor HTTPAPI funciona de forma um pouco diferente de outros servidores como o Indy. No servidor Indy existe uma thread para cada conexão e essa thread verifica a cada x milissegundos se a conexão está ativa. O Servidor HTTPAPI utiliza um thread-pool que trata todas as conexões e não verifica para cada conexão se ela está ativa ou não.
Para ser notificado quando o cliente fechar a conexão, faça a seguinte configuração:
1. Se você utiliza um TsgcWebSocketClient, defina Options.CleanDisconnect := True. Isso significa que, antes de a conexão ser fechada, o cliente tentará enviar uma notificação ao servidor de que a conexão será fechada. Se o servidor receber esta mensagem, o evento OnDisconnect será chamado.
2. Para outras desconexões, a única solução é gravar algo no socket; se falhar, a conexão está desconectada. Habilite o HeartBeat no servidor HTTPAPI, e defina um intervalo de 60 segundos, por exemplo, e um timeout de 0. Esta configuração significa que a cada 60 segundos todas as conexões receberão ping, e se alguma estiver desconectada, o evento OnDisconnect será disparado. Você pode definir um valor menor de HeartBeat.Interval, mas não o defina muito baixo (1 segundo, por exemplo, é muito baixo) porque o desempenho do servidor será afetado.