//================================客户端===================================== 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.
首先客户端发送一个请求比如一个: (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].
用流方式最简单 而且错误率很低很低 发送端先给接收端发个消息 令其准备接收文件
然后发送端再发送文件
发送端
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
[email protected]
谢谢!
向m中增加内容是不是只要把m.postion指向流末尾就能实现?
我也是这么写的,文件大了以的好象只能保存m为字节。
TCP的当然编译一个FTP也很Easy的
不要说是2M,就是20G都OK的,还支持断点续传的呢
[email protected]
谢谢!!!!!!
谢谢了,现在真在学习这个方面,谢谢大虾门指点了
//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.
// 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; //ÎļþÃû
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.
// 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.
服务端程序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.
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.
那么,客户端如果接受到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].