读书人

indy9 停止TIdTCPServer出现的疑问请

发布时间: 2012-03-06 20:47:55 作者: rapoo

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;

读书人网 >.NET

热点推荐