我想在在delphi下实现文件传输,不想用ftp等,
想用indy中的idtcpclient与idtcpserver实现。
我的实际难题为怎么把一个字符串与一个文件打包一起传送给另一个端???

解决方案 »

  1.   

    用idtcpclient和idtcpserver的sendstream就可以了,你把要发送的文件和字符串打包在 某个流里就可以了,
      

  2.   

    ...send a file from a TServerSocket to a TClientSocket?  unit Unit1; interface uses 
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
      Dialogs, ScktComp, StdCtrls; type 
      TForm1 = class(TForm) 
        ClientSocket1: TClientSocket; 
        ServerSocket1: TServerSocket; 
        btnTestSockets: TButton; 
        procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); 
        procedure FormCreate(Sender: TObject); 
        procedure FormDestroy(Sender: TObject); 
        procedure ClientSocket1Disconnect(Sender: TObject; 
          Socket: TCustomWinSocket); 
        procedure ClientSocket1Connect(Sender: TObject; 
          Socket: TCustomWinSocket); 
        procedure ServerSocket1ClientConnect(Sender: TObject; 
          Socket: TCustomWinSocket); 
        procedure btnTestSocketsClick(Sender: TObject); 
      private 
        FStream: TFileStream; 
        { Private-Deklarationen } 
      public 
        { Public-Deklarationen } 
      end; var 
      Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ClientSocket1Read(Sender: TObject; 
      Socket: TCustomWinSocket); 
    var 
      iLen: Integer; 
      Bfr: Pointer; 
    begin 
      iLen := Socket.ReceiveLength; 
      GetMem(Bfr, iLen); 
      try 
        Socket.ReceiveBuf(Bfr^, iLen); 
        FStream.Write(Bfr^, iLen); 
      finally 
        FreeMem(Bfr); 
      end; 
    end; procedure TForm1.FormCreate(Sender: TObject); 
    begin 
      FStream := nil; 
    end; procedure TForm1.FormDestroy(Sender: TObject); 
    begin 
      if Assigned(FStream) then 
      begin 
        FStream.Free; 
        FStream := nil; 
      end; 
    end; procedure TForm1.ClientSocket1Disconnect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    begin 
      if Assigned(FStream) then 
      begin 
        FStream.Free; 
        FStream := nil; 
      end; 
    end; procedure TForm1.ClientSocket1Connect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    begin 
      FStream := TFileStream.Create('c:\temp\test.stream.html', fmCreate or fmShareDenyWrite); 
    end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    begin 
      Socket.SendStream(TFileStream.Create('c:\temp\test.html', fmOpenRead or fmShareDenyWrite)); 
    end; procedure TForm1.btnTestSocketsClick(Sender: TObject); 
    begin 
      ServerSocket1.Active := True; 
      ClientSocket1.Active := True; 
    end; end.
      

  3.   

    感谢以上mbzdh与aiirii两位兄弟!
    我刚入门不久,看了以上回复,还不能解决,请再多多赐教!
    比方以下数据结构在:
    type data=record
       id:smallint;
       mess:string[80];
       filename:string[40];//里面存放的为要交换的文件名(包括路径)
     end;
    帮忙写一个打包发送与接收分解的过程。
    我会尽快结贴!先谢为敬!!!
      

  4.   

    请各位帮手看看以下代码哪里有问题(导致连接中断)?function send_data(data_send:in_data):boolean;
    var
      this_connect:connect;
      stream:TMemoryStream;
      fs:tfilestream;
    begin
      this_connect:=find_id(data_send.con_id);  
      if this_connect.thread_id>0 then
      begin
    {
     type
     data_record=record
       con_code:smallint;//操作码
       con_id:integer;//发送目的id号
       mess_len:integer;//消息长度
       file_size:int64;//文件长度
       name_size:smallint;//文件名的长度
       filename:string;//文件名
       mess:string;//消息体,文本格式
     end;
    }
        stream:=TMemoryStream.Create;
        stream.WriteBuffer(data_send.con_code,sizeof(data_send.con_code));
        stream.WriteBuffer(data_send.con_id,sizeof(data_send.con_id));    data_send.mess_len:=length(data_send.mess);
        stream.WriteBuffer(data_send.mess_len,sizeof(data_send.mess_len));
        stream.WriteBuffer(data_send.mess[1],data_send.mess_len);    if fileexists(data_send.filename) then
        begin
          data_send.name_size:=length(data_send.filename);
          fs:=tfilestream.Create(data_send.filename,fmopenread);
          data_send.file_size:=fs.Size;      stream.WriteBuffer(data_send.file_size,sizeof(data_send.file_size));//发送文件大小
          stream.WriteBuffer(data_send.name_size,sizeof(data_send.name_size));//发送文件名大小
          stream.WriteBuffer(data_send.filename[1],data_send.name_size);//发送文件名
          stream.WriteBuffer(fs,data_send.file_size);//发送文件体
          fs.Free;
        end
        else
        begin
          data_send.file_size:=0;
          stream.WriteBuffer(data_send.file_size,sizeof(data_send.file_size));//发送文件大小0
        end;    this_connect.objects.Connection.WriteStream(stream,true,true);
        stream.Free;
        result:=true;
      end
      else
        result:=false;
    end;
      

  5.   

    REC_SIZE = SizeOf(data_record);
    stream.WriteBuffer(data_send, REC_SIZE);(注:一個数据结构record、一斉装入如何?)
      

  6.   

    cronuz(cronuz):
    文件不能一齐装入传送的!