最近写了个登陆验证。但是如果登陆数量过多。服务端的句柄和内存不停的增加,最终造成服务端接收不到数据。或者不停的收错数据。我的服务端代码如下。请大大们帮忙指点下。
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;

解决方案 »

  1.   

    indy 的 Server 我还没有新得。
      

  2.   

       我現在把客戶端也改了.
    每次提交請求後都
    IdTCPClient.Connect;
    現在句柄和內存 不會再瘋狂增加.但是問題是.我自己寫了十個程序.循環一千次調用.服務端還是會掛掉.請問這應該怎麼處理呢?
    我後來又加了同步鎖.  暴力測試是沒問題了.但是我發現.如果在客戶端連接服務器的時候.我要是突然強制關掉客戶端.服務端就沒用了.
      

  3.   

    你把smemo1.lines.add这一些处理事件用线程处理,你的问题就差不多解决了.