indy TIdTCPClient如何知道自己已经被服务端Disconnect?(50分)

  • 主题发起人 主题发起人 masm
  • 开始时间 开始时间
M

masm

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端:
...try
IdTCPClient1.Connect(1000);
except
Application.MessageBox('连接错误','错误',MB_IconError);
...
已经正确连接上
现在服务端:
AThread.Connection.Disconnect;
那么客户端如何立刻知道自己被踢出来了?有什么时间响应这个操作么??
别跟我说客户端IdTCPClient1Disconnected事件,那个只相应客户端本身的Disconnect命令!
 
IdTCPClient1Disconnected事件
 
呵呵,masm老大这么厉害,自己用汇编写一个程序啊,用什么INDY了?
其实你可以用try except来做这个
 
张大侠什么时候练起嘴皮子功夫了?
try
IdTCPClient1.Read...什么随便你
except
你被踢出去了!
end;
 
乡村月光的代码就是我的意思,INDY用异常来处理这个问题,和JAVA差不多的,
完全的本本主义,[:D]
 
这么说,如果客户端不去尝试一下,是不知道自己已经被服务端踢出去了?连个通知也没有啊!可怜的客户端还以为连着呢,退出的时候还煞有介事地Disconnect一下,其实服务端早就把你抛弃了...
 
try
IdTCPClient1.Read...什么随便你
except
你被踢出去了!
=====================================
那万一是超时错误呢?怎么区分?!
 
超时和被对方断开处理基本上是相同的,
对方断开和你的连接,当然你也要关闭自己的
SOCKET来释放资源。
 
知道了!保险的做法:
1、服务端向客户端发送“你给我关闭”的自定义指令;然后等待客户端回答。
2、如果客户端乖乖地回答了(客户端可以显示一些羞辱性的语句),服务端就关闭;
3、如果客户端在规定时间内没回答(没法显示羞辱性语句了,给点面子),就骂一句“脑子进水了”,然后也关闭。
 
如果是超时,抛出的异常是EIdReadTimeOut。
在blocking模式下工作只有自己去read了才知道结果,你想让系统通知你被踢,就用nonblocking模式吧。
 
后退
顶部