Delphi自带的indy iptcpserver  客户端第一次打开没问题,关了再打开就不行了

解决方案 »

  1.   

    如果free,控件自身就释放掉了啊
      

  2.   

    有相关代码吗?是客户端FREE还是服务端?
      

  3.   

    我已经升到9.18版了,还是不行,关闭服务端的时候idtcpserver.active:=false这一句过不去
      

  4.   

    UP,谁见过,IDTCPSERVER关不掉进程的情况?
      

  5.   

    再把问题说一下
    1 IDTCPclient连上了,一点停止服务就死了,定住了
    2 IDTCPclient连上了,退出后再上就死了,定住了
    3 IDTCPclient连上了,退出后服务端关闭后进程没关,还在任务管理中代码很简单就是:procedure LinkServer(IdTCPClient1:TIdTCPClient);//登录服务器
    var str :string;
    begin
      IdTCPClient1.host :=Frmmain.Sserverip; //连接主机
      IdTCPClient1.Port := StrToInt('3125'); //端口
      try
      IdTCPClient1.Connect(5000); //连接
       except
      IdTCPClient1.Disconnect;
      Application.CreateForm(Tfrmset,frmset);
      Frmset .ShowModal;
      end;
    end;
    procedure TFrmmain.IdTCPClient1Connected(Sender: TObject);
    var str:string;
    begin
      try
      str:=IdTCPClient1.ReadLn();  except
      Application.MessageBox('服务器无响应!', '提示',MB_OK + MB_ICONASTERISK);
      IdTCPClient1.Disconnect();
      end;  if  str='NO' then
      begin
      Application.MessageBox('服务器已达到连接最大数!', '提示',MB_OK + MB_ICONASTERISK);
      Application.Terminate;
      end
      else
      begin
      Frmmain. Susername:=copy(str,1,pos('  ||  ',str)-1);
      str:=   copy(str,pos('  ||  ',str)+6,length(str));
      Frmmain. Spwd:= copy(str,1,pos('  ||  ',str)-1);
      str:=   copy(str,pos('  ||  ',str)+6,length(str));
      Frmmain. Sinitdb:= copy(str,1,pos('  ||  ',str)-1);
      str:=   copy(str,pos('  ||  ',str)+6,length(str));
      Frmmain. Servername:= str;  end;end;
    procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
    begin
    with AThread.Connection do //已经连街上的一个进程
    begin
      if IdTCPServer1.Threads.LockList.count>strtoint(Label5.Caption) then
      begin
      WriteLn('NO');
      end
      else
      begin
      WriteLn(linkstr);
      end;
    end;
    end;
      

  6.   

    TIdTCPServer.Active := False的问题请参考此文:http://blog.csdn.net/jadeluo/archive/2009/03/05/3958423.aspx
      

  7.   

    uses IdThreadSafe;   //需要引用IdThreadSafe单元......var
      AList: TList;
      iLoop: Integer;
    begin
      if Assigned(IdTCPServer1.Threads) then
      begin
        AList := IdTCPServer1.Threads.LockList;
        try
          for iLoop := 0 to AList.Count -1 do
          begin
            TIdPeerThread(AList.Items[iLoop]).Connection.Disconnect;
            TIdPeerThread(AList.Items[iLoop]).Stop;
          end;
        finally
          IdTCPServer1.Threads.UnlockList;
        end;
        while not TIdThreadSafeList(IdTCPServer1.Threads).IsCountLessThan(1) do
        begin
          Application.ProcessMessages;
          Sleep(100);
        end;
      end;
      IdTCPServer1.Active := False;
    end;
    先感谢了,回家试一下
      

  8.   

    刚试了,还是不行,怪了,难到大家就没研究过用INDY写SERVER?
      

  9.   


    现在的情况是怎么样的?我上面的代码中, 是先将Connection.Disconnect,然后将线程Stop,此时,IdTCPServer.Active还是True。如果此时客户端又申请连接的话还是会成功连接的。这时,TIdThreadSafeList(IdTCPServer1.Threads).IsCountLessThan(1)就永远不会返回True的。而且下面的IdTCPServer1.Active := False; 仍然可能会出现Timeout异常。
    对此,我也没想出什么好的办法,只能修改成这样先用着:var 
      AList: TList; 
      iLoop: Integer; 
    begin 
      if Assigned(IdTCPServer1.Threads) then 
      begin 
        AList := IdTCPServer1.Threads.LockList; 
        try 
          for iLoop := 0 to AList.Count -1 do 
          begin 
            TIdPeerThread(AList.Items[iLoop]).Connection.Disconnect; 
            TIdPeerThread(AList.Items[iLoop]).Stop; 
          end; 
        finally 
          IdTCPServer1.Threads.UnlockList; 
        end; 
        iLoop := 1;
        while not TIdThreadSafeList(IdTCPServer1.Threads).IsCountLessThan(1) and (iLoop < 50) do 
        begin 
          Application.ProcessMessages; 
          Sleep(100); 
          inc(iLoop);
        end; 
      end; 
      while IdTCPServer1.Active do
        try
          IdTCPServer1.Active := False; 
        except
          Application.ProcessMessages;
          Sleep(100);
        end;
      end;
    end; 
      

  10.   

    谢谢,回去测试但是我昨天看DEMO里人家的代码很简单呀,不用这样,也能做长时间在线连接,不发生任何死机
      

  11.   


    长时间在线连接很容易实现, 发生死机最大可能性是在Execute中进行了非线程安全的操作(比如访问VCL组件)。我上面的代码是想解决IdTCPServer.Acvite := False时发生的一些问题。
      

  12.   

    代码我试了,还是老样子,我现在想把代码都删除,一点一点的加,看看那块出的问题,只能这样了,也可能INDY本来没问题,是我那块写乱了
      

  13.   

    谢谢提醒,我在IDTCPSERVERCONNECT事件中加了
    idtcpserver1.Threads.LockList.Count刚才连AThread.Synchronize()同步都用上了都不行,这个东西怎么这么厉害呀,一调用就死锁经过大家的帮忙,两周的时候了,异常掉线问题终于解决了,我也累坏了,散分!!!哈哈