我认为可以从以下方面来着手:
1,写一个服务器程序和客户端程序,在服务器程序上添加以下组件ServerSocket,NMStrm,NMStrm的timeout
属性设为9000,port设为8800(可以任意但和客户端NMStrmServ的port相同 ),
在客户端程序上添加以下组件:ClientSocket,NMStrmServ
ServerSocket用来监听客户端发来的请求,当然,它的port属性的设置因该和客户端ClientSocket的port一样
否则服务器和客户端不能正确的握手,NMStrm,NMStrmServ,分别用来接受和发送文件,当然它是以流的方式接受和发送.2,下面,我给出代码,当然是核心部分:
先给出服务器的:
procedure TForm1.FormCreate(Sender: TObject);//这是监听来自客户端的请求.
begin
serversocket1.Open;
serversocket1.Active:=true;
serversocket1.Socket.Lock;
end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);//获取客户端的ip
begin
edit1.Text:=socket.RemoteAddress ;
end;procedure TForm1.serversocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var fromclient:string;
sendfile:string;
begin
fromclient:=socket.ReceiveText ;//接受来自客户端的消息
sendfile:=copy(fronclient,6,length(fromclient)-5);//要传送的文件
if pos('down!',fromclient)=1 then//判断是否是传送文件指令
Begin
NMStrm1.Host := Edit1.Text;
NMStrm1.FromName := 'NetMasterstr';;
MyFStream := TFileStream.Create(strfile, fmOpenRead);
try
serversocket1.Active:=false;
NMStrm1.PostIt(MyFStream);
finally
MyFStream.Free;
end;
serversocket1.Active:=true;
end;end;客户端:为了和服务器连接
如下代码加在buttonclick事件中
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Address:=combobox1.Text ;//服务器的ip
clientsocket1.Active:=true;
clientsocket1.Port:=strtoint(edit1.Text );//服务器监听端口
end;procedure TForm1.BitBtn52Click(Sender: TObject);//发送下载文件请求
begin
clientsocket1.Socket.sendtext('down!'+edit9.Text);//edit9.txt中存放要下载的文件,将数据库中的地址读入edit9.txt我想不是难题,如edit9.txt:='d:\eeee.txt'
end;procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;//客户端接受服务器传来的文件
strm: TStream);
var
myfstream :Tfilestream ;
begin
If FileExists(edit10.Text) then DeleteFile(edit10.text);//edit10.text 是你下载到你的计算机上之后保存的文件名如'c:\xxxx.exe'
MyFStream := TFileStream.Create(edit10.text, fmCreate);
try
MyFStream.CopyFrom(strm, strm.size);
finally
MYFStream.Free;
end;
clientsocket1.Address:=combobox1.Text ;//服务器的ip
clientsocket1.Active:=true;
clientsocket1.Port:=strtoint(edit1.Text );//和服务器的端口相同
messagebox(handle,'下载完成','case',MB_ok+MB_iconstop);
end;当然我设计的是将自己机器作为客户机,而远程的作为服务器,其实,那一个作为服务器不重要,最重要的是方法
你也可以将自己作为服务器,原理一样.如有问题请继续问!
1,写一个服务器程序和客户端程序,在服务器程序上添加以下组件ServerSocket,NMStrm,NMStrm的timeout
属性设为9000,port设为8800(可以任意但和客户端NMStrmServ的port相同 ),
在客户端程序上添加以下组件:ClientSocket,NMStrmServ
ServerSocket用来监听客户端发来的请求,当然,它的port属性的设置因该和客户端ClientSocket的port一样
否则服务器和客户端不能正确的握手,NMStrm,NMStrmServ,分别用来接受和发送文件,当然它是以流的方式接受和发送.2,下面,我给出代码,当然是核心部分:
先给出服务器的:
procedure TForm1.FormCreate(Sender: TObject);//这是监听来自客户端的请求.
begin
serversocket1.Open;
serversocket1.Active:=true;
serversocket1.Socket.Lock;
end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);//获取客户端的ip
begin
edit1.Text:=socket.RemoteAddress ;
end;procedure TForm1.serversocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var fromclient:string;
sendfile:string;
begin
fromclient:=socket.ReceiveText ;//接受来自客户端的消息
sendfile:=copy(fronclient,6,length(fromclient)-5);//要传送的文件
if pos('down!',fromclient)=1 then//判断是否是传送文件指令
Begin
NMStrm1.Host := Edit1.Text;
NMStrm1.FromName := 'NetMasterstr';;
MyFStream := TFileStream.Create(strfile, fmOpenRead);
try
serversocket1.Active:=false;
NMStrm1.PostIt(MyFStream);
finally
MyFStream.Free;
end;
serversocket1.Active:=true;
end;end;客户端:为了和服务器连接
如下代码加在buttonclick事件中
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Address:=combobox1.Text ;//服务器的ip
clientsocket1.Active:=true;
clientsocket1.Port:=strtoint(edit1.Text );//服务器监听端口
end;procedure TForm1.BitBtn52Click(Sender: TObject);//发送下载文件请求
begin
clientsocket1.Socket.sendtext('down!'+edit9.Text);//edit9.txt中存放要下载的文件,将数据库中的地址读入edit9.txt我想不是难题,如edit9.txt:='d:\eeee.txt'
end;procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;//客户端接受服务器传来的文件
strm: TStream);
var
myfstream :Tfilestream ;
begin
If FileExists(edit10.Text) then DeleteFile(edit10.text);//edit10.text 是你下载到你的计算机上之后保存的文件名如'c:\xxxx.exe'
MyFStream := TFileStream.Create(edit10.text, fmCreate);
try
MyFStream.CopyFrom(strm, strm.size);
finally
MYFStream.Free;
end;
clientsocket1.Address:=combobox1.Text ;//服务器的ip
clientsocket1.Active:=true;
clientsocket1.Port:=strtoint(edit1.Text );//和服务器的端口相同
messagebox(handle,'下载完成','case',MB_ok+MB_iconstop);
end;当然我设计的是将自己机器作为客户机,而远程的作为服务器,其实,那一个作为服务器不重要,最重要的是方法
你也可以将自己作为服务器,原理一样.如有问题请继续问!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货