| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6915 人关注过本帖
标题:关于indy10中IdTcpServer与IdTcpClient断开连接的问题请教高手
只看楼主 加入收藏
zhweizw
Rank: 1
等 级:新手上路
帖 子:8
专家分:5
注 册:2005-6-26
结帖率:0
收藏
已结贴  问题点数:10 回复次数:2 
关于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吗?
搜索更多相关主题的帖子: IdTcpClient IdTcpServer 
2010-08-03 09:32
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:5 
没用过Indy的控件,说不好.只知道它好像以是阻塞方式工作的.这种方式以好像不用消息传递状态吧.
如果是新的版本支持非阻塞方式,估计你要自己重载DisconnectNotifyPeer的实现了.

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-08-03 12:17
makebest
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:658
专家分:962
注 册:2005-3-17
收藏
得分:5 
没有用过这个控件, 不过据我编写网络应用程序的经验, 可以这样处理:
客户端连接到服务器后, 先发送请求, 然后等待服务器的回应, 如果服务器主动断开了, 接收端不会报错, 而是表示接收到 0 字节, 此时客户端立即关闭即可.
2010-08-05 15:32
快速回复:关于indy10中IdTcpServer与IdTcpClient断开连接的问题请教高手
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011285 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved