以下是实现代码 
TSendnetMessage = Class(TObject)
   private
     FDataType   : TSendType;
     FName       : String;
     NewAddr     : String; //ip地址
     FSendData   : TSendData; //新数据
     NewName     : String; //所打开的文件名
     Newini      : TiniFile;
     FClient     : TClientSocket;
   Public    //comp为组件父类的名字
     Function  GetIP :Integer; //从ini文件获得ip地址
     Procedure  SetData(Data : TSendType); //根据选择来获得数据类型
     Function   GetData :TSendData ;
     Procedure  PostData;  //提交数据
     Constructor  Create(Comp : String ;aclient : TClientSocket);
     Destructor Destroy; override;
   End;
//**************************************************************************
//
//      函数: Create
//      功能: 构造器
//      参数1: Comp   机器名
//      参数2:  Aclient   ---TClientSocket对象
Constructor   TSendNetMessage.Create(Comp : String ;aclient : TClientSocket);
Begin
 inherited  Create;
  FName     := comp;
 // self.FClient.ClientType := ctNonBlocking;
  Self.FClient   := AClient;
  Self.FClient.Host  := '192.168.1.69';   //得到ip地址
  Self.Fclient.Port  := 886;
  Self.Fclient.Active := True;
  While (Not Self.FClient.Active) Do
    Application.ProcessMessages;
End;//****************************************************************************
//
//         函数: GetIp
//         功能: 获得Ip
//        返回值: 0
//*****************************************************************************Function   TSendNetMessage.GetIP : Integer;
Var
  SAddr : string;
Begin
  newname   := ExtractFilePath(application.exeName)+'\ini\config.ini';
  Newini  :=  Tinifile.Create(newname);
  NewAddr := newini.ReadString(FName,'ADDRESS',SAddr);
   // Iport   := Newini.ReadInteger(FName,'PORT',Iport1) ;
   result := 0;
End;//******************************************************************************
//
//         函数: GetData
//         功能:获得发送数据
//         返回值:TSendData
//******************************************************************************Function   TSendNetMessage.GetData : TSendData;
Begin
   Case  FDataType of
     StartCL :
       FSendData := FStartCL;
     StopCL  :
       FSendData := FStopCL;
     YiTao   :
       FSendData := FYiTao;
     ErTao   :
       FSendData := FErTao;
     SanTao  :
       FSendData := FSanTao ;
     SiTao   :
       FSendData := FSiTao;
     WuTao   :
       FSendData := FWuTao;
     LuTao   :
       FSendData := FLuTao;
     QiTao   :
       FSendData := FQiTao;
     BaTao   :
       FSendData := FBaTao;
     ZhenSel :
       FSendData := FZhenSel;
     JanHu   :
       FSendData := FJanHu;
     ShouSu  :
       FSendData := FShousu;
     YiZen   :
       FSendData := FYiZen;
     ErZen   :
       FSendData := FErZen;
     SanZen  :
       FSendData := FSanZen;
     OneResp :
       FSendData := FOneResp;
     TwoResp :
       FSendData := FTwoResp;
     ThreeResp :
       FSendData := FThreeResp;
     FourResp  :
       FSendData := FFourResp;  //四倍增益
     ClosePort :
       FSendData := FClosePort;
     OpenPort  :
       FSendData := FOpenPort;
   End;
   Result := FSendData;
End;//****************************************************************************
//
//          函数:SetData
//          功能:发送数据
//          参数Data  : TSendType
//****************************************************************************Procedure  TSendNetMessage.SetData(data : TSendType);
Begin
  FDataType := data;
End;//*****************************************************************************
//
//         函数:PostData
//         功能: 提交数据
//*****************************************************************************Procedure  TSendNetMessage.PostData;Begin
  Try
   // Self.GetIP;
    Self.GetData;
    FClient.Socket.SendBuf(FSendData,6);
  Except
    On  E: ESocketError  do
    SystemMessage(E.Message) ;
  End;
End;//*****************************************************************************
//
//         函数名: Destroy
//         功能  : 析构器
//*****************************************************************************
destructor TSendNetMessage.Destroy;
Begin
  Try
    newini.Free;   //释放ini文件
  Except
    On E : EIniFileException Do
      SystemMessage(E.Message);
  End;
  inherited Destroy;
End;//*****************************TSendNetMessage*******************************//只用看构造器部分,当我有服务器端时,就不会发生标题情况,现在要解决服务器没有开户的情况,请高手指教.

解决方案 »

  1.   

    我觉得可以是这一句的问题 
     While (Not Self.FClient.Active) Do
        Application.ProcessMessages;
      

  2.   

    改成:While (Not Self.FClient.Active) Do
    begin
        Application.ProcessMessages;
        Sleep(1);
    end;
      

  3.   

    发现
    While (Not Self.FClient.Active) Do
    begin
        Application.ProcessMessages;
        Sleep(1);
    end;加成这样后系统反而会报异常
      

  4.   

    而取消掉这一句后,这个类要平均两三次才能执行成功一次. 
    Self.Fclient.Active := True;这一句设置的成功率就这么低吗?
      

  5.   

    有没有办法可以测试到当前服务器ip是否为可用,就是说能ping得通,ping得通就一直active下去,ping 不通不放弃active
      

  6.   

    先进行500ms的Ping测试,若能Ping通,再调用Self.FClient.Open
      

  7.   

    若对方服务器屏蔽掉了ping命令呢?
      

  8.   

    楼上的应该问,若对方不允许SOCKET连接?
      

  9.   

    delphi哪个控件可以进行ping测试嘛?如果不进行ping测试,是不是就不能直接进行连接
      

  10.   

    说个大概思路
    在OnConnecting事件里定义一个Timer
    比方说每10秒去连接一次服务端,然后判断是否有返回数据
    若没有则先断开SOCKET,等待下一个10秒
    若楼主不知道怎么判断是否有返回数据..
    可以在OnRead事件里用一行代码把Timer关闭