最近写了个登陆验证。但是如果登陆数量过多。服务端的句柄和内存不停的增加,最终造成服务端接收不到数据。或者不停的收错数据。我的服务端代码如下。请大大们帮忙指点下。
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var cb:TSendData;
rBuf : tidbytes;
s,eflag,stemp:string; key,i:integer;
mylist:TStringList;begin key:=123; eflag:='84321'; stemp:=EncryptString(inttostr(key),eflag); s:='Y001'+stemp;
with AContext.Connection.IOHandler do
begin
Writeln(s,Tencoding.utf8);
s:=Readln(TEncoding.UTF8);
rBuf:=unjm.DecodeBytes(s);
BytesToRaw(rBuf,cb,sizeof(cb)); cb.name:=trim(DecryptString(cb.name,inttostr(key))); case cb.flag of
//用戶登陸
1:begin case Isuser(cb.name,cb.psw,1) of
0:
begin
smemo1.lines.add('用戶登陸失敗,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP +', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+erro+',inttostr(key));
Writeln(stemp,TEncoding.UTF8);
end;
1:
begin
smemo1.lines.add('用戶登陸錯誤,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP +', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+erro+',inttostr(key));
Writeln(stemp,TEncoding.UTF8);
end;
2:
begin
smemo1.lines.add('用戶賬號到期,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP +', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+date+',inttostr(key));
Writeln(stemp,TEncoding.UTF8);
end;
3:
begin
smemo1.lines.add('用戶登陸成功,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP +', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+usok+',inttostr(key));
Writeln(stemp,TEncoding.UTF8); mylist := TStringList.create;
MyList.Add(cb.name); stemp:=mylist.commatext; mylist.free; s:=readln(TEncoding.uTf8); if s='go' then
begin
stemp:=EncryptString(stemp,inttostr(key));
Writeln(stemp,Tencoding.uTf8);
end; end;
4:
begin
smemo1.lines.add('用戶已經在線,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP
+', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+onli+',inttostr(key));
Writeln(stemp,TEncoding.UTF8);
end; //case end;
end;
end; //*************************************end***********************************************
end;
end; Acontext.Connection.IOHandler.readln;end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var cb:TSendData;
rBuf : tidbytes;
s,eflag,stemp:string; key,i:integer;
mylist:TStringList;begin key:=123; eflag:='84321'; stemp:=EncryptString(inttostr(key),eflag); s:='Y001'+stemp;
with AContext.Connection.IOHandler do
begin
Writeln(s,Tencoding.utf8);
s:=Readln(TEncoding.UTF8);
rBuf:=unjm.DecodeBytes(s);
BytesToRaw(rBuf,cb,sizeof(cb)); cb.name:=trim(DecryptString(cb.name,inttostr(key))); case cb.flag of
//用戶登陸
1:begin case Isuser(cb.name,cb.psw,1) of
0:
begin
smemo1.lines.add('用戶登陸失敗,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP +', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+erro+',inttostr(key));
Writeln(stemp,TEncoding.UTF8);
end;
1:
begin
smemo1.lines.add('用戶登陸錯誤,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP +', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+erro+',inttostr(key));
Writeln(stemp,TEncoding.UTF8);
end;
2:
begin
smemo1.lines.add('用戶賬號到期,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP +', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+date+',inttostr(key));
Writeln(stemp,TEncoding.UTF8);
end;
3:
begin
smemo1.lines.add('用戶登陸成功,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP +', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+usok+',inttostr(key));
Writeln(stemp,TEncoding.UTF8); mylist := TStringList.create;
MyList.Add(cb.name); stemp:=mylist.commatext; mylist.free; s:=readln(TEncoding.uTf8); if s='go' then
begin
stemp:=EncryptString(stemp,inttostr(key));
Writeln(stemp,Tencoding.uTf8);
end; end;
4:
begin
smemo1.lines.add('用戶已經在線,賬號:'+cb.name+', 密碼:'+cb.psw+
', IP:'+AContext.Binding.PeerIP
+', 時間:'+DateTimeToStr(now)); stemp:=EncryptString('user'+'+onli+',inttostr(key));
Writeln(stemp,TEncoding.UTF8);
end; //case end;
end;
end; //*************************************end***********************************************
end;
end; Acontext.Connection.IOHandler.readln;end;
每次提交請求後都
IdTCPClient.Connect;
現在句柄和內存 不會再瘋狂增加.但是問題是.我自己寫了十個程序.循環一千次調用.服務端還是會掛掉.請問這應該怎麼處理呢?
我後來又加了同步鎖. 暴力測試是沒問題了.但是我發現.如果在客戶端連接服務器的時候.我要是突然強制關掉客戶端.服務端就沒用了.