当一个socket客户端连接到IdTcpServer服务端后,我只想让这个连接持续5秒钟,
超过这个时限,不管客户端在做什么,IdTcpServer都就主动断开这个连接。
实现方法:在form中添加了一个Timer控件,设置其Interval = 5000
服务启动成功后,设置Timer.Enable := TRUE;
并在其Timer事件中,加入检查超时及Disconnect的代码。
出现问题:
Timer开始工作后(Timer.Enable := TRUE),
IdTcpServer就不正常工作了,无法接受连接等等。
我想是不是要另开一个线程,来完成Timer所要完成的工作。请问,如何实现这样的功能需求!
谢谢!
procedure TfrmMain.IdTCPServerConnect(AThread: TIdPeerThread);
var
Client: PClient;
begin
Client := New(PClient);
Client.id := AThread.ThreadID;
......
AThread.Data := Pointer(Client);
end;procedure TfrmMain.Timer1Timer(Sender: TObject); ////
var
Client: PClient;
List: TList;
i: integer;
begin
List := IdTcpServer.Threads.LockList;
for i := 0 to List.Count - 1 do
begin
Client := Pointer(TIdPeerThread(List.Items[i]).Data);
if (Now - StrToDatetime(Client.loginTime) *24 * 60 * 60 > 5000) then
TIdPeerThread(List.Items[i]).Connection.Disconnect;
end;
end;
超过这个时限,不管客户端在做什么,IdTcpServer都就主动断开这个连接。
实现方法:在form中添加了一个Timer控件,设置其Interval = 5000
服务启动成功后,设置Timer.Enable := TRUE;
并在其Timer事件中,加入检查超时及Disconnect的代码。
出现问题:
Timer开始工作后(Timer.Enable := TRUE),
IdTcpServer就不正常工作了,无法接受连接等等。
我想是不是要另开一个线程,来完成Timer所要完成的工作。请问,如何实现这样的功能需求!
谢谢!
procedure TfrmMain.IdTCPServerConnect(AThread: TIdPeerThread);
var
Client: PClient;
begin
Client := New(PClient);
Client.id := AThread.ThreadID;
......
AThread.Data := Pointer(Client);
end;procedure TfrmMain.Timer1Timer(Sender: TObject); ////
var
Client: PClient;
List: TList;
i: integer;
begin
List := IdTcpServer.Threads.LockList;
for i := 0 to List.Count - 1 do
begin
Client := Pointer(TIdPeerThread(List.Items[i]).Data);
if (Now - StrToDatetime(Client.loginTime) *24 * 60 * 60 > 5000) then
TIdPeerThread(List.Items[i]).Connection.Disconnect;
end;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货