TsgcWebSocketServer_HTTPAPI | OnDisconnect no se dispara

Cuando se trabaja por primera vez con el servidor HTTPAPI, es muy común observar que el evento OnDisconnect no se activa de inmediato cuando un cliente cierra la conexión. El motivo es que el servidor HTTPAPI funciona de forma algo diferente a otros servidores como Indy. En el servidor Indy existe un hilo por cada conexión y dicho hilo comprueba cada x milisegundos si la conexión está activa. El servidor HTTPAPI usa un pool de hilos que gestiona todas las conexiones y no comprueba para cada conexión si está activa o no.

 

Para recibir notificaciones cuando el cliente cierra la conexión, realice la siguiente configuración:

 

1. Si utiliza un TsgcWebSocketClient, establezca Options.CleanDisconnect := True. Esto significa que antes de cerrar la conexión, el cliente intentará enviar una notificación al servidor indicando que la conexión se cerrará. Si el servidor recibe este mensaje, se llamará al evento OnDisconnect.

 

2. Para otras desconexiones, la única solución es escribir algo en el socket; si falla, la conexión se desconecta. Habilite HeartBeat en el servidor HTTPAPI, y establezca un intervalo de 60 segundos, por ejemplo, y un tiempo de espera de 0. Esta configuración significa que cada 60 segundos se hará ping a todas las conexiones, y si alguna está desconectada, se disparará el evento OnDisconnect. Puede establecer un valor menor en HeartBeat.Interval, pero no lo establezca demasiado bajo (1 segundo, por ejemplo, es demasiado bajo) porque el rendimiento del servidor se verá afectado.