分享

(死亡历程)Delphi7 自带的控件 IdTCPClient,IdTCPServer 客户端发送给服务端,服务端转发给其它客户端

 容心居 2021-05-02

客户端

  private

    { Private declarations }

    FThread: TThread;

  public

    { Public declarations }

    iFileHandle:integer;

    i: integer;

    host,port,qm:string;

    sFile:TFileStream;

    F : Textfile;

    str,nbzy_bh:string;

  end;

  TReadThread = class(TThread)

  private

    FClient: TIdTCPClient;

    FMessage,nbzy_qm: string;

    FForm: TFormLjf2;

    procedure UpdateForm;

  protected

    procedure Execute; override;

  public

    constructor Create(AForm: TFormLjf2; qm: string; AClient: TIdTCPClient);

  end;

var

  FormLjf2: TFormLjf2;

implementation

uses ljf999;

{$R *.dfm}

procedure TFormLjf2.FormShow(Sender: TObject);

var

  i,j:Integer;

begin

  //得到要发送的客户端IP

  i:=pos(')',Self.Caption); //查找分隔符

  host:=copy(Self.Caption,i+1,Length(Self.Caption)-i);

  //连接到服务器

  IdTCPClient2.Host:=FormLjf999.host;

  IdTCPClient2.Port:=StrToInt(FormLjf999.port);

  //得到用户编号

  str:=Self.Caption;

  i:=pos('(',str);

  j:=pos(')',str);

  nbzy_bh:=copy(str,i+1,j-(i+1));

  qm:=copy(str,1,i-1);;

  Memo1.SetFocus;

  //这里是线程,2个参数,一个是窗口,一个是接收信息的IdTCPClient 2017-1-5

  FThread := TReadThread.Create(Self, qm, IdTCPClient2);

end;

procedure TFormLjf2.SpeedButton1Click(Sender: TObject);

var

  Tid: DWord;

begin

  if Memo1.Text='' then

  begin

    ShowMessage('请输入内容');

    Memo1.SetFocus;

    Exit;

  end;

  if not IdTCPClient2.Connected then

  begin

    ShowMessage('连接未建立。');

    exit;

  end;

  IdTCPClient2.WriteLn(host+'-'+Memo1.Text); 

  Memo2.Lines.Add('我 '+DateTimeToStr(Now)+ #13#10 +' '+Memo1.Text);

  PostMessage(Memo2.Handle, WM_VSCROLL, SB_BOTTOM, 0);

  Memo1.Text:='';

  //Backspace键

  keybd_event(8,0,0,0);

  keybd_event(8,0,KEYEVENTF_KEYUP,0);

end;

procedure TFormLjf2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

  OutputDebugString('notify thead to quit.');

  FThread.Terminate;

  OutputDebugString('wait thead finish.');

  //FThread.WaitFor;

  OutputDebugString(PChar('thread finished.'));

  if IdTCPClient2.Connected then

  begin

    IdTCPClient2.Disconnect;

  end;

end;

procedure TFormLjf2.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  //Action := caFree;

  Self.Free;

end;

{ TReadThread }

constructor TReadThread.Create(AForm: TFormLjf2; qm: string; AClient: TIdTCPClient);

begin

  FClient := AClient;

  FForm := AForm;

  nbzy_qm := qm;

  FreeOnTerminate := True;

  inherited Create(False);

end;

procedure TReadThread.Execute;

begin

  inherited;

  while not Terminated do

  begin

    if Terminated then

    begin

      Break;

    end;

    if not FClient.Connected then

    begin

      try

        FClient.Connect(100);

      except

      end;

      if not FClient.Connected then

      begin

        Sleep(100);

        continue;

      end;

    end;

    FMessage := FClient.ReadLn(#$D, 1);

    if Length(FMessage) > 0 then

      Synchronize(UpdateForm);

  end;

  if FClient.Connected then

    FClient.Disconnect;

end;

procedure TReadThread.UpdateForm;

begin

  FForm.Memo2.Lines.Add(nbzy_qm+' '+DateTimeToStr(Now));

  FForm.Memo2.Lines.Add(' '+FMessage);

end;

end.

服务端接收并转发

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);

var

  rbyte:array[0..4096] of byte;

  sFile:TFileStream;

  cmd,FileSize:integer;

  str,FileName:string;

  iFileHandle:integer;

  iFileLen,cnt:integer;

  buf:array[0..4096] of byte;

  ip,fileqm,sendStr:string;

  i,j:integer;

  sm:TStringStream;

  msize:Integer;

begin

  //while AThread.Connection.Connected do  //注意这里

  with AThread.Connection do

  begin

      Try

        str:=AThread.Connection.ReadLn;   //接收文件大小及文件名

        if POS('|',str)>0 then

        begin

          //

        end

        else

        begin

            i:=pos('-',str); //查找分隔符

            ip:=copy(str,1,i-1); //提取文件名

            sendStr:=copy(str,i+1,Length(str)-i);

            IdTCPServer1.Threads.UnlockList;

            with IdTCPServer1.Threads.LockList do

            begin

              try

                for i:=0 to Count - 1 do

                begin

                  try

                    AThread := Items[i];

                    if AThread.Connection.Socket.Binding.PeerIP = ip then

                    begin

                      AThread.Connection.WriteLn(sendStr);//这里是服务端发送给客户端的

                    end;

                  except

                    AThread.Stop;

                  end;

                end;

              finally

                IdTCPServer1.Threads.UnlockList;

              end;

            end;

        end;

      Finally

        //Athread.Connection.Disconnect;

        //AThread.Connection.WriteBuffer('错误',SizeOf('错误'),True);

      end;

  end;

end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);//客户端退出触发 IdTCPServer1Disconnect

begin

  Memo1.Lines.Add(AThread.Connection.Socket.Binding.PeerIP+' 已退出');

  try

    IdTCPServer1.Threads.LockList.Remove(Athread);

  finally

    IdTCPServer1.Threads.UnlockList();

  end;

  //AThread.Connection.Disconnect;

end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);

var

  strSql,qm,bh,str:string;

  i:Integer;

begin

  Memo1.Lines.Add(qm+' '+AThread.Connection.Socket.Binding.PeerIP+' 已连接');

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

  IdTCPServer1.Active:=False;

   Application.Terminate;

end;

procedure TForm1.IdTCPServer1Exception(AThread: TIdPeerThread;

  AException: Exception);

begin

  Memo1.Lines.Add('客户端'+inttostr(athread.handle)+'异常断开');

  del(AThread);

  if AThread.Connection.Connected then

  AThread.Connection.Disconnect;

end;

————————————————

版权声明:本文为CSDN博主「luojianfeng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/luojianfeng/article/details/54097231

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多