var i:integer; begin for i:=0 to ServerSocket1.Socket.Connections.count-1 do ServerSocket1.Socket.SendText('...'); end; 这样就可以了,它会自动清除不正常连接
以下是我常用的代码,希望对楼主有帮助TSocketStatusGroup = record LastVisitTime: TDateTime; SocketHandle: Integer; Enabled: Boolean; Buf: string; end;FClientStatus: array [TSocketGroupRange] of TSocketStatusGroup;procedure TCRLSocket_S.MyServerOnConnect(Sender: TObject; Socket: TCustomWinSocket); var I: integer; begin for I := Low(TSocketGroupRange) to High(TSocketGroupRange) do if not FClientStatus[I].Enabled then begin FClientStatus[I].LastVisitTime := now; FClientStatus[I].SocketHandle := Socket.SocketHandle; FClientStatus[I].Enabled := True; Break; end; end;procedure TCRLSocket_S.MyServerOnDisconnect(Sender: TObject; Socket: TCustomWinSocket); var I: integer; begin I := GetClientStatusOffset(Socket.SocketHandle); FClientStatus[I].Enabled := False; end;function TCRLSocket_S.GetClientStatusOffset(const SocketHandle: integer): integer; var I: integer; begin Result := 0; For I := Low(TSocketGroupRange) to High(TSocketGroupRange) do if FClientStatus[I].Enabled and (FClientStatus[I].SocketHandle = SocketHandle) then begin Result := I; Break; end; end;procedure TCRLSocket_S.CheckSocketStatus; var I: integer; begin for I := Low(TSocketGroupRange) to High(TSocketGroupRange) do if FClientStatus[I].Enabled and (SecondsBetween(FClientStatus[I].LastVisitTime, now) > SendBufTimeOut) then CloseConnection(FClientStatus[I].SocketHandle);end;procedure TCRLSocket_S.CloseConnection(const SocketHandle: integer); var I: integer; begin I := GetSocketHandleOffset(SocketHandle); if I >= 0 then FServerSocket.Socket.Connections[I].Close; I := GetClientStatusOffset(SocketHandle); if I > 0 then FClientStatus[I].Enabled := False; end;楼主组织一下,问题就迎刃而解了
to borgvardt(maximius) 大哥: 这个TSocketGroupRange变量是什么类型的,应该怎样声明呢?我不太会,能否请你再讲一下,谢谢
所以还是有问题的.
i:integer;
begin
for i:=0 to ServerSocket1.Socket.Connections.count-1 do
ServerSocket1.Socket.SendText('...');
end;
这样就可以了,它会自动清除不正常连接
LastVisitTime: TDateTime;
SocketHandle: Integer;
Enabled: Boolean;
Buf: string;
end;FClientStatus: array [TSocketGroupRange] of TSocketStatusGroup;procedure TCRLSocket_S.MyServerOnConnect(Sender: TObject; Socket: TCustomWinSocket);
var
I: integer;
begin
for I := Low(TSocketGroupRange) to High(TSocketGroupRange) do
if not FClientStatus[I].Enabled then
begin
FClientStatus[I].LastVisitTime := now;
FClientStatus[I].SocketHandle := Socket.SocketHandle;
FClientStatus[I].Enabled := True;
Break;
end;
end;procedure TCRLSocket_S.MyServerOnDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
I: integer;
begin
I := GetClientStatusOffset(Socket.SocketHandle);
FClientStatus[I].Enabled := False;
end;function TCRLSocket_S.GetClientStatusOffset(const SocketHandle: integer): integer;
var
I: integer;
begin
Result := 0;
For I := Low(TSocketGroupRange) to High(TSocketGroupRange) do
if FClientStatus[I].Enabled and (FClientStatus[I].SocketHandle = SocketHandle) then
begin
Result := I;
Break;
end;
end;procedure TCRLSocket_S.CheckSocketStatus;
var
I: integer;
begin
for I := Low(TSocketGroupRange) to High(TSocketGroupRange) do
if FClientStatus[I].Enabled and (SecondsBetween(FClientStatus[I].LastVisitTime, now) > SendBufTimeOut) then
CloseConnection(FClientStatus[I].SocketHandle);end;procedure TCRLSocket_S.CloseConnection(const SocketHandle: integer);
var
I: integer;
begin
I := GetSocketHandleOffset(SocketHandle);
if I >= 0 then FServerSocket.Socket.Connections[I].Close; I := GetClientStatusOffset(SocketHandle);
if I > 0 then FClientStatus[I].Enabled := False;
end;楼主组织一下,问题就迎刃而解了
这个TSocketGroupRange变量是什么类型的,应该怎样声明呢?我不太会,能否请你再讲一下,谢谢
当1死机,ServerSocket不一定会触发错误事件的
用什么方法才判断用户长时间无操作呢?是用记录该用户上次的操作时间与现在操作时间来比较吗?这样好象不太准确吧!如果用户刚好在规定时间过了有操作那岂不是连不上了。还有想请教一下,户长时间不操作是不是会自动掉线的。