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

相关阅读 >>

Delphi 中将tmemorystream转换为'string'

Delphi 7中ado控件打开access数据库文件

Delphi stringtowidestring widestringtostring

Delphi字符串内多个空格合为一个空格

Delphi paramcount、paramstr

Delphi 正则表达式在每行开头插入行号

Delphi 使用indy idftp 通过android 上传文件

Delphi xe7使用本身的md5单元进行字符串加密

Delphi unigui程序部署到服务器

Delphi 字符串保存utf-8过程

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



打赏

取消

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

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

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

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

评论

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