只通过SOCKET控件传送文件的源代码。客户端与服务端都要。要求:
1、支持大文件比如2M以上的。
2、支持非文本格式。

解决方案 »

  1.   

    支持你 转贴:
    用流方式最简单   而且错误率很低很低    发送端先给接收端发个消息  令其准备接收文件
    然后发送端再发送文件
    发送端
     testream:=tfilestream.Create(path1,fmOpenRead); //初始化流tempstream,在用sendstream(m1)发送流后,
    //它将保留到socket对话结束,
    //不用手工free掉
    testream.Position:=0;
    Socket.SendStream(testream); //发送文件
    接收端
    procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
    leng          : integer;
    name_a,name_b :integer;
    temp          : string;
    zip_source    : tmemorystream;
    zip_dest      : tmemorystream;
    begin
    leng:=client.socket.ReceiveLength(); //读出包长度******此句为公共用代码
    leng:=client.Socket.ReceiveBuf(buffer,leng); //接收数据包并读入缓冲区内
    if rece_file=true then   //  依靠发送端提前发送的消息定义其值  如果“是“ 则接收文件
       begin
       m.Write(buffer,leng); //追加入流M中
       countfile_size:=countfile_size+leng;
      //temp:=s2c_filesize;
         if m.Size>=s2c_filesize then //如果流长度大于需接收的字节数,则接收完毕
          begin
          rece_file:=false;
          m.Position:=0;        try
               s2cstream:=TFileStream.Create(s2c_filename,fmCreate);
               s2cstream.copyfrom(m,m.size)
            finally
               s2cstream.free;
               m.free        end;      end;
       end
      

  2.   

    有源码的话一定要发一个给我呀,
    [email protected]
    谢谢!
      

  3.   

    m是TMemoryStream类型的吗?
    向m中增加内容是不是只要把m.postion指向流末尾就能实现?
    我也是这么写的,文件大了以的好象只能保存m为字节。
      

  4.   

    还有就是直接用m.savetofile(filename)不行吗?为何还要做Tfrilstream.copyfrom(m,m.size)?
      

  5.   

    Indy的组件就可以了
    TCP的当然编译一个FTP也很Easy的
    不要说是2M,就是20G都OK的,还支持断点续传的呢
      

  6.   

    有代码的话我也要。
    [email protected]
    谢谢!!!!!!
      

  7.   

    也给我一份吧,[email protected]
    谢谢了,现在真在学习这个方面,谢谢大虾门指点了
      

  8.   

    //服务端
    //ServerSocket1的port属性设置为1234
    //                 activie:True
    //servertype  :    stNonBlocking
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, StdCtrls, ScktComp;type
      TForm1 = class(TForm)
        Button2: TButton;
        Memo1: TMemo;
        ProgressBar1: TProgressBar;
        ServerSocket1: TServerSocket;
        procedure Button2Click(Sender: TObject);
         procedure ServerSocket1ClientConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocket1ClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocket1ClientDisconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocket1ClientError(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      Sendf: boolean;
      filename:String;
      filesize:integer;
      recfile: TFileStream;
      ReadCount : integer;
    implementation{$R *.DFM}
    procedure TForm1.Button2Click(Sender: TObject);
    begin  if ServerSocket1.Active then
        ServerSocket1.Active:= False;
      application.Terminate;  
    end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
     socket.SendText('连接成功...');end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      recStr: String;
      Buffer : pointer;
      nRetr : integer;
    const
      bufferSize = 1024 ;begin
      if not sendf then
      begin
      RecStr:= socket.ReceiveText;
      memo1.Lines.add(recstr);
      end;
      if Pos('提交文件名', RecStr)>0 then
      begin
        delete(RecStr, 1, length('提交文件名: '));
        filename:='c:\'+RecStr;
        socket.SendText('成功收到文件名');
      end;  if Pos('提交文件大小', RecStr)>0 then
      begin
        delete(RecStr, 1, length('提交文件大小: '));
        fileSize:=StrToIntDef(RecStr,0);
        if FileExists(Filename) then Deletefile(filename);
        recfile :=TFileStream.Create(filename,fmCreate or fmShareDenyNone);
        if recfile<>nil then
        begin
          recfile.Free;
          recfile:= nil;
        end;
        socket.SendText('成功收到文件大小');
      end;  if sendf then
      begin
        GetMem(Buffer,BufferSize);
        nRetr := Socket.ReceiveBuf(Buffer^,BufferSize);
        inc(readcount, nretr);
        ProgressBar1.Position:= Round(readcount/filesize*100);
        Application.ProcessMessages;    if FIleExists(filename) then
        begin
          recfile :=TFileStream.Create(filename,fmOpenWrite or fmShareDenyNone);
          recfile.Seek(0,soFromEnd);
        end;
        recfile.write(Buffer^,nRetr);
        FreeMem(Buffer);
        recfile.Free;
        recfile:= nil;    if readcount=filesize then
        begin
         memo1.Lines.add('成功接收文件');
         socket.SendText('成功接收文件');
         recfile.Free;
         recfile:=nil;
         sendf:=false;
        end
        else socket.SendText('继续发送');
      end;  if Pos('开始发送文件', RecStr)>0 then
      begin
         socket.SendText('可以发送');
         ReadCount:=0;
         sendf:=true;
      end; 
    end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
     showmessage('客户已停止链接');
    end;procedure TForm1.ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
     showmessage('客户已出错');
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       serversocket1.Close;
    end;end.
      

  9.   

    //客户端
    // edit3中是文件的名
    //edit1是服务端的IP
    //edit2是 端口 1234
    //ClientSocket1的clienttype 为ctNonBlockingunit client;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ScktComp;type
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        OpenDialog1: TOpenDialog;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Memo1: TMemo;
        ProgressBar2: TProgressBar;
        Edit3: TEdit;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure ClientSocket1Connecting(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
        function  getfilename(str1:string):string;
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  type
      FileInf=Record
        name: String;         //&Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;
        Size: Integer;        //&Icirc;&Auml;&frac14;&thorn;&acute;ó&ETH;&iexcl;
        sfile: TFileStream;   //&Icirc;&Auml;&frac14;&thorn;
      end;
    var
      Form1: TForm1;
      mem: fileinf;
      posi, len: Integer;
    implementation{$R *.DFM}procedure TForm1.Button3Click(Sender: TObject);
    begin
      if ClientSocket1.Active then
        ClientSocket1.Active:=false;
      application.Terminate;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if ClientSocket1.active then clientsocket1.Active:=false;
      ClientSocket1.Host:= edit1.Text;
      ClientSocket1.Port:= StrToInt(edit2.Text);
      clientsocket1.active:=true;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Opendialog1.Execute then
      begin
        edit3.Text:= Opendialog1.FileName;
        mem.name:= getfilename(Opendialog1.FileName);
      end;
    end;procedure TForm1.ClientSocket1Connecting(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
          Memo1.lines.Add('C: &Otilde;&yacute;&Ocirc;&Uacute;&Aacute;&acute;&frac12;&Oacute;...');
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      p: Array[0..1023] of byte;
      RecStr: String;
    begin
      RecStr:= ClientSocket1.Socket.ReceiveText;
    //  Memo1.Lines.Add('S: '+RecStr);
      if Pos('&Aacute;&not;&frac12;&Oacute;&sup3;&Eacute;&sup1;&brvbar;', RecStr)> 0 then
      begin
        Memo1.Lines.Add('&Aacute;&not;&frac12;&Oacute;&sup3;&Eacute;&sup1;&brvbar;');
        Memo1.Lines.Add('C: &Igrave;á&frac12;&raquo;&Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;');
        ClientSocket1.Socket.SendText('&Igrave;á&frac12;&raquo;&Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;: '+mem.name);
      end;  if Pos('&sup3;&Eacute;&sup1;&brvbar;&Ecirc;&Otilde;&micro;&frac12;&Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;', RecStr)> 0 then
      begin
         posi:=0;
         len:=0;
         Try
           mem.sfile:= TFileStream.Create(mem.name, fmOpenRead);
           mem.Size:= mem.sfile.Size;
           Posi:= 0;
           Memo1.Lines.Add('C: &Igrave;á&frac12;&raquo;&Icirc;&Auml;&frac14;&thorn;&acute;ó&ETH;&iexcl;');
           ClientSocket1.Socket.SendText('&Igrave;á&frac12;&raquo;&Icirc;&Auml;&frac14;&thorn;&acute;ó&ETH;&iexcl;: '+IntToStr(mem.size));
         finally
    //       mem.sfile.Free;
         end;
      end;//end if  if Pos('&sup3;&Eacute;&sup1;&brvbar;&Ecirc;&Otilde;&micro;&frac12;&Icirc;&Auml;&frac14;&thorn;&acute;ó&ETH;&iexcl;', RecStr)> 0 then
      begin
        Memo1.Lines.Add('C: &iquest;&ordf;&Ecirc;&frac14;·&cent;&Euml;&Iacute;&Icirc;&Auml;&frac14;&thorn;');
        ClientSocket1.Socket.SendText('&iquest;&ordf;&Ecirc;&frac14;·&cent;&Euml;&Iacute;&Icirc;&Auml;&frac14;&thorn;');
      end;  if (Pos('&iquest;&Eacute;&Ograve;&Ocirc;·&cent;&Euml;&Iacute;', RecStr)> 0) or (Pos('&frac14;&Igrave;&ETH;&oslash;·&cent;&Euml;&Iacute;', RecStr)> 0) then
      begin
        try
        //recfile:= TFileStream.Create(mem.name, fmOpenRead);
        if  Posi< mem.Size then
        begin
          len:= 1024;
          if mem.Size-posi< 1024 then len:= mem.Size-posi;
          mem.sfile.Position:=posi;
          mem.sfile.ReadBuffer(p,len);
    //      mem.sfile.read(p,len);
          ClientSocket1.Socket.SendBuf(p,len);
    //      memo1.lines.add('&micro;±&Ccedil;°&Icirc;&raquo;&Ouml;&Atilde;:'+inttostr(posi)+',&sup3;¤&para;&Egrave;:'+inttostr(len));
          if ProgressBar2.Position<>Round(posi/mem.Size*100) then
          Application.ProcessMessages;
          ProgressBar2.Position:= Round(posi/mem.Size*100);
          inc(posi, len);
        end;
        finally
        //mem.sfile.Free;
        //mem.sfile:=nil;
        end;
      end;  if Pos('&Icirc;&Auml;&frac14;&thorn;&frac12;&Oacute;&Ecirc;&Otilde;&Ecirc;§°&Uuml;', RecStr)> 0 then
      begin
        Memo1.Lines.Add('C: &Ouml;&Oslash;&ETH;&Acirc;&Igrave;á&frac12;&raquo;&Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;');
        ClientSocket1.Socket.SendText('&Igrave;á&frac12;&raquo;&Icirc;&Auml;&frac14;&thorn;&Atilde;&ucirc;: '+mem.name);
      end;  if Pos('&sup3;&Eacute;&sup1;&brvbar;&frac12;&Oacute;&Ecirc;&Otilde;&Icirc;&Auml;&frac14;&thorn;', RecStr)> 0 then
      begin
          mem.sfile.Free;
          mem.sfile:=nil;
          Memo1.Lines.Add('C: ·&cent;&Euml;&Iacute;&Icirc;&Auml;&frac14;&thorn;&frac12;á&Ecirc;&oslash;');
          ClientSocket1.Socket.SendText('·&cent;&Euml;&Iacute;&Icirc;&Auml;&frac14;&thorn;&frac12;á&Ecirc;&oslash;');
      end;
    end;function  TForm1.getfilename(str1:string):string;
    var
      myi:integer;
      str2:string;
    begin
      str2:='';
      if length(str1)=0 then result:=''
      else
      begin
        if pos('\',str1)<1 then result:=str1
        else
        begin
          for myi:=length(str1) downto 1 do
          begin
            if str1[myi]='\' then  Break;
            str2:=str1[myi]+str2;
          end;
          result:=str2;
        end;
      end;
    end;
    end.
      

  10.   

    //乱码 ,重新来//客户端
    // edit3中是文件的名
    //edit1是服务端的IP
    //edit2是 端口 1234
    //ClientSocket1的clienttype 为ctNonBlocking
    unit client;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ScktComp;type
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        OpenDialog1: TOpenDialog;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Memo1: TMemo;
        ProgressBar2: TProgressBar;
        Edit3: TEdit;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure ClientSocket1Connecting(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
        function  getfilename(str1:string):string;
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  type
      FileInf=Record
        name: String;         //文件名
        Size: Integer;        //文件大小
        sfile: TFileStream;   //文件
      end;
    var
      Form1: TForm1;
      mem: fileinf;
      posi, len: Integer;
    implementation{$R *.DFM}procedure TForm1.Button3Click(Sender: TObject);
    begin
      if ClientSocket1.Active then
        ClientSocket1.Active:=false;
      application.Terminate;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if ClientSocket1.active then clientsocket1.Active:=false;
      ClientSocket1.Host:= edit1.Text;
      ClientSocket1.Port:= StrToInt(edit2.Text);
      clientsocket1.active:=true;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Opendialog1.Execute then
      begin
        edit3.Text:= Opendialog1.FileName;
        mem.name:= getfilename(Opendialog1.FileName);
      end;
    end;procedure TForm1.ClientSocket1Connecting(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
          Memo1.lines.Add('C: 正在链接...');
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      p: Array[0..1023] of byte;
      RecStr: String;
    begin
      RecStr:= ClientSocket1.Socket.ReceiveText;
    //  Memo1.Lines.Add('S: '+RecStr);
      if Pos('连接成功', RecStr)> 0 then
      begin
        Memo1.Lines.Add('连接成功');
        Memo1.Lines.Add('C: 提交文件名');
        ClientSocket1.Socket.SendText('提交文件名: '+mem.name);
      end;  if Pos('成功收到文件名', RecStr)> 0 then
      begin
         posi:=0;
         len:=0;
         Try
           mem.sfile:= TFileStream.Create(mem.name, fmOpenRead);
           mem.Size:= mem.sfile.Size;
           Posi:= 0;
           Memo1.Lines.Add('C: 提交文件大小');
           ClientSocket1.Socket.SendText('提交文件大小: '+IntToStr(mem.size));
         finally
    //       mem.sfile.Free;
         end;
      end;//end if  if Pos('成功收到文件大小', RecStr)> 0 then
      begin
        Memo1.Lines.Add('C: 开始发送文件');
        ClientSocket1.Socket.SendText('开始发送文件');
      end;  if (Pos('可以发送', RecStr)> 0) or (Pos('继续发送', RecStr)> 0) then
      begin
        try
        //recfile:= TFileStream.Create(mem.name, fmOpenRead);
        if  Posi< mem.Size then
        begin
          len:= 1024;
          if mem.Size-posi< 1024 then len:= mem.Size-posi;
          mem.sfile.Position:=posi;
          mem.sfile.ReadBuffer(p,len);
    //      mem.sfile.read(p,len);
          ClientSocket1.Socket.SendBuf(p,len);
    //      memo1.lines.add('当前位置:'+inttostr(posi)+',长度:'+inttostr(len));
          if ProgressBar2.Position<>Round(posi/mem.Size*100) then
          Application.ProcessMessages;
          ProgressBar2.Position:= Round(posi/mem.Size*100);
          inc(posi, len);
        end;
        finally
        //mem.sfile.Free;
        //mem.sfile:=nil;
        end;
      end;  if Pos('文件接收失败', RecStr)> 0 then
      begin
        Memo1.Lines.Add('C: 重新提交文件名');
        ClientSocket1.Socket.SendText('提交文件名: '+mem.name);
      end;  if Pos('成功接收文件', RecStr)> 0 then
      begin
          mem.sfile.Free;
          mem.sfile:=nil;
          Memo1.Lines.Add('C: 发送文件结束');
          ClientSocket1.Socket.SendText('发送文件结束');
      end;
    end;function  TForm1.getfilename(str1:string):string;
    var
      myi:integer;
      str2:string;
    begin
      str2:='';
      if length(str1)=0 then result:=''
      else
      begin
        if pos('\',str1)<1 then result:=str1
        else
        begin
          for myi:=length(str1) downto 1 do
          begin
            if str1[myi]='\' then  Break;
            str2:=str1[myi]+str2;
          end;
          result:=str2;
        end;
      end;
    end;
    end.
      

  11.   

    转的屏幕截取,看看
    服务端程序unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, JPEG,ExtCtrls, ScktComp;typeTForm1 = class(TForm)ServerSocket1: TServerSocket;procedure ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);privateprocedure Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);{自定义抓屏函数,DrawCur表示抓鼠标图像与否}{ Private declarations }public{ Public declarations }end;varForm1: TForm1;MyStream: TMemorystream;{内存流对象} implementation{$R *.DFM}procedure TForm1.Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);varCursorx, Cursory: integer;dc: hdc;Mycan: Tcanvas;R: TRect;DrawPos: TPoint;MyCursor: TIcon;hld: hwnd;Threadld: dword;mp: tpoint;pIconInfo: TIconInfo;beginMybmp := Tbitmap.Create; {建立BMPMAP }Mycan := TCanvas.Create; {屏幕截取}dc := GetWindowDC(0);tryMycan.Handle := dc;R := Rect(0, 0, screen.Width, screen.Height);Mybmp.Width := R.Right;Mybmp.Height := R.Bottom;Mybmp.Canvas.CopyRect(R, Mycan, R);finallyreleaseDC(0, DC);end;Mycan.Handle := 0;Mycan.Free;if DrawCur then {画上鼠标图象}beginGetCursorPos(DrawPos);MyCursor := TIcon.Create;getcursorpos(mp);hld := WindowFromPoint(mp);Threadld := GetWindowThreadProcessId(hld, nil);AttachThreadInput(GetCurrentThreadId, Threadld, True);MyCursor.Handle := Getcursor();AttachThreadInput(GetCurrentThreadId, threadld, False);GetIconInfo(Mycursor.Handle, pIconInfo);cursorx := DrawPos.x - round(pIconInfo.xHotspot);cursory := DrawPos.y - round(pIconInfo.yHotspot);Mybmp.Canvas.Draw(cursorx, cursory, MyCursor); {画上鼠标}DeleteObject(pIconInfo.hbmColor);{GetIconInfo 使用时创建了两个bitmap对象. 需要手工释放这两个对象}DeleteObject(pIconInfo.hbmMask);{否则,调用他后,他会创建一个bitmap,多次调用会产生多个,直至资源耗尽}Mycursor.ReleaseHandle; {释放数组内存}MyCursor.Free; {释放鼠标指针}end; end;procedure TForm1.FormCreate(Sender: TObject);beginServerSocket1.Port := 3000; {端口}ServerSocket1.Open; {Socket开始侦听}end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);beginif ServerSocket1.Active then ServerSocket1.Close; {关闭Socket}end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);varS, S1: string;MyBmp: TBitmap;Myjpg: TJpegimage;beginS := Socket.ReceiveText;if S = 'cap' then {客户端发出抓屏幕指令}begintryMyStream := TMemorystream.Create;{建立内存流}MyBmp := TBitmap.Create;Myjpg := TJpegimage.Create;Cjt_GetScreen(MyBmp, True); {True表示抓鼠标图像}Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}Myjpg.CompressionQuality := 10; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}Myjpg.free;MyStream.Position := 0;{注意:必须添加此句}s1 := inttostr(MyStream.size);{流的大小}Socket.sendtext(s1); {发送流大小}finallyMyBmp.free;end;end;if s = 'ready' then {客户端已准备好接收图象}beginMyStream.Position := 0;Socket.SendStream(MyStream); {将流发送出去}end;end;end.
      

  12.   

    客户端程序。新建一个工程,添加Socket控件ClientSocket、图像显示控件Image、一个 Panel 、一个Edit、两个 Button和一个状态栏控件StatusBar1。注意:把Edit1和两个 Button放在Panel1上面。ClientSocket的属性跟ServerSocket差不多,不过多了一个Address属性,表示要连接的服务端IP地址。填上IP地址后点“连接”将与服务端程序建立连接,如果成功就可以进行通讯了。点击“抓屏”将发送字符给服务端。因为程序用到了JPEG图像单元,所以要在Uses中添加Jpeg.全部代码如下:unit Unit2{客户端};interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ScktComp,ExtCtrls,Jpeg, ComCtrls;typeTForm1 = class(TForm)ClientSocket1: TClientSocket;Image1: TImage;StatusBar1: TStatusBar;Panel1: TPanel;Edit1: TEdit;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket);procedure Button2Click(Sender: TObject);procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure ClientSocket1Disconnect(Sender: TObject;Socket: TCustomWinSocket);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;MySize: Longint;MyStream: TMemorystream;{内存流对象}implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);begin{-------- 下面为设置窗口控件的外观属性 ------------- }{注意:把Button1、Button2和Edit1放在Panel1上面}Edit1.Text := '127.0.0.1';Button1.Caption := '连接主机';Button2.Caption := '抓屏幕';Button2.Enabled := false;Panel1.Align := alTop;Image1.Align := alClient;Image1.Stretch := True;StatusBar1.Align:=alBottom;StatusBar1.SimplePanel := True;{----------------------------------------------- }MyStream := TMemorystream.Create; {建立内存流对象}MySize := 0; {初始化}end;procedure TForm1.Button1Click(Sender: TObject);beginif not ClientSocket1.Active thenbeginClientSocket1.Address := Edit1.Text; {远程IP地址}ClientSocket1.Port := 3000; {Socket端口}ClientSocket1.Open; {建立连接}end;end;procedure TForm1.Button2Click(Sender: TObject);beginClientsocket1.Socket.SendText('cap'); {发送指令通知服务端抓取屏幕图象}Button2.Enabled := False;end;procedure TForm1.ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket);beginStatusBar1.SimpleText := '与主机' + ClientSocket1.Address + '成功建立连接!';Button2.Enabled := True;end;procedure TForm1.ClientSocket1Error(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);beginErrorcode := 0; {不弹出出错窗口}StatusBar1.SimpleText := '无法与主机' + ClientSocket1.Address + '建立连接!';end;procedure TForm1.ClientSocket1Disconnect(Sender: TObject;Socket: TCustomWinSocket);beginStatusBar1.SimpleText := '与主机' + ClientSocket1.Address + '断开连接!';Button2.Enabled := False;end;procedure TForm1.ClientSocket1Read(Sender: TObject;Socket: TCustomWinSocket);varMyBuffer: array[0..10000] of byte; {设置接收缓冲区}MyReceviceLength: integer;S: string;MyBmp: TBitmap;MyJpg: TJpegimage;beginStatusBar1.SimpleText := '正在接收数据......';if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}beginS := Socket.ReceiveText;MySize := Strtoint(S); {设置需接收的字节数}Clientsocket1.Socket.SendText('ready'); {发指令通知服务端开始发送图象}endelsebegin {以下为图象数据接收部分}MyReceviceLength := socket.ReceiveLength; {读出包长度}StatusBar1.SimpleText := '正在接收数据,数据大小为:' + inttostr(MySize);Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中}if MyStream.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕}beginMyStream.Position := 0;MyBmp := tbitmap.Create;MyJpg := tjpegimage.Create;tryMyJpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}MyBmp.Assign(MyJpg); {将JPG转为BMP}StatusBar1.SimpleText := '正在显示图像';Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }finally {以下为清除工作 }MyBmp.free;MyJpg.free;Button2.Enabled := true;{ Socket.SendText('cap');添加此句即可连续抓屏 }MyStream.Clear;MySize := 0;end;end;end;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);beginMyStream.Free; {释放内存流对象}if ClientSocket1.Active then ClientSocket1.Close; {关闭Socket连接}end;end.  程序原理:运行服务端开始侦听,再运行客户端,输入服务端IP地址建立连接,然后发一个字符通知服务端抓屏幕。服务端调用自定义函数Cjt_GetScreen抓取屏幕存为BMP,把BMP转换成JPG,把JPG写入内存流中,然后把流发送给客户端。客户端接收到流后做相反操作,将流转换为JPG再转换为BMP然后显示出来。
      

  13.   

    各位大侠,我也对此问题感兴趣,如果谁可以把用DELPHI7下的INDY控件做好的简单的传输网络文件的例程发到,[email protected]我发现大家写的网络传输文件的例程都是用SERVERSOCKET/CLIENTSOCKET写成的,大家有用DELPHI7写的例程吗?(主要功能就是简单的传输不超过1M的小文件,不需要传输大量数据的,支持二进制数据格式文件),最好直接把写好的程序发到我的邮箱里,一定高分相送。多谢大家。
      

  14.   

    用TIdTcpClient和TIdTcpServer,使用他们的sendfile方法可以轻易实现。
      

  15.   

    http://expert.csdn.net/Expert/topic/2582/2582771.xml?temp=.4994013
      

  16.   

    //================================客户端=====================================
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ScktComp;type
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        OpenDialog1: TOpenDialog;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      s : TWinSocketStream;
      f, f2: TFileStream;
    begin
      if not OpenDialog1.Execute then Exit;
      ClientSocket1.Open;
      s := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
      f := TFileStream.Create(OpenDialog1.FileName, fmShareDenyWrite);
      try
        s.CopyFrom(f, 0);
      finally
        s.Free;
        f.Free;
        ClientSocket1.Close;
      end;
    end;end.//========================================服务器端====================================
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp;type
      TForm1 = class(TForm)
        ServerSocket1: TServerSocket;
        procedure ServerSocket1GetThread(Sender: TObject;
          ClientSocket: TServerClientWinSocket;
          var SocketThread: TServerClientThread);
        private
        { Private declarations }
        public
        { Public declarations }
        end;
      TClientThread = Class(TServerClientThread)
        private
        public
        procedure ClientExecute; override;
        end;
        
    var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TClientThread.ClientExecute;
    var
      ReceiveBuffer : Array[0..1023] Of Char;
      SocketStream : TWinSocketStream;
      BytesRead : Integer;
      F : TFileStream;
      FileName: string;
    begin
     while not Terminated and ClientSocket.Connected do
      Begin
       try
         SocketStream := TWinSocketStream.Create(ClientSocket, 100);
         FileName := 'C:\afile';
         if FileExists(FileName) then FileName := FileName + '0';
         F := TFileStream.Create(FileName, fmCreate);
         try
           FillChar(ReceiveBuffer, sizeof(ReceiveBuffer), 0);
            while SocketStream.WaitForData(5000) do
            begin
              BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
              if BytesRead = 0 then
                ClientSocket.Close
              Else
               F.WriteBuffer(ReceiveBuffer, BytesRead);
            end;
         finally
           SocketStream.Free;
           ClientSocket.Close;
           f.Free;
         end;
       except
       end;
      end;
    end;
    procedure TForm1.ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    begin
      SocketThread := TClientThread.Create(False, ClientSocket);
    end;end.
      

  17.   

    首先客户端发送一个请求比如一个: (D),其中D表示下载
    那么,客户端如果接受到D这个字符就标识下载
    var
       TState = (stWait, stReceive, stSend, stSpy, stGetDrive, stGetFile ,stDel ,stShare); //定义了多种状态
       len      : integer;
       drv      : char;
       f        : TSearchRec;
       ListItem : TListItem;
       temptext, temp: string;
       i, index : integer;
       buf   : array [0..1023] of byte; //最大传输文件大小
        State : TState;
        opFile: file of byte;
        NumRead    : integer;对于客户端:(使用clientsocket)
    step 1:
      if State = stWait then
      if OpenDlg.Execute then
      begin
        assignFile(opFile,OpenDlg.filename);
        Reset(opFile);
        Counter := 0;
        temp := OpenDlg.FileName;
        i := length(temp);
        repeat dec(i) until temp[i] = '\';
        delete(temp,1,i);
        temp := 'd' + currentDir + temp; //currentdir:为服务器端相应的地址,
        ClntSocket.Socket.SendText(temp);
        State := stSend;
      end;
    step 2:
    对于服务器端:(使用serversocket)
    temptext = Socket.ReceiveText;
    if tempText[1] = 'd' then         //上传
        begin
          delete(temptext,1,1);
          assignFile(opFile,temptext);
          rewrite(opFile);
          State := stReceive;
          Socket.SendText('next');
    end;
    step 3:
    对于客户端:(使用clientsocket)
     if State = stSend then  //发送状态
        temptext := Socket.ReceiveText;
        if TempText = 'next' then
        begin
          BlockRead(opFile,buf,Sizeof(buf),NumRead);
          ClientSocket.Socket.SendBuf(buf,numRead);
          if NumRead < Sizeof(buf) then
          begin
            State := stWait;
            CloseFile(opFile);
          end
        end
    end;
     
    step 4:
    对于服务器端:(使用serversocket)
     if State = stReceive then //假如为接受状态
       begin
        length := socket.ReceiveLength;
        socket.ReceiveBuf(buf,Length);
        BlockWrite(opFile,buf,length);
        if Length < SizeOf(buf) then
        begin
          state := stWait;
          CloseFile(opFile);
        end else socket.SendText('next');
      end;
    end;PS:如果不清除的话可以参考海盗远程监控木马程序:下载地址为:
       1.http://software.tom.com/SoftInfoDisplay.php?id=3234
       2.http://www.mycodes.net/soft/2269.htm
       3.http://www.cimy.8u8.com/pirate.rar
    当然这些都是没有源代码.如果你需要源代码可以写信告诉我:
    [email protected].