Indy TIdTCPClient 在网络掉线时的处理方法

自己做 TCP 的操作,客户端采用 TIdTCPClient 用起来比较简单。经过测试,这个控件也比较稳定。Indy 的控件都是阻塞模式。阻塞模式下,代码比较简单,不容易出现面条代码。

假设 TCP 连接已经建立,正常操作中,网络掉线了,可能过一段时间,网络又恢复了。比如拔掉网线这种情况。

经过测试,发现以下状况。以下描述的情况,在主线程中操作,和在线程中操作,结果一样。


在刚掉线的在几秒之内,发送数据不会出异常。看起来就是发送成功了(实际上肯定没发出去,网络已经掉了)。此时,检查其 Connected 属性,也正常,返回 True。
一段时间后,再次发送数据,会出现异常。此时检查 Connected 属性,也会出现异常。但这种情况下,IdTCPClient 不会自己掉线。此时就算网络恢复正常,它还是一直异常下去。

集中情况:1. 没有建立连接;2. 已经建立连接;3. 已经建立连接但网络掉了,发送数据或读 Connected 属性已经异常了。上述3钟情况下,调用其 Disconnect 方法,都不会异常。

在第三种情况下,要想恢复,调用 Disconnect 方法,这时候检测 Connected 属性,不会异常,会返回 False。如果网络通了,这时候执行 Connect 会成功,连接重新建立。

因此,最简单的做法是用 try...except...end 在 except 中执行 IdTCPClient.Disconnect 方法。

如果程序比较复杂,层次比较深,except 这里最好 raise 再次把异常抛出。这样程序读写数据的地方,无需知道读写是否成功,异常则自然会中断程序的执行。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值