sendtxt?
sendbuf?
sendstream?

解决方案 »

  1.   

    用TFileStream读出文件,再用SendStream吧
      

  2.   

    非常感谢dragonki(dragonki)兄的回答:
    接收端如何做呢?我是个新手,还望指教。
      

  3.   

    我觉得sendbuf不错,但是一定要自己写协议,不然发送比较大的文件就会出错
    客户端就用receivebuf就行了
      

  4.   

    服务器
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ScktComp, Buttons, StdCtrls;type
      TFilePack=packed record
         flag:char;
         data:array [0..2042] of byte;
         size:integer;
      end;
      TForm1 = class(TForm)
        ServerSocket1: TServerSocket;
        SpeedButton1: TSpeedButton;
        SpeedButton2: TSpeedButton;
        Memo1: TMemo;
        procedure senddata;
        procedure SpeedButton1Click(Sender: TObject);
        procedure SpeedButton2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.senddata;
    var
      ms:TMemoryStream;
      packet:TFilePack;
      isendlen,i,Position,len:integer;begin
      ms:=TmemoryStream.Create;
      ms.LoadFromFile('D:\Project1.exe');
      len:=ms.Size-ms.Position;
      while len>0 do
      begin
        fillchar(Packet,Sizeof(TFilepack),0);    if len>2043 then
        begin
           packet.size:= 2044;
           packet.flag:='d';
        end
        else begin
           packet.size:=len;
           packet.flag:='e';
        end;    ms.Read(packet.data,packet.size);
        for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
          isendlen:=serversocket1.Socket.Connections[i].SendBuf(packet,sizeof(TFilePack));
            memo1.Lines.Add(inttostr(isendlen));
        len:=ms.Size-ms.Position;
      end;
    end;procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
      senddata;
    end;procedure TForm1.SpeedButton2Click(Sender: TObject);
    begin
      serversocket1.Active:=true;
    end;end.
      

  5.   

    客户端
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Buttons, ScktComp, StdCtrls, Db, ADODB;type
      TFilePack=packed record
         flag:char;
         data:array [0..2042] of byte;
         size:integer;
      end;
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        SpeedButton1: TSpeedButton;
        SpeedButton2: TSpeedButton;
        Memo1: TMemo;
        SpeedButton3: TSpeedButton;
        ADODataSet1: TADODataSet;
        procedure FormCreate(Sender: TObject);
        procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
        procedure SpeedButton3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    var
      ms:Tmemorystream;{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
      ClientSocket1.Active:=true;
      ms:=Tmemorystream.Create;
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      buf:array [0..1024000] of byte;
      packet:Tfilepack;
      PacketLen ,i,ReceiveLen:integer;
    begin  PacketLen := SizeOf(TFilepack);
      ReceiveLen := Socket.ReceiveLength;
      memo1.Lines.Add(inttostr(ReceiveLen));
      if (ReceiveLen mod PacketLen) <> 0 then
        Exit;
      Socket.ReceiveBuf(Buf, ReceiveLen);
      for i := 0 to ReceiveLen div SizeOf(TFilepack) - 1 do
      begin
        Move(Buf, packet, PacketLen);
    //    memo1.Lines.Add('rec '+inttostr(Socket.SocketHandle));
        case packet.flag of
          'd':  ms.Write(packet.data,packet.size);
          'e':  begin
                  ms.Write(packet,packet.size);
                  ms.SaveToFile('e:\11.exe');
                 // ms.SetSize(0);
              end;
          else
            ;
          end;
        //socket.SendBuf(sendtxt,sizeof(TsendTxt));
        Move(Buf[PacketLen], Buf, ReceiveLen - (i + 1) * PacketLen);
      end;end;procedure TForm1.SpeedButton3Click(Sender: TObject);
    begin
      ms.SaveToFile('e:\122.exe');
       adodataset1.State
    end;end.
      

  6.   

    用modem对拨后共享出子目录,指教用
    CopyFile('\\计算机名\共享目录名\子目录\..., ...)反而比NmStrm快
      

  7.   

    请问局域网拷贝用的是什么协议,怎么会比TCP/IP还快?
      

  8.   

    sendtxt
    sendbuf
    sendstream
    到底有什么区别?
      

  9.   

    to flyingfly(flyingfly)
    用NmStrm和NMStrmServ 发送比较大的文件就会出错