請教,idtcpserver想將與之連接的客戶端,如果長時間沒有發資料過來,就把它踢掉,怎么實作呢?注意,不是客戶端斷線了,線路是通暢的,只是它不發規定的資料過來,低層連接是正常的。
uj5u.com熱心網友回復:
可以做一個心跳機制,定時5分釧,無資料發來,將其踢出。uj5u.com熱心網友回復:
if > 5分鐘沒有發資料 then踢掉();
uj5u.com熱心網友回復:
一個專案里用到Socket,大致是如下處理,供參考(用Indy)。TUserAccount是自定義的用戶類,和TIDTCPServer的Context.Data系結,在TIDTCPServer的OnConnect里系結
FIsDataReceived:boolean; //是否收到資料標志
FContext:TIDContext; // 系結的Context
CheckMessage; //訊息處理方法
比如:
//連接事件
procedure TfrmSocketServer.idtcpsrv1Connect(AContext: TIdContext);
var
aIP:string;
begin
aIP:=AContext.Binding.PeerIP;
AContext.Data:=TUserAccount.Create;
TUserAccount(AContext.Data).UserID:=aIP;
stat1.Panels[1].Text:='客戶端:'+aIP+'已經連接';
end;
//斷開連接事件
procedure TfrmSocketServer.idtcpsrv1Disconnect(AContext: TIdContext);
var
aIP:string;
aIndex:Integer;
begin
AContext.Data.Free;
AContext.Data:=nil;
aIP:=AContext.Binding.PeerIP;
stat1.Panels[1].Text:='客戶端:'+aIP+'已經斷開連接';
end;
TUserAccount的訊息處理函式CheckMessage;
procedure TUserAccount.CheckMessage;
begin
...........
...........
if {如果有有效訊息} then
FIsDataReceived:=True;
...............
...............
end;
CheckMessage方法在TIDTCPServer的OnExcute事件里呼叫
procedure TfrmSocketServer.idtcpsrv1Execute(AContext: TIdContext);
var
aUser:TUserAccount;
begin
aUser:=TUserAccount(AContext.Data);
if aUser <> nil then
begin
AContext.Connection.IOHandler.CheckForDisconnect(True,True);
aUser.CheckMsg(AContext);
end;
//Sleep(20);
end;
//定時器事件
procedure TfrmSocketServer.tmrDataReceiveTimer(Sender: TObject);
var
aUser:TUserAccount;
aList:TList;
i:Integer;
begin
aList:=idtcpsrv1.Contexts.LockList;
try
for i := 0 to aList.Count-1 do
begin
aUser:=TUserAccount(TIdContext(aList[i]).Data);
if aUser <> nil then
begin
if aUser.IsDataReceived then
begin
aUser.IsDataReceived:=False;
end
else
begin
if TIdContext(aList[i]).Connection.Connected then
begin
TIdContext(aList[i]).Connection.Disconnect;
end;
end;
end;
end;
finally
idtcpsrv1.Contexts.UnlockList;
end;
end;
uj5u.com熱心網友回復:
加入心跳包就可做到uj5u.com熱心網友回復:
不要用什么idTCPSERVER,這個東西,連接稍微多點就存在問題,我建議使用DIOCP,開源的,免費,高性能的轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71372.html
標籤:網絡通信/分布式開發
