| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 | unit CorrespondClient;interfaceuses IdTCPClient, EnctyptClientData, Windows, SysUtils, Classes;type  TScCorrespondClient = class;  TThrds = class(TThread)  private    FCorrpdClient: TScCorrespondClient;  protected    procedure HandlerMessage; virtual;    procedure Execute; override;  public    constructor Create(CorrpdClient: TScCorrespondClient);  end;  TRecevieThrds = class(TThrds)  protected    procedure HandlerMessage; override;  end;  TSendThrds = class(TThrds)  protected    procedure HandlerMessage; override;  end;  TScCorrespondClient = class  private    FIP: string;    FUser: Integer;    FIdTcpClient: TIdTCPClient;    FEncryptData: TScEnryptClient;    FReceiveThrds: TRecevieThrds;    FSendThrds: TSendThrds;    function SendMessages(const AIP: string; AUser, AAction: Integer): Boolean;    procedure ReceiveMessages(var AText: string);    function CheckMessage(const MsgText: string): Boolean;    procedure DoOnDisconnect(Sender: TObject);  public    constructor Create;    destructor Destroy; override;    function ConnectServer(APort: Integer; const AIP: string): Boolean;    procedure CloseConnection;    procedure ResumeThrds;    function ReadDogData(AAddr, ABytes, AAction: Integer; Data: PByte): Boolean;    function QuestConnect(AAction: Integer): Boolean;    property IP: string read FIP write FIP;    property UserID: Integer read FUser write FUser;  end;implementationuses Forms, IdTCPConnection;{ TScCorrespondClient }function TScCorrespondClient.CheckMessage(const MsgText: string): Boolean;begin  if SameText(MsgText, 'SUCCESS') then    Result := True  else  begin    Result := False;    if SameText(MsgText, 'ISFULL') then      MessageBox(0, PChar('服务器已满,连接失败!'), PChar('提示'), MB_OK or MB_ICONERROR);  end;end;procedure TScCorrespondClient.CloseConnection;begin  FIdTcpClient.Disconnect;end;function TScCorrespondClient.ConnectServer(APort: Integer; const AIP: string): Boolean;begin  Result := True;  FIdTcpClient.Host := AIP;  FIdTcpClient.Port := APort;  FIdTcpClient.Disconnect;  try    FIdTcpClient.Connect(1000);  except    Result := False;    CloseConnection;  {  MessageBox(0, PChar('可能服务器没打开 或者 网线没插好 或者 您输入的端口号或IP不正确!'),      PChar('连接服务器失败'), MB_OK or MB_ICONINFORMATION);     }  end;end;constructor TScCorrespondClient.Create;begin  FIdTcpClient := TIdTCPClient.Create(nil);  FEncryptData := TScEnryptClient.Create;//FIdTcpClient.OnDisconnected := DoOnDisconnect;end;destructor TScCorrespondClient.Destroy;begin{  if FSendThrds <> nil then    FSendThrds.Terminate;  if FReceiveThrds <> nil then    FReceiveThrds.Terminate;  }  FreeAndNil(FIdTcpClient);  FEncryptData.Free;  inherited;end;procedure TScCorrespondClient.DoOnDisconnect(Sender: TObject);beginend;function TScCorrespondClient.QuestConnect(AAction: Integer): Boolean;var  sText: string;begin  Result := SendMessages(FIP, FUser, AAction);  if not Result then Exit;  if AAction <> 1 then  begin    ReceiveMessages(sText);    Result := CheckMessage(sText);  end;end;function TScCorrespondClient.ReadDogData(AAddr, ABytes, AAction: Integer;  Data: PByte): Boolean;var  b: Byte;  I, iValue: Integer;  sText: string;begin  Result := SendMessages(IntToStr(AAddr), ABytes, AAction);  if not Result then Exit;  if AAction <> 1 then  begin    ReceiveMessages(sText);    if SameText(sText, '') then Result := False    else    begin      if (AAddr = 0) and (ABytes = 0) then      begin        b := $FF;        iValue := StrToInt(sText);        for I := 1 to SizeOf(iValue) do        begin          Data^ := iValue and b;          iValue := iValue shr 8;          Inc(Data);        end;      end      else      begin//        SetLength(arrData, ABytes);//        Move(sText[1], arrData[0], ABytes);        for I := 1 to ABytes do        begin          Data^ := Ord(sText[I]);          Inc(Data);        end;      end;    end;  end;end;procedure TScCorrespondClient.ReceiveMessages(var AText: string);begin  if FIdTcpClient.Connected then  begin    try      AText := FIdTcpClient.ReadLn(#13#10, 1000, 100);      AText := FEncryptData.DeEncryptData(AText);    except      AText := '';    end;  end;end;procedure TScCorrespondClient.ResumeThrds;begin  FReceiveThrds := TRecevieThrds.Create(Self);  FSendThrds := TSendThrds.Create(Self);end;function TScCorrespondClient.SendMessages(const AIP: string; AUser, AAction: Integer): Boolean;var  sText: string;begin  Result := True;  if Assigned(FIdTcpClient) and FIdTcpClient.Connected then  begin    sText := FEncryptData.EncryptData(AIP, AUser, AAction);    try      FIdTcpClient.WriteLn(sText);    except      FIdTcpClient.Disconnect;            Result := False;    end;  end  else Result := False;end;{ TThrds }constructor TThrds.Create(CorrpdClient: TScCorrespondClient);begin  FCorrpdClient := CorrpdClient;  FreeOnTerminate := True;       inherited Create(False);end;procedure TThrds.Execute;begin  inherited;  HandlerMessage;end;procedure TThrds.HandlerMessage;beginend;{ TRecevieThrds }procedure TRecevieThrds.HandlerMessage;var  sText: string;begin  while True do  begin    try      if Self.Terminated then Break;      sText := FCorrpdClient.FIdTcpClient.ReadLn('', 1000, 100);      if Self.Terminated then Break;            sText := FCorrpdClient.FEncryptData.DeEncryptData(sText);      if not FCorrpdClient.CheckMessage(sText) then      begin        FCorrpdClient.CloseConnection;        Break;      end;    except          Break;    end;  end;end;{ TSendThrds }procedure TSendThrds.HandlerMessage;begin  while True do  begin    Sleep(10000);    if Self.Terminated then Break;    if not Assigned(FCorrpdClient) then Break;//    if not FCorrpdClient.SendMessages(9) then Break;  end; end;end.
 |