Lorsque vous travaillez pour la première fois avec le serveur HTTPAPI, il est très courant de constater que l'événement OnDisconnect ne se déclenche pas immédiatement lorsqu'un client ferme la connexion. La raison est que le serveur HTTPAPI fonctionne un peu différemment des autres serveurs comme Indy. Dans le serveur Indy, il y a un thread par connexion et ce thread vérifie toutes les x millisecondes si la connexion est active. Le serveur HTTPAPI utilise un pool de threads qui gère toutes les connexions et ne vérifie pas pour chaque connexion si elle est active ou non.
Pour être notifié lorsqu'un client ferme la connexion, effectuez la configuration suivante :
1. Si vous utilisez un TsgcWebSocketClient, définissez Options.CleanDisconnect := True. Cela signifie qu'avant la fermeture de la connexion, le client essaiera d'envoyer une notification au serveur indiquant que la connexion va être fermée. Si le serveur reçoit ce message, l'événement OnDisconnect sera appelé.
2. Pour les autres déconnexions, la seule solution est d'écrire quelque chose dans le socket ; si cela échoue, la connexion est déconnectée. Activez HeartBeat sur le serveur HTTPAPI, et définissez un intervalle de 60 secondes par exemple et un timeout de 0. Cette configuration signifie que toutes les 60 secondes toutes les connexions seront pingées, et si l'une d'elles est déconnectée, l'événement OnDisconnect sera déclenché. Vous pouvez définir une valeur plus faible pour HeartBeat.Interval, mais ne le définissez pas trop bas (1 seconde par exemple est trop faible) car les performances du serveur en seront affectées.