首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

indy9 停止TIdTCPServer出现的疑问,请

2012-03-06 
indy9 停止TIdTCPServer出现的疑问,请高手指点!我的设计思路是这样的(可能这种想法有问题):当停止TIdTCPSe

indy9 停止TIdTCPServer出现的疑问,请高手指点!
我的设计思路是这样的(可能这种想法有问题):
当停止TIdTCPServer时(点击停止按钮),如果还有连接的客户端,则对每个连接的客户端发一个停止指令(特殊的字符串),客户端接到指令后断开连接。
然后设置TIdTCPServer的active为false,接着设置停止按钮Enabled为false。

停止按钮代码如下:

  if   Clients.Count   >   0   then
    begin
        sMsg:= '102:   服务端停止! ';
        for   i   :=0     to   Clients.Count   -1   do
        begin          
              TIdPeerThread(TSimpleClient(Clients.Items[i]).Thread).Connection.WriteLn(sMsg);
        end;
    end;

    tcpServer.Active   :=False;   ●注意这个位置

    CCount:=0;
    Clients.Clear;
    slv.Items.Clear   ;

    BtnStart.Enabled   :=True;
    BtnStop.Enabled   :=False;

    sLog.Lines.Add(DatetimeToStr(now)+ '     服务端已经停止! ');

在TIdTCPServer的Disconnect事件中有这样的代码(提示客户端是否成功断开):
sLog.Lines.Add(DatetimeToStr(now)+ '     客户端 '+Client.Name   +  
        '已经成功断开连接 ');


现在出现的问题是:
当点击停止按钮时,如果有多个客户端连接,当sLog中提示两个客户端都成功断开时,停止按钮(BtnStop)的Enabled并不为false,而且“服务端已经停止!”也并未写入sLog。好像程序只运行到●位置。

请问这是怎么了?如何解决?


[解决办法]
跟踪调试,看看运行的具体情况,或者将下面的代码换到上面看看有什么变化
[解决办法]
服务器向客户端发一个广播,要球客户端挂断连接

服务器再断开
[解决办法]
可能需要等待一会才会执行下面的吧
[解决办法]
for i :=0 to Clients.Count -1 do 
begin
TIdPeerThread(TSimpleClient(Clients.Items[i]).Thread).Connection.WriteLn(sMsg);
TIdPeerThread(TSimpleClient(Clients.Items[i]).Thread).Connection.Disconnect;
end; 

先看看能不能
如果不行后面加个


for i :=0 to Clients.Count -1 do 
begin
TIdPeerThread(TSimpleClient(Clients.Items[i]).Thread).WaitFor;
end;
[解决办法]
要这样结束
try
with TCPServer.Threads.LockList do
begin
for i := 0 to Count- 1 do
begin
try
Athread := Items[i];
Athread.Terminate;
Athread.Connection.Disconnect;
except
end;
end;
end;

finally
TCPServer.Threads.UnlockList;
TCPServer.Active := false;
end;


procedure TFrmMainLanOAserver.TCPServerDisconnect(AThread: TIdPeerThread);
begin
 try
 
TCPServer.Threads.LockList.Remove(AThread);
TCPServer.Threads.UnlockList; //要加上这一句,否则不能退出
//AThread.Free; //不能使用这一句,否则会不能释放和触发异常 要用 AThread.Data:=nil;
AThread.Data:=nil;
 
 except
 end;
end;

热点排行