我们有一个应用程序,它使用Delphi 2007附带的Indy 10.1.1组件来监听传入的TCP请求。
偶尔我们会收到来自客户端应用程序的传入连接。通常情况下,发生以下两种情况之一:1)在收到任何数据之前客户端终止连接,或者2)接收到我们没有预料到的数据,我们手动终止连接。
但是,我们收到了没有收到数据的连接,并且在客户端终止连接之前似乎一直存在。
如果在指定的时间后没有收到数据,有没有办法从服务器终止这样的连接?
答案 0 :(得分:3)
在OnExecute事件处理程序中,跟踪从客户端收到最后一个好数据的时间。使用连接的ReadTimeout属性,您可以定期超时挂起读取操作,以便检查客户端是否暂时未发送数据,如果是,则断开连接。
答案 1 :(得分:1)
将其另存为killthread.pas
unit killthread;
interface
uses
Classes, IdTCPServer, IdTCPClient, IdContext, Types, SyncObjs;
type
TKillThread = class(TThread)
private
FContext: TIdContext;
FInterval: DWORD;
FEvent: TEvent;
protected
procedure Execute; override;
public
constructor Create(AContext: TIdContext; AInterval: DWORD); overload;
destructor Destroy; override;
procedure Reset;
procedure Stop;
end;
implementation
{ TKillThread }
constructor TKillThread.Create(AContext: TIdContext; AInterval: DWORD);
begin
FContext := AContext;
FInterval := AInterval;
FEvent := TEvent.Create(nil, False, False, '');
inherited Create(False);
end;
destructor TKillThread.Destroy;
begin
FEvent.Free;
inherited Destroy;
end;
procedure TKillThread.Reset;
begin
FEvent.SetEvent;
end;
procedure TKillThread.Stop;
begin
Terminate;
FEvent.SetEvent;
WaitFor;
end;
procedure TKillThread.Execute;
begin
while not Terminated do
begin
if FEvent.WaitFor(FInterval) = wrTimeout then
begin
FContext.Connection.Disconnect;
Exit;
end;
end;
end;
end.
然后在服务器端执行此操作:
procedure TYourTCPServer.OnConnect(AContext: TIdContext);
begin
AContext.Data := TKillThread.Create(AContext, 120000);
end;
procedure TYourTCPServer.OnDisconnect(AContext: TIdContext);
begin
TKillThread(AContext.Data).Stop;
end;
procedure TYourTCPServer.OnExecute(AContext: TIdContext);
begin
if AContext.Connection.Connected then
begin
TKillThread(AContext.Data).Reset;
// your code here
end;
end;
答案 2 :(得分:1)
我有类似的问题,我使用了delphi7 + Indy9。
和我的解决方案: 在TIdTCPServer事件onConnect中,我喜欢这个
procedure Tf_main.ServerHostConnect(AThread: TIdPeerThread);
begin
//code something
//mean AThread will do Disconnected if Client no activity ( send receive ) on interval...)
AThread.Connection.ReadTimeout := 300000; //5 minutes..
//code something
end;
也许在Indy10上你可以像那样做
答案 3 :(得分:0)
您应该可以致电(TIdTCPConnection).Disconnect
。