100分求一满意答案,不够再给!熟悉Indy控件的请进(100分)

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

mopege

Unregistered / Unconfirmed
GUEST, unregistred user!
事情是这样子.我想知道Indy的TIdtcpserver这个控件的OnExecute事件到底是用来干什么的
?????????
我看了Demo,好像是可以用来作为一个类似OnRead的事件来读取数据,而且是用循环监测
Tcp缓冲区的方式.
但是Indy居然要求我一定要有一个OnExecute事件!没有的话它就拒绝继续连接!
真是巨faint!(我用的是Delphi6和Kylix2,都存在这样子的问题)
大家可以看看我做的这个简单实验:新建两个application,分别在form上面放置
TIdtcpserver和TIdtcpclient,使之一个是server端,一个是Client端

server:一个TMemo,两个TButton,一个TIdtcpserver
procedure TForm2.FormCreate(Sender: TObject);
begin
idtcpserver1.Active:=true;
end;
procedure TForm2.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
memo1.Lines.Add('connected '+athread.Connection.Binding.PeerIP);
end;
procedure TForm2.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
memo1.Lines.Add('disconnect');
end;

client端:一个TIdtcpclient,两个button,一个button1单击后执行:idtcpclient1.connect;一个button2单击后执行idtcpclient1.disconnect;

就是这么简单一个东东,但是每次client单击button1后server的Memo1中居然出现了两行,
说明总共触发了OnConnect和Ondisconnect事件,但是实际上client端连接是存在的,没有断开,因为
如果我再次单击button1时出错"Already Connected'.那么究竟有没有断开呢?我在Kylix中运行了,然后
用netstat查看,发现的确已经断开了.
检查,发现如果没有为OnExecute
指定一个处理过程的话,将会出现异常.但是我真的没有必要用OnExecute事件啊.并且,如果
我在OnExecute事件处理中哪怕只是添加一行注释,上述问题就没有了,单击button1时
Ondisconnect事件将不会执行.但是再无论如何单击button2,程序都没有反应了...


 
因为INDY的TCP SERVER是基于多线程的。
EXCUTE相当于一个TCP的ON READ。但是INDY内置了对线程的管理。
 
大家都没有答对
 
我的估计:

1、TIdTCPServer的OnExecute事件是一个TIdServerThreadEvent类型的Handle,如果没有给它显式地赋值或生成OnExecute事件处理过程(就是在双击属性窗口中的事件)
则它为空值;

2、TIdTCPServer在收到connect请求后,就会调用OnExecute,而当它检查到OnExecute为空时,就会disconnect。

如果有谁愿意做实验的话,可以在onFormCreate中给OnExcecute赋一个TIdServerThreadEvent类型的过程,然后看看会不会自动断开。
 
后退
顶部