如果用connected 属性判断,只能判断用程序关掉连接的情况,如果网络故障断开则无法检测,能够给我例子

解决方案 »

  1.   

    每隔一段时间给对方发个反馈包,如果没有反馈则对方掉线了,下面是我很久以前写的了,是用TServerSocket和TClientSocket的
    //检查客户端是否掉线
    procedure TF_Main.Timer1Timer(Sender: TObject);
    var
      hour, min, sec, msec: word;
      i: integer;
      socket: TCustomWinSocket;
      tmResultMin, tmResultSec: word;
      CheakTime, ReceiveTime: word;
    begin
      CheakTime := 40;                                            //固定检查时间
      ReceiveTime := 20;                                          //信息反馈时间
      i := 0;
      while i <= TimeList.Count - 1 do
      begin
        DecodeTime(now, hour, min, sec, msec);
        if min < ptimerecord(TimeList.Items[i]).min then
          inc(min, 60);
        tmResultMin := min - ptimerecord(TimeList.Items[i]).min;    tmResultSec := tmResultMin * 60 + (sec - ptimerecord(TimeList.Items[i]).sec);    //如果客户限定反馈时间内没有反馈,则删除该用户
        if tmResultSec >= CheakTime + ReceiveTime then
        begin
          socket :=TCustomWinSocket.Create(ptimerecord(TimeList.Items[i]).socketHand);
          ServerSocket1.OnClientDisconnect(nil, socket);
          socket.Free;
        end
        else if tmResultSec >= CheakTime then
          //如果客户检查时间内没有动作则发信息要求客户反馈
        begin
          socket := TCustomWinSocket.Create(ptimerecord(TimeList.Items[i]).socketHand);
          socket.SendText(BuildProtocol('Z000'));
        end;
        inc(i);
      end;
    end;
      

  2.   

    TServerSocket和TClientSocket 都有ERROR事件吧,捕捉这个异常就可以了。
      

  3.   

    如楼上说的,TServerSocket和TClientSocket在连接的情况下要是对方掉线都会触发ERROR事件,在这个事件里面处理就可以了