用IdTCPClient来发送?那么接收数据呢?

解决方案 »

  1.   

    用IdTCPServer来接收数据啊,有个excute事件,在那里readln即可啊
      

  2.   

    用tcp组件的话,想对不同的服务器发送消息,变更一次,就得重新建立连接一次;不如用udp,开销小一些。
      

  3.   

    请教楼主:
    IdTCPClient怎样发送消息的?能不能把代码发出来看看?
      

  4.   

    //这是服务器端的
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls,Math;type
      TForm1 = class(TForm)
        Button1: TButton;
        IdTCPServer1: TIdTCPServer;
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure IdTCPServer1Execute(AThread: TIdPeerThread);
      private
      aFileStream:tFileStream;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin
      AFileStream := TFileStream.Create('c:\aa.xml', fmOpenRead);
      IdTCPServer1.DefaultPort :=2222;
      if not IdTCPServer1.Active then IdTCPServer1.Active := True;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      //AFileStream.Free;
      IdTCPServer1.Active := False;
    end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
      cmd: string; //接收到客户端的字符串信息
      ASize: Integer; //需要传输的流大小
    begin
      with AThread.Connection do //已经连街上的一个进程
      begin
        cmd := UpperCase(ReadLn); //客户端发送的命令字符串
        if cmd = 'BEGIN' then //开始传输
        begin
          //告诉远程传输文件的大小和文件名
          WriteLn(Format('%d|%s', [AFileStream.Size, 'aa.xml']));
          //StatusBar1.SimpleText := '准备传输...';
          Exit;
        end;
        if cmd = 'END' then
        begin //传输完成
          //Button3.Click;
          //StatusBar1.SimpleText := '传输完成...';
          AFileStream.Free;
          Exit;
        end;
        if cmd = 'CANCEL' then
        begin //传输取消
          //StatusBar1.SimpleText := '传输取消...';
          //保持传输状态
          Exit;
        end;
        //按照指定位置传输文件
        AFileStream.Seek(StrToInT(cmd), soFromBeginning); //转到文件流传输的位置
        ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);
        //计算需要发送的大小,Min()函数在Math单元
        OpenWriteBuffer; //准备发送缓冲
        WriteStream(AFileStream, false, false, ASize);
        //注意这个函数的参数。
        CloseWriteBuffer; //结束发送缓冲
        //StatusBar1.SimpleText := Format('当前传输位置%s/大小%d', [cmd, AFileStream.Size]);
        //ProgressBar1.Position := ProgressBar1.Position + ASize;
      end;
    end;end.
      

  5.   

    //这是客户端的,他们要相互配合才行。当然也有别的方法
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      StdCtrls,math;type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        IdTCPClient1: TIdTCPClient;
        Button2: TButton;
        Edit1: TEdit;
        function getF(sFilePath,sIP:string;iPort:Integer):integer;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    function TransListen(H:THandle;sFileName:String):integer;cdecl;external'Project1.dll';
    {$R *.dfm}function TForm1.getF(sFilePath, sIP: string; iPort: Integer): integer;
    var
      IdTCPClient2: TIdTCPClient;
      cmd: string;
      ASize, TotalSize: Int64;
      AFileStream: TFileStream;
    begin
      IdTCPClient2:=TIdTCPClient.Create(application);
      IdTCPClient2.Host:=sIP;
      IdTCPClient2.Port:=iPort;
      try
       IdTCPClient2.Connect(2000);
      except
        showmessage('网络不通。');
        result:=0;
        exit;
      end; try
      try
        IdTCPClient2.WriteLn('BEGIN'); //提示服务器开始接收
        cmd := IdTCPClient2.ReadLn;
        //以“|”符号分离文件名
        //SaveDialog1.FileName := Copy(cmd, Pos('|', cmd) + 1, Length(cmd));    TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1)); //分离文件大小
        //建立文件流准备接收
        AFileStream := TFileStream.Create('d:\bb.xml', fmCreate);
        try //循环开始接受
          repeat
            IdTCPClient2.WriteLn(IntToStr(AFileStream.Size));//发送当前传输的位置
            ASize := Min(TotalSize - AFileStream.Size, IdTCPClient2.RecvBufferSize);
            //选择剩余大小和缓冲区大小小的一个作为传输的大小
            IdTCPClient2.ReadStream(AFileStream, ASize); //接收流
            //StatusBar1.SimpleText := Format('当前传输位置%d/大小%d', [AFileStream.Size, TotalSize]);
            Application.ProcessMessages;
          until AFileStream.Size = TotalSize; //大小一致了表示结束
        finally
          AFileStream.Free; //释放文件流
        end;
        IdTCPClient2.WriteLn('END'); //提示服务器传输完成
        //StatusBar1.SimpleText := '传输完成...';
        result:=1;
      except
        //StatusBar1.SimpleText := '连接服务器失败或者对方已经中断传输!';
        result:=0;
      end;
     finally
        IdTCPClient2.Disconnect;
        IdTCPClient2.Free;
     end;
     //result:=1;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
       showmessage(inttostr(getF('aa','192.168.0.67',2222)));
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      TransListen(application.Handle,edit1.Text);
    end;end.