【问题标题】:OnDisconnect event on idHttpServeridHttpServer 上的 OnDisconnect 事件
【发布时间】:2012-06-21 18:07:50
【问题描述】:

idHttpServer 断开连接时是否会触发任何事件?

断开连接并不是指客户端断开连接,而是idHTTPServer 出于某种原因断开连接。

我可以更好地解释它:当idHTTPServer 正在侦听套接字端口并且由于某种未知原因,计算机与网络断开连接(例如,网络变得不可用)时,组件不会不再工作(它停止监听端口),在这种情况下,我需要重新连接(重新打开端口)。根据帮助,idHttpServer.OnDisconnect 仅在客户端与服务器断开连接时才会触发。

【问题讨论】:

  • 我会说OnListenException 是您所需要的,但这只是一个猜测。
  • @TLama:我不这么认为。根据帮助:当在特定侦听器线程执行期间发生EAbort以外的异常时,在侦听器线程中使用服务器上下文发出OnListenException信号。
  • EAbort 在内部使用如果在等待新的客户端连接时关闭侦听套接字,或者如果超出服务器的MaxConnections。侦听线程上的任何其他错误都将触发OnListenException 事件。但是,网络连接丢失并不能保证侦听套接字上的错误,因为侦听是本地计算机上的操作,而不是网络上的操作。如果网络适配器在被禁用时被监听,那么被监听套接字报告的可能性很小。
  • 客户端连接到服务器,另一方面,如果网络连接丢失,将出错并触发OnDisconnect事件。
  • 要按照您的要求进行操作,您可能必须监视网络适配器本身以查找有关其连接状态的通知。 TIdHTTPServer 不会给你这些信息。

标签: delphi delphi-2010 indy indy10


【解决方案1】:

您可以考虑在一段时间内从服务器的自我连接中创建一个到您的服务器的看门狗连接,当您无法连接时,您将重新启动服务器或您需要做的任何事情来纠正问题。

这确实有额外的好处,您实际上是在测试与服务器的连接,因此如果发生任何其他可能导致客户端问题连接的问题,这些问题将被处理。

这也可以是一个单独的应用程序,它能够关闭、杀死和重新启动您的服务器

【讨论】:

  • 不敢相信我没有想到这一点,很容易:D
【解决方案2】:

我有两个建议可以帮助您解决问题。

首先,添加一个计时器,每分钟(或您选择的时间间隔)一次,“询问”窗口您的端口是否仍在侦听。这必须在 Indy 之外完成,因为 Indy 没有这样做的机制。如果 Windows 告诉您此端口未在侦听,则将其记录到日志中并重新启动服务器。定期检查此日志以查看您的应用是否曾报告您的端口停止侦听。这将告诉您它是否真的断开连接。

其次,您可能需要考虑每晚重新启动服务器套接字。例如,每晚午夜,停止并启动服务器套接字以确保新连接。可能存在一些变量溢出,例如,如果您不断增加一个数字并且它越来越大,那么随着时间的推移,该数字将变得太大而您的应用程序无法容纳它。这可能发生在 5 秒或 5 个月的运行时间之间,具体取决于您增加它的速度。

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 2021-01-21
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多