谁能提供一个例子?谢谢

解决方案 »

  1.   

    什么意思?不太明白。我从网上看过一个从idtcpclient发送文件到idtcpserver的例子。我反过来写发现有些问题。。所以来请教
      

  2.   

    这里是client向server发送文件的代码。哪位朋友帮忙改一下。改成server向client发送文件。分不够可以加====客户端======unit uClient;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdTCPConnection, IdTCPClient, IdBaseComponent,
      IdComponent, IdTCPServer, ComCtrls, IdAntiFreezeBase, IdAntiFreeze;type
      TfmClient = class;
      TfmClient = class(TForm)
        IdTCPClient1: TIdTCPClient;
        Button1: TButton;
        OpenDialog1: TOpenDialog;
        ProgressBar1: TProgressBar;
        IdAntiFreeze1: TIdAntiFreeze;
        procedure Button1Click(Sender: TObject);
      private  public
        { Public declarations }
      end;var
      fmClient: TfmClient;implementation{$R *.dfm}{ TThreadData }procedure TfmClient.Button1Click(Sender: TObject);
    var
      Buf : array[0..1023] of Byte;
      ReadCount : Integer;
      aStream : TFileStream;
      aSize : Integer;
      aFileName : String;
    begin
      if OpenDialog1.Execute then
      begin
        IdTCPClient1.Connect;
        aStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
        try
          //发送文件名
          aFileName := ExtractFileName(OpenDialog1.FileName);
          IdTCPClient1.WriteLn(aFileName);
          //等待接受确认
          IdTCPClient1.ReadLn(#13#10, 1000);
          //写文件长度和文件流
          aSize := aStream.Size;
          ProgressBar1.Max := aSize;
          IdTCPClient1.WriteBuffer(aSize, 4);
          //IdTCPClient1.WriteStream(aStream);
          while aStream.Position < aStream.Size do
          begin
            if aStream.Size - aStream.Position >= SizeOf(Buf) then
              ReadCount := sizeOf(Buf)
            else
              ReadCount := aStream.Size - aStream.Position;
            aStream.ReadBuffer(Buf, ReadCount);
            IdTCPClient1.WriteBuffer(Buf, ReadCount);
            ProgressBar1.Position := aStream.Position;
            Application.ProcessMessages;
          end;
          Caption := IdTCPClient1.ReadLn;
          IdTCPClient1.Disconnect;
        finally
          aStream.Free;
        end;
      end;
    end;{ TMyThread }end.====服务器端====
    unit uServer;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdTCPConnection, IdTCPClient, IdBaseComponent,
      IdComponent, IdTCPServer, ComCtrls;type
      TDataState = (dstNone, dstReceiving);
      //Data对象用来保存一个连接的状态以及一些变量
      TThreadData = class
      private
        FState: TDataState;
        FFileSize: Integer;
        FStream: TFileStream;
        procedure SetState(const Value: TDataState);
        procedure SetFileSize(const Value: Integer);
        procedure SetStream(const Value: TFileStream);
      public
        constructor Create;
        destructor Destroy; override;
        property State : TDataState read FState write SetState;
        property FileSize : Integer read FFileSize write SetFileSize;
        property Stream : TFileStream read FStream write SetStream;
      end;
      TfmServer = class(TForm)
        IdTCPServer1: TIdTCPServer;
        SaveDialog1: TSaveDialog;
        ProgressBar1: TProgressBar;
        procedure IdTCPServer1Execute(AThread: TIdPeerThread);
        procedure IdTCPServer1Connect(AThread: TIdPeerThread);
        procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
      private  public
        { Public declarations }
      end;var
      fmServer: TfmServer;implementation{$R *.dfm}procedure TfmServer.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
      aFileSize : Integer;
      aFileName : String;
      Buff : array[0..1023] of Byte;
      ReadCount : Integer;
    begin
      with AThread.Data as TThreadData do
      begin
        if State = dstNone then
        begin
          if not AThread.Terminated and AThread.Connection.Connected then
          begin
            //读取文件名
            aFileName := AThread.Connection.ReadLn(#13#10, 100);
            if aFileName = '' then
              Exit;
            SaveDialog1.FileName := aFileName;
            if SaveDialog1.Execute then
            begin
              //返回确认文件传输标志
              AThread.Connection.WriteLn;
              //开始读取文件长度,创建文件
              AThread.Connection.ReadBuffer(aFileSize, 4);
              FileSize := aFileSize;
              ProgressBar1.Max := FileSize;
              Stream := TFileStream.Create(SaveDialog1.FileName, fmCreate);
              State := dstReceiving;
            end
            else
              AThread.Connection.Disconnect
          end;
        end else begin
          if not AThread.Terminated and AThread.Connection.Connected then
          begin
            //读取文件流
            repeat
              if FileSize - Stream.Size > SizeOf(Buff) then
                ReadCount := SizeOf(Buff)
              else
                ReadCount := FileSize - Stream.Size;
              AThread.Connection.ReadBuffer(Buff, ReadCount);
              Stream.WriteBuffer(Buff, ReadCount);
              ProgressBar1.Position := Stream.Size;
              Caption := IntToStr(Stream.Size) + '/' + IntToStr(FileSize);
              Application.ProcessMessages;
            until Stream.Size >= FileSize;
            AThread.Connection.WriteLn('OK');
            Stream.Free;
            Stream := nil;
            State := dstNone;
          end;
        end;
      end;
    end;{ TThreadData }constructor TThreadData.Create;
    begin
      inherited;
      Stream := nil;
    end;destructor TThreadData.Destroy;
    begin
      if Assigned(Stream) then
        Stream.Free;
      inherited;
    end;procedure TThreadData.SetFileSize(const Value: Integer);
    begin
      FFileSize := Value;
    end;procedure TThreadData.SetState(const Value: TDataState);
    begin
      FState := Value;
    end;procedure TfmServer.IdTCPServer1Connect(AThread: TIdPeerThread);
    begin
      AThread.Data := TThreadData.Create;
      with AThread.Data as TThreadData do
      begin
        State := dstNone;
      end;
    end;procedure TfmServer.IdTCPServer1Disconnect(AThread: TIdPeerThread);
    begin
      //(AThread.Data as TThreadData).Free;
    end;procedure TThreadData.SetStream(const Value: TFileStream);
    begin
      FStream := Value;
    end;end.