我用IdTcpServer作服务端,两个控件,一个短连接,一个长连接,都发现在客户短连接断开N次过后,可不断不能在连接到服务器,而两个控件的active属性都是true.
不知道为什么会这样,有什么办法能主动侦测到这种情况然后采取恢复措施?

解决方案 »

  1.   

    一个短连接,一个长连接?不懂,汗~~连接中定时发送特定的指令来判断是否有效
    例如NOOP等
      

  2.   

    是不是客户端连接了一段时间后全部都连不上了?
    我用IDTCPSERVER时碰到过这种情况。一个线程一个连接,用完后释放。结果最后在查询分析器里发现连接并没有断开。而是一直增长。最后导致SQLSERVER超过最大连接数。不能再连接了。我也发了帖子,可问题没解决,最后只能用TSERVERSOCKET单线程实现了
      

  3.   

    这个情况没有碰过,是不是没有断彻底呢?
    而且这样的做法还不如用udp做(短连接)
      

  4.   

    短连接的execute代码
    procedure TFrmMain.IdTCPDataExecute(AThread: TIdPeerThread);
    var
        ReadStr:string;
        LCMD:integer;
        buftmp:array [0..511] of byte;
    begin
      try
        AThread.FreeOnTerminate:=true;
        ReadStr:=AThread.Connection.CurrentReadBuffer();
        copymemory(@buftmp,@Readstr[1],length(ReadStr));
        if length(ReadStr)=0 then
        begin
            exit;
        end;
        ReadStr:=DeCode(buftmp,length(readstr));
        memolock.Acquire;
            try
                if memorecv.Lines.Count>200 then memorecv.Lines.Clear;
                if CBMemo.Checked then
                begin
                    memorecv.Lines.Append(datetimetostr(now)+'    '+AThread.Connection.Binding.PeerIP+':'+inttostr(AThread.Connection.Binding.PeerPort));
                    memorecv.Lines.Append(ReadStr);
                end;
            except
            end;
        memolock.Release;    try
            LCMD:=strtoint(leftstr(readstr,pos('&',readstr)-1));
        except
            LCMD:=0;
        end;
        ReadStr:=rightstr(ReadStr,length(ReadStr)-6);
        case LCMD of
        97863:begin
                AThread.Connection.WriteLn('OK');
                if pos('11660',ReadStr)>0 then
                begin
                    AThread.Connection.Disconnect;
                    AThread.Terminate;
                    exit;
                end;    
                ProcessRecvMeg(ReadStr);
            end;
        97862:begin
                AThread.Connection.WriteLn('OK');
                DoSql(ReadStr);
            end;
        else
            AThread.Connection.WriteLn('ERROR');
            WriteLog(extractfilepath(application.ExeName)+'Games.log','DATA数据读取错。' );
        end;
      except on e:exception do
        begin
            WriteLog(extractfilepath(application.ExeName)+'Games.log',e.Message );
        end;
      end;
      AThread.Terminate;
    end;
      

  5.   

    在最后  AThread.Terminate; 是不是改为通知Client做disconnect动作呢