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 再次把异常抛出。这样程序读写数据的地方,无需知道读写是否成功,异常则自然会中断程序的执行。
――――――――――――――――

原文链接:https://blog.csdn.net/pcplayer/article/details/82831906

相关阅读 >>

检测系统信息的单元 computerinfo.pas

Delphi fmx输出彩色文本

Delphi 清除字符串两边空格或指定字符

Delphi汉字与多字节编码的转换

Delphi中如何判断mediaplayer控件所播放的文件是否播放完毕?

Delphi 用iisreset命令重启iis

Delphi 防止程序重复执行(多种方法)

Delphi 回车符 换行符

Delphi xe6 利用fastmm4检测内存泄漏

Delphi access技巧集

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...