初次使用 HTTPAPI 服务器时,很常见的情况是:OnDisconnect 事件并不会在客户端关闭连接时立即触发。原因在于 HTTPAPI 服务器的工作方式与 Indy 等其他服务器略有不同。在 Indy 服务器中,每个连接都有一个专属线程,该线程每隔 x 毫秒检查一次连接是否活跃。而 HTTPAPI 服务器使用线程池处理所有连接,不会对每个连接逐一检查是否活跃。
为了在客户端关闭连接时收到通知,请进行以下配置:
1. 如果您使用 TsgcWebSocketClient, 请设置 Options.CleanDisconnect := True。 这意味着在关闭连接之前,客户端将尝试向服务器发送连接即将关闭的通知。如果服务器收到此消息,将调用 OnDisconnect 事件。
2. 对于其他断开连接的情况,唯一的解决方案是向套接字写入数据;如果失败,则连接断开。在 HTTPAPI 服务器上启用 HeartBeat,例如将间隔设置为 60 秒,超时设置为 0。这种配置意味着每 60 秒对所有连接发送一次 ping,如果有连接已断开,将触发 OnDisconnect 事件。您可以设置较低的 HeartBeat.Interval 值,但不要设置得太低(例如 1 秒太低),因为这会影响服务器性能。