unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ScktComp, StdCtrls;type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  myreadfile,mywritefile:tfilestream;
  serversend,cliendaccept:boolean;
implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
begin
    serversocket1.Active:=true;
    clientsocket1.Active:=true;
    myreadfile:=tfilestream.Create('d:\aaa.txt',fmOpenRead);
    serversend:=false;
    cliendaccept:=false;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
   clientsocket1.Socket.Sendtext('givemefile');
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var i:integer;
begin
   mywritefile:=tfilestream.Create('d:\basd.txt',fmcreate);
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
    if not serversend then
    begin
       if (socket.ReceiveLength<>10) or (socket.ReceiveText<>'givemefile') then
          exit
       else begin
           serversend:=true;
           socket.SendStream(myreadfile);
           serversend:=false;
       end;
    end;
end;end.
窗体中有一个按钮和serversocket1   clientsocket1
这里只是简单的实现了.

解决方案 »

  1.   

    如果文件太大的话,需要分割开传.
    serversocket一次传一部分,clientsocket收到文件后追加,
    然后发读下一部分的请求,serversocket再发下一部分.
      

  2.   

    多谢xzisgood(夏)的代码,同时祝saoren找个工作。
      

  3.   

    谢谢xzisgood
    我需要的是要两个程序Server端在A机,Client端在B机,而且传送的文件不是*.txt,是任何文件。要Server端用ServerSocket,Client端用ClientSocket.之间的文件传送。
    有点像下载东西一样了。
      

  4.   

    虽然这是一个程序,但是可以很方便的分成两个程序.这里主要在clientsocket的onread和serversocket的onclientread事件编程.只要把serversocket和clientsocket放在两个程序,就实现了远程通讯.另外我用的是Tfilestream.他可以打开别的文件,不是非要txt文件.
    myreadfile:=tfilestream.Create('d:\aaa.exe',fmOpenRead);这样就打开exe 文件了.你可以试试看.
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ScktComp, StdCtrls;type
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        ServerSocket1: TServerSocket;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
        procedure ServerSocket1ClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      myreadfile,mywritefile:tfilestream;
    implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
        serversocket1.Active:=true;
        clientsocket1.Active:=true;
        myreadfile:=tfilestream.Create('d:\aaa.exe',fmOpenRead);end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      mywritefile:=tfilestream.Create('d:\basd.abc',fmcreate);
      clientsocket1.Socket.Sendtext('givemefile');
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var  buffer:array[1..1000] of byte;  len:integer;
    begin
       len:=socket.ReceiveLength;
       if len>500 then
       begin
          mywritefile.Free;
          showmessage('file send over!');
          exit;
       end;
       socket.ReceiveBuf(buffer,len);
       mywritefile.Write(buffer,len);
       socket.SendText('continue');
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var  buffer:array[1..1000] of byte;  len:integer;
    begin
        if socket.ReceiveText<>'givemefile' then
        begin
            len:=myreadfile.Read(buffer,500);
            if len=0 then
            begin
                socket.SendBuf(buffer,501);
            end;
            socket.SendBuf(buffer,len);
        end
        else begin
            len:=myreadfile.Read(buffer,500);
            socket.SendBuf(buffer,len);
        end;
    end;end.
    刚才的程序有问题,下面的程序我测试过了,没有问题.