通过TServerSocket和TClientSocket能实现两个客户端之间的文件传输吗?我已经在客户端成功显示了在线用户列表,有HANDLE和IP信息。如果这两个控件不能传输文件,那该用什么控件呢?

解决方案 »

  1.   

    这两个也可以传的,把文件把包成流文件再传,你也可以用FPT来传。
      

  2.   

    可以传递,用SendBuffer,要先将文件分隔成一个个的包收到后在合并起来.
    得你好好研究一下了.网上有不少的例子.
      

  3.   

    ///给一个例子不过跟你说的不一样你可以看一下修改一下就好了////Client
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ScktComp;type
      TForm1 = class(TForm)
        cs: TClientSocket;
        Button1: TButton;
        Button2: TButton;
        lb: TListBox;
        sd: TSaveDialog;
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure csRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure Button1Click(Sender: TObject);
        procedure csConnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure csConnecting(Sender: TObject; Socket: TCustomWinSocket);
        procedure csDisconnect(Sender: TObject; Socket: TCustomWinSocket);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;  mysize:longint;
      mystream:Tmemorystream;
      strfilename:string;
    implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    begin
      if cs.Active then cs.Close;
        cs.Address:='192.168.18.184';
        cs.Port:=20000;
        cs.Open;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      mystream:=Tmemorystream.create;  //½¨Á¢ÄÚ´æÁ÷¶ÔÏó
      mysize:=0;                       //³õʼ»¯
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      mystream.free;
      if cs.active then
         cs.close;
    end;procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      mybuffer:array[0..10000]of byte;               //ÉèÖýÓÊÜ»º³åÇø
      myReceivelength:integer;
      s:string;begin
      if mysize=0 then
      begin
        s:=socket.ReceiveText;
        mysize:=strtoint(s);
        socket.SendText('ready');
      end
      else
      begin
        myReceivelength:=socket.ReceiveLength;
        socket.ReceiveBuf(mybuffer,myReceivelength);
        lb.Items.Add('Receive buffer:'+ inttostr(myReceivelength)+' K');
        mystream.Write(mybuffer,myReceivelength);
        if mystream.Size >= mysize then
        begin
          lb.Items.Add('send over !');
          mystream.Position:=0;
          mystream.SaveToFile(strfilename);
          mystream.Clear;
          mysize:=0;
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      sd.Execute;
      strfilename:=sd.FileName;
      cs.socket.sendtext('FT');          //·¢ËÍÖ¸Áî֪ͨ·þÎñÆ÷¶Ë´«ÊäÎļþ
    end;procedure TForm1.csConnect(Sender: TObject; Socket: TCustomWinSocket);
    begin
      //showmessage('connection success!');
      lb.Items.Add('connection success!');
    end;procedure TForm1.csConnecting(Sender: TObject; Socket: TCustomWinSocket);
    begin
      lb.Items.Add('connectint...');
    end;procedure TForm1.csDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    begin
      lb.Items.Add('connect is over ');
    end;end.
    ////server
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp, StdCtrls;type
      TForm1 = class(TForm)
        ss: TServerSocket;
        op: TOpenDialog;
        Button1: TButton;
        Label1: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;  mysize:longint;
      mystream:Tmemorystream;
      strfilename:string;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      if not ss.Active then
      begin
        mystream:=Tmemorystream.Create;
        mystream.Position:=0;
        ss.Port:=20000;
        ss.Open;
      end;
    end;procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      strReceive:string;
    begin
      strReceive:=socket.ReceiveText;
      if (strReceive='FT') then
      begin
        socket.SendText(inttostr(mysize));  //·¢ËÍÎļþµÄ´óС¹ýÈ¥
      end
      else if (strReceive='ready') then
      begin
        socket.SendStream(mystream);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      if not op.Execute then
      begin
        op.Execute;
        Op.Filter := 'Text files (*.txt)|*.txt';
        strfilename:=op.FileName;
        mystream.LoadFromFile(strfilename);
        mysize:=mystream.Size;
        label1.Caption:='file size is ' + inttostr(mysize) + ' k';
      end;
    end;end.
      

  4.   

    我要的是客户端与客户端之间的文件传输============================这个可能我也不会,要是我做我要通过一个server
      

  5.   

    如果是通过server,那是不是要先在server端保存该文件,然后在通过同样的方法传送保存的文件?还是server端不用保存就直接转发给另一个客户端?
      

  6.   

    我要的是客户端与客户端之间的文件传输 
    ===============
    这个不一定能实现,就算是使用的UDP协议也未必能实现。如果是通过server,那是不是要先在server端保存该文件,然后在通过同样的方法传送保存的文件?还是server端不用保存就直接转发给另一个客户端?
    ===============
    不需要保存。就好比我和你之间有另外一个人直接传话一样,你说一句是什么内容,中间人就给我按原话传达,即可。
      

  7.   

    to unsigned:
    不需要保存。就好比我和你之间有另外一个人直接传话一样,你说一句是什么内容,中间人就给我按原话传达,即可。
    ======================================================================
    你说的是不是通过 TServerSocket和TClientSocket 就能实现?