关于indy10中IdTcpServer与IdTcpClient断开连接的问题请教高手
本人在使用Indy10中遇到了问题,此问题困扰我许久,寻遍互联网不得其解,寻高手指点。IdTcpClient与IdTcpServer建立连接后,如果在Server端选择一条已连接的Client,执行DisConnect方法后,Client端不会触发OnDisConnected事件(但此时Client端的Connected属性是False,说明连接确实已经断开,但却没有触发OnDisconnected事件)。
例如:
procedure TForm1.Btn1Click(Sender:TObject);
var
i:integer;
List:TList;
begin
List:=IdTcpServer1.Contexts.LockList;
Try
for i:=0 to List.Count-1 do
begin
if TIdServerContext(List.items[i]).binding.Peerip = '192.168.1.6' then begin
TIdServerContext(List.items[i]).Connection.Disconnect;
end;
end;
finally
IdTcpServer1.Contexts.UnLockList;
end;
end;
执行上面的代码后,客户端'192.168.1.6' 链接断开(connected属性为FALSE),但没有触发OndisConnected事件。
相反,如果在Client端主动执行DisConnect方法,Server与Client端都能触发OnDisconnected事件。
由于IdTcpClient继承自TIdTcpConnection类,所以学生查看了IdTcpConnection.pas单元的源码发现:Client端的OnDisconnected事件只在自己的DisConnect方法中触发,其他位置没发现有触发此事件的代码。所以造成了Server端断开连接而Client端不触发OnDisconnected事件的现象。
那么,如果在Server执行DisConnect 方法后,如何在Client端触发Ondisconnected事件呢,我想到2个方法:
1、在Client端用timer定时检测;
2、在Server端执行Disconnect方法前先通知Client。
但是上面2种方法用起来总感觉不爽,起码不够“专业”。
1、请教,还有什么更好的方法吗?
2、我就纳闷了,IdTcpClient的OnDisconnected事件为什么只设计在自己的DisConnect方法中才触发呢?
3、是不是我理解错误了?如果是,请高手指点,万分感谢!!!
另外,我发现在TIdTCPConnection单元的TIdTCPConnection.Disconnect方法中执行了DisconnectNotifyPeer方法(519行),该方法在该单元的402行有说明:
// This is called when a protocol sends a command to tell the other side (typically client to
// server) that it is about to disconnect. The implementation should go here.
大概的意思是,当协议(Tcp/ip)发送一个命令通知对方关于断开连接时调用此方法,典型的应用时客户端发送到服务器端。
但是DisconnectNotifyPeer方法的实现部分却是空的,没有执行任何代码,并且在其子类中也未被重载或覆盖,难道需要我们自己override吗?