我想即时判断连接是否成功,就像连接数据库一样,我连接成功后再执行下面的代码,而我现在用的是ONError事件处理,有问题,希望高手指点,(我已经想了好几天了不得不请教了)

解决方案 »

  1.   

    我就是这样做的,        DMMainDate.sctClient.Address := ledtIPAddress.Text;
            DMMainDate.sctClient.Port := StrToInt(ledtPort.Text);
            DMMainDate.sctClient.Open;
            //写入配置文件        if DMMainDate.sctClient.Active then //但是这句,每次都是False;无论我设置是否正确
            begin
                DataCfgIniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'DataCfg.ini');
                DataCfgIniFile.WriteString('DataCfgOption', 'IPAddress', ledtIPAddress.Text);
                DataCfgIniFile.WriteInteger('DataCfgOption', 'Port', StrToInt(ledtPort.Text));
                DataCfgIniFile.Free;
                DMMainDate.strIPAddress :=ledtIPAddress.Text;
                DMMainDate.intPort :=StrToInt(ledtPort.Text);
                Close();
            end;
      

  2.   

    procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      showmessage('连接已断开');
    end;procedure TForm1.ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
    showmessage('连接是否成功');
    end;
      

  3.   

    if DMMainDate.sctClient.Active then //但是这句,每次都是False;无论我设置是否正确//不会吧?我试了下。没问题呀?
    if ClientSocket1.Active then showmessage('true')else showmessage('false')
      

  4.   

    DMMainDate.sctClient.Address := ledtIPAddress.Text;
            DMMainDate.sctClient.Port := StrToInt(ledtPort.Text);
            DMMainDate.sctClient.Open;
            //写入配置文件…………//这之间没对sctClient进行操作吗?
           
            if DMMainDate.sctClient.Active then //但是这句,每次都是False;无论我设置是否正确
      

  5.   

    ClientSocket1.open
    这个函数的返回值就是是否成功
      

  6.   

    To  antivence(铁丝面) 
    ClientSocket1.open 根本就是一个procedure,没有返回值
      

  7.   

    To myling(阿德):
    我在其间没有做其他操作,我的意思是在进行DMMainDate.sctClient.Open;的时候,程序已经开始运行下面的语句了。所以我的程序if DMMainDate.sctClient.Active then 中的Active值一直是False。
      

  8.   

    我寫了一個Connect的函數﹕function TTLWallySmtp.Connect (var vErrStr: string; bLeaseLine: Boolean): integer;
    begin
      Try
        if not bLeaseLine then
         if not CheckSocketAvail then
            raise Exception.Create('Remote connection not available');
         Open;
         repeat
               Application.ProcessMessages;
               if FFlag = False then
                 Break;
         until Socket.Connected;
         RecvText;
         SendText('HELO ' + 'INeedYou' + CRLF);     
    //     SendText('HELO ' + Socket.LocalHost + CRLF);
         RecvText;
         if FVerify then
         begin
           SendText('auth LOGIN' +CRLF);
           RecvText;
           SendText(Base64Encode(FUser) +CRLF);
           RecvText;
           SendText(Base64Encode(FPass) +CRLF);
         end; 
         result := 0;
      Except
            On E : Exception do
            begin
               vErrStr := E.Message;
               result := -1;
               if Socket.Connected then
                  Socket.Close;
            end;
      End;
    end;------------------------------------------------------------------------
    procedure TTLWallySmtp.RecvText;
    var
      r, i: Integer;
      s: string;
      buf: array[0..1023] of Char;
      ReplyCode, ReplyStr: string;
    begin
      ReplyCode := '';
      ReplyStr := '';
      i := 0;
      Repeat
        Application.ProcessMessages;
        r := Socket.ReceiveBuf( buf, SizeOf(buf));
        s := copy( buf, 1, r);
        ReplyCode := trim( copy( s, 1, 4));
        ReplyStr := trim( copy( s, 5, pos( CRLF, s) -5));
        i := i+1;
      until ((ReplyCode <> '') or (i>10));
        if ReplyCode <> '' then
        begin
           // first digit of replycode 2 or 3 indicates success
             if (ReplyCode[1] <> '2') and (ReplyCode[1] <> '3') then
                raise Exception.Create(ReplyStr)
        end else
            raise Exception.Create('No Reply');
    end;
      

  9.   

    建议你用SNIFF观察你的连接是否可以建立了。才好判断的ClientSock的Active是否可以置为True;
      

  10.   

    我刚才把ClientServer中的clientType设置为ctBlocking就可以了,不知道哪位高手能给我详细的解释一下这个属性
      

  11.   

    但是我设置为ctBlocking后,我的Onerror事件就不能执行了,为什么?
      

  12.   

    问题还没有解决,现在OnRead事件没有反映了,大家帮帮忙,我愿意加到200分。
    其实我的意思是:我每个客户端执行操作后,就向服务器端发送消息,然后服务器端再向每个客户端发送消息,使每个客户端显示的数据都是相同的。所以我要求能及时判断每次发送的消息是否成功。
      

  13.   

    这个我也试过,但是如果采用ctNonBlocking就不能及时得到是否连接成功,但如果采用ctBlocking又不能用OnRead事件,其实我就想实现我上面说的功能,不知如何解决更好
      

  14.   

    一般判断是否仍然处于连接状态,可以采用“心跳”方式。也就是说每隔指定的时间,向对方发送一个数据包,如果对方有回应,则表示仍然在连接着。
    用控件的事件,有时候不能准确地反应连接状态,这和网络的复杂状况有关。
    你可以多参考WINSOCK 的API。如果你能了解API,会发现你的问题只是小儿科了。:)
      

  15.   

    TO foxnt(吴剑明★天马梦想) :
    我现在要得有点急,我也是第一次用Socket,不知你能不能帮我写一段原码,分我会给你的。
      

  16.   

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    ClientSocket1.Socket.SendText('check');
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
     if Socket.ReceiveText='check' then
       Socket.SendText('connected');
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
       if Socket.ReceiveText='connected' then
       showmessage('仍然连接')
    end;Timer1的时间间隔你自己设,1000是一秒
      

  17.   

    TO  myling(阿德) :
      就只有这种方法吗?你这种方法不能还是不能及时得到是否连接成功,比如我现在把这个消息发过去后,要等几秒钟才有反应,而程序却已经执行到下一步了。如:我用这种方法在登录时判断是否连接上服务器端,而我已经登录了,才报错。希望大家能帮我想想,我再加200分解决该问题。
      

  18.   

    你想让他及时到什么地步?一送出去马上响应?这怎么可能?=========================================================================
    我用这种方法在登录时判断是否连接上服务器端,而我已经登录了,才报错。
    =========================================================================至于你说的这个问题很好办,你可以设置一个变量标志,默认时,设成0,这是程序停止,等待返回值当返回正确是,设成1,程序继续,返回错误时,设成2,程序退出var  iserro:integer=0;
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin  
     try
        ClientSocket1.Socket.SendText('check');
     except
        iserro:=2;
     end; 
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
     if Socket.ReceiveText='check' then
       Socket.SendText('connected');
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
       if Socket.ReceiveText='connected' then
       begin
         iserro:=1;
         showmessage('仍然连接');
       end;
    end;procedure TForm1.login;
    begin
        ……
       while iserro=0 do
         begin
             Application.ProcessMessages;
         end;
       if iserro=2 then exit;
       if iserro=1 then 
     
        ……
    end;
      

  19.   

    问题解决了,多谢大家的帮忙,不过我还有很多的问题没有搞懂,但现在没有时间了,以后再慢慢研究。现在给分,myling(阿德) 给250分,这个贴只给50,另开两个贴了给分,注意领分。