我用TClientSocket写了一个CLIENT端的程序,在选择用非阻塞方式(ctNoBlocking)连接SERVER端时如果失败,可以激发ClientSockError事件,不会产生异常,但是这种方式传送数据好象不可靠.要是选择阻塞方式(ctBlocking)在连接SERVER端失败时就会产生异常,而不激发ClientSockError事件,如何处理或者避免该异常的产生?

解决方案 »

  1.   

    我用TClientSocket作文件上传超过10M的文件都比较可靠,你说说你的详细现象或者sourceCode
      

  2.   

    可以用Try
            Active := True;
          Except
            错误处理
          end;
      

  3.   

    不可靠就是,服务器发来的数据CLIENT接收不到.
    还有那种异常处理我也试过,不起作用,还是出现异常,不知何故?
      

  4.   

    好象不可靠不能说是不可靠。
    如果你分析过socket api那你就知道他可不可靠。
    其实,阻塞方式采用的钩子时也是设置为非阻塞状态来接收或取得连接的,然后再设置回来的。
    非阻塞传输是很可靠的。而阻塞不在很正规(如手机通信等大型)的系统上,还是最好不要用。
      

  5.   

    用他来处理TWinSocketStreamprocedure TCMServerThread.ClientExecute;
    var
      Data: array[0..1023] of char;
      SocketStream: TWinSocketStream;
      ADOQuery: TADOQuery;
      ADOConnection: TADOConnection;
      t:_Recordset;
      ReceiveMessage :String;
    begin
        Synchronize(RegisterForm);
        SocketStream := TWinSocketStream.Create(ClientSocket, 600000);
      while not Terminated and ClientSocket.Connected do
        try
          FillChar(Data, SizeOf(Data), 0);
          if SocketStream.Read(Data, SizeOf(Data)) = 0 then
          begin
            ClientSocket.Close;
            Synchronize(RemoveForm);
            Terminate;
          end;
            ReceiveMessage := Data;
            Send(ReceiveMessage);
        except
            ClientSocket.Close;
            Synchronize(RemoveForm);
            Terminate;
        end;
    end;