请问在win98里面怎么像在win2000里面一样启动ftp服务那??我想用NMFTP控件在两台win98机器上面传送文件。来者有分!!!!!! 小弟初学delphi,想用NMFTP控件在两台win98的机器上传送文件,可是我又不知道在哪里启动ftp服务,请各位指点。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以使用第三方的FTP服务器软件,非常简单。 我想用delphi里面的nmftp控件写,不知怎么实现啊? FTP必须要有一个Server端才可以,可以用第三方控件。 要编客户端和服务段程序部分代码:客户端:服务端:unit ftpUnit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Buttons, StdCtrls, Menus, ExtCtrls, FtpSrv,WinSock,wsocket, FtpCli, FtpSrvC, VCLUnZip, VCLZip, DB, ADODB ;type TForm1 = class(TForm) FtpServer1: TFtpServer; Panel1: TPanel; Memo1: TMemo; SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; SpeedButton4: TSpeedButton; SpeedButton5: TSpeedButton; SpeedButton6: TSpeedButton; StatusBar1: TStatusBar; SpeedButton7: TSpeedButton; myZip: TVCLZip; sjcsADOQuery1: TADOQuery; ADOConnection1: TADOConnection; sjcsADOQuery2: TADOQuery; sjcsADOStoredProc1: TADOStoredProc; SpeedButton8: TSpeedButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure SpeedButton1Click(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); procedure SpeedButton3Click(Sender: TObject); procedure SpeedButton4Click(Sender: TObject); procedure SpeedButton5Click(Sender: TObject); procedure SpeedButton6Click(Sender: TObject); procedure UpdateClientCount; procedure FtpServer1AlterDirectory(Sender: TObject; Client: TFtpCtrlSocket; var Directory: TFtpString; Detailed: Boolean); procedure FtpServer1AnswerToClient(Sender: TObject; Client: TFtpCtrlSocket; var Answer: TFtpString); procedure FtpServer1Authenticate(Sender: TObject; Client: TFtpCtrlSocket; UserName, Password: TFtpString; var Authenticated: Boolean); procedure FtpServer1BuildDirectory(Sender: TObject; Client: TFtpCtrlSocket; var Directory: TFtpString; Detailed: Boolean); procedure FtpServer1ChangeDirectory(Sender: TObject; Client: TFtpCtrlSocket; Directory: TFtpString; var Allowed: Boolean); procedure FtpServer1ClientCommand(Sender: TObject; Client: TFtpCtrlSocket; var Keyword, Params, Answer: TFtpString); procedure FtpServer1ClientConnect(Sender: TObject; Client: TFtpCtrlSocket; AError: Word); procedure FtpServer1ClientDisconnect(Sender: TObject; Client: TFtpCtrlSocket; AError: Word); procedure FtpServer1GetProcessing(Sender: TObject; Client: TFtpCtrlSocket; var DelayedSend: Boolean); procedure FtpServer1GetUniqueFileName(Sender: TObject; Client: TFtpCtrlSocket; var FileName: TFtpString); procedure FtpServer1MakeDirectory(Sender: TObject; Client: TFtpCtrlSocket; Directory: TFtpString; var Allowed: Boolean); procedure FtpServer1RetrDataSent(Sender: TObject; Client: TFtpCtrlSocket; Data: TWSocket; AError: Word); procedure FtpServer1RetrSessionClosed(Sender: TObject; Client: TFtpCtrlSocket; Data: TWSocket; AError: Word); procedure FtpServer1RetrSessionConnected(Sender: TObject; Client: TFtpCtrlSocket; Data: TWSocket; AError: Word); procedure FtpServer1Start(Sender: TObject); procedure FtpServer1Stop(Sender: TObject); procedure FtpServer1StorDataAvailable(Sender: TObject; Client: TFtpCtrlSocket; Data: TWSocket; Buf: PChar; Len: Integer; AError: Word); procedure FtpServer1StorSessionClosed(Sender: TObject; Client: TFtpCtrlSocket; Data: TWSocket; AError: Word); procedure FtpServer1StorSessionConnected(Sender: TObject; Client: TFtpCtrlSocket; Data: TWSocket; AError: Word); procedure FtpServer1ValidateDele(Sender: TObject; Client: TFtpCtrlSocket; var FilePath: TFtpString; var Allowed: Boolean); procedure FtpServer1ValidateGet(Sender: TObject; Client: TFtpCtrlSocket; var FilePath: TFtpString; var Allowed: Boolean); procedure FtpServer1ValidatePut(Sender: TObject; Client: TFtpCtrlSocket; var FilePath: TFtpString; var Allowed: Boolean); procedure FtpServer1ValidateRmd(Sender: TObject; Client: TFtpCtrlSocket; var FilePath: TFtpString; var Allowed: Boolean); procedure FtpServer1ValidateRnFr(Sender: TObject; Client: TFtpCtrlSocket; var FilePath: TFtpString; var Allowed: Boolean); procedure FtpServer1ValidateRnTo(Sender: TObject; Client: TFtpCtrlSocket; var FilePath: TFtpString; var Allowed: Boolean); procedure FtpServer1ValidateSize(Sender: TObject; Client: TFtpCtrlSocket; var FilePath: TFtpString; var Allowed: Boolean); procedure FormCreate(Sender: TObject); procedure sjjy; procedure sjdr; procedure SpeedButton7Click(Sender: TObject); function WinExecAndWait32(FileName:String; Visibility : integer): DWORD; procedure myZipBadCRC(Sender: TObject; CalcCRC, StoredCRC, FileIndex: Integer); procedure SpeedButton8Click(Sender: TObject); private i,filelen,rp_wj,cp_wj:integer;//rp_wj:表示收到加油站文件的指针,cp_wj:文件倒入到数据库的指针 wj1,wj2,wj3,wj4,wj5,wj6,wj7,wj8,wj9,wj0:string;//文件件池,最多10个 { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.UpdateClientCount;begin if FtpServer1.ClientCount = 0 then statusbar1.panels[0].text:='连接用户数: '+ IntToStr(FtpServer1.ClientCount) else statusbar1.panels[0].text:='连接用户数: '+IntToStr(FtpServer1.ClientCount) ;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin try ftpserver1.Stop; ftpserver1.DisconnectAll; except end;end;procedure TForm1.SpeedButton1Click(Sender: TObject);begin update; ftpserver1.Start; cp_wj:=0; rp_wj:=0;end; procedure TForm1.SpeedButton2Click(Sender: TObject);begin ftpserver1.Stop; ftpserver1.DisconnectAll;end;procedure TForm1.SpeedButton3Click(Sender: TObject);var portnum:integer; tmpstr:string;begin tmpstr:=inputbox('FTP服务端口设置','请输入FTP服务端口号:','99'); try portnum:=strtoint(tmpstr); except showmessage('请输入数字!'); exit; end; speedbutton2click(sender); ftpserver1.port:=inttostr(portnum);// ftpserver1.port:=inttostr(2048); speedbutton1click(sender);end;procedure TForm1.SpeedButton4Click(Sender: TObject);begin memo1.Clear;end;procedure TForm1.SpeedButton5Click(Sender: TObject);begin showmessage('FTP简易服务器'); //, // #13+'FTP简易服务器'+ // #13+'欢迎使用!',0);end;procedure TForm1.SpeedButton6Click(Sender: TObject);beginclose;end;procedure TForm1.FtpServer1AlterDirectory(Sender: TObject; Client: TFtpCtrlSocket; var Directory: TFtpString; Detailed: Boolean);begin memo1.Lines.Add('# '+datetimetostr(now)+' '+'FtpServer1AlterDirectory');end;procedure TForm1.FtpServer1AnswerToClient(Sender: TObject; Client: TFtpCtrlSocket; var Answer: TFtpString);begin memo1.Lines.Add('FtpServer1AnswerToClient');end;procedure TForm1.FtpServer1Authenticate(Sender: TObject; Client: TFtpCtrlSocket; UserName, Password: TFtpString; var Authenticated: Boolean);begin Memo1.Lines.Add('# '+datetimetostr(now)+' '+ Client.GetPeerAddr +client.UserName+ ' User ''' + UserName + ''' is authenticated'); if Password = 'bad' then Authenticated := FALSE;// memo1.Lines.Add('FtpServer1Authenticate');end;procedure TForm1.FtpServer1ClientCommand(Sender: TObject; Client: TFtpCtrlSocket; var Keyword, Params, Answer: TFtpString);begin if keyword='PASS' THEN Memo1.Lines.Add('# '+datetimetostr(now)+' '+ Client.GetPeerAddr +client.UserName+ ' ' + Keyword + ' ' + '********') ELSE Memo1.Lines.Add('# '+datetimetostr(now)+' '+ Client.GetPeerAddr +client.UserName+ ' ' + Keyword + ' ' + Params); if keyword='STOR' then wj1:=params; // memo1.Lines.Add('FtpServer1ClientCommand');end;procedure TForm1.FtpServer1ClientConnect(Sender: TObject; Client: TFtpCtrlSocket; AError: Word);begin { The next test shows how to refuse a client } if Client.GetPeerAddr = '193.121.12.25' then begin Client.SendStr('421 Connection not allowed.' + #13#10); Client.Close; Exit; end; memo1.Lines.Add('# '+datetimetostr(now)+' '+Client.GetPeerAddr+ client.UserName+'客户试图连接'); UpdateClientCount;end; 装个Serv_U,可以把机器变为FTP服务器,就可以了(看看如何用Serv_U) Serv_U是干什么的呀?我怎么没有听说过啊? Serv-U著名的Win32 FTP服务器非常强大而且稳定 你们那谁有十六进制转成字符串的函数? 在线等待---panel的caption怎样分行显示?? 添加字段怎么出错了? 怎样把做的delphi项目变为一个可以独立的应用程序? 单击button时调用form.onshow事件该怎样写代码? 在窗体上显示多幅图像,如果能完全解决问题,赠送当挡书店或其他网上书店任选书四本。 请问如何在delphi 中调用C++ 的动态连接库。 为什么我的delphi的帮助文件里的内容没有别人的多? 怎样把本的一个目录映射成一个取得驱动器 多少分都给!!帮我,大侠 Delphi做网络编程能到什么程度? form启动的事件顺序是怎样的??
部分代码:
客户端:服务端:
unit ftpUnit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Buttons, StdCtrls, Menus, ExtCtrls, FtpSrv,WinSock,wsocket,
FtpCli, FtpSrvC, VCLUnZip, VCLZip, DB, ADODB ;type
TForm1 = class(TForm)
FtpServer1: TFtpServer;
Panel1: TPanel;
Memo1: TMemo;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton;
SpeedButton6: TSpeedButton;
StatusBar1: TStatusBar;
SpeedButton7: TSpeedButton;
myZip: TVCLZip;
sjcsADOQuery1: TADOQuery;
ADOConnection1: TADOConnection;
sjcsADOQuery2: TADOQuery;
sjcsADOStoredProc1: TADOStoredProc;
SpeedButton8: TSpeedButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
procedure SpeedButton5Click(Sender: TObject);
procedure SpeedButton6Click(Sender: TObject);
procedure UpdateClientCount;
procedure FtpServer1AlterDirectory(Sender: TObject;
Client: TFtpCtrlSocket; var Directory: TFtpString;
Detailed: Boolean);
procedure FtpServer1AnswerToClient(Sender: TObject;
Client: TFtpCtrlSocket; var Answer: TFtpString);
procedure FtpServer1Authenticate(Sender: TObject;
Client: TFtpCtrlSocket; UserName, Password: TFtpString;
var Authenticated: Boolean);
procedure FtpServer1BuildDirectory(Sender: TObject;
Client: TFtpCtrlSocket; var Directory: TFtpString;
Detailed: Boolean);
procedure FtpServer1ChangeDirectory(Sender: TObject;
Client: TFtpCtrlSocket; Directory: TFtpString; var Allowed: Boolean);
procedure FtpServer1ClientCommand(Sender: TObject;
Client: TFtpCtrlSocket; var Keyword, Params, Answer: TFtpString);
procedure FtpServer1ClientConnect(Sender: TObject;
Client: TFtpCtrlSocket; AError: Word);
procedure FtpServer1ClientDisconnect(Sender: TObject;
Client: TFtpCtrlSocket; AError: Word);
procedure FtpServer1GetProcessing(Sender: TObject;
Client: TFtpCtrlSocket; var DelayedSend: Boolean);
procedure FtpServer1GetUniqueFileName(Sender: TObject;
Client: TFtpCtrlSocket; var FileName: TFtpString);
procedure FtpServer1MakeDirectory(Sender: TObject;
Client: TFtpCtrlSocket; Directory: TFtpString; var Allowed: Boolean);
procedure FtpServer1RetrDataSent(Sender: TObject;
Client: TFtpCtrlSocket; Data: TWSocket; AError: Word);
procedure FtpServer1RetrSessionClosed(Sender: TObject;
Client: TFtpCtrlSocket; Data: TWSocket; AError: Word);
procedure FtpServer1RetrSessionConnected(Sender: TObject;
Client: TFtpCtrlSocket; Data: TWSocket; AError: Word);
procedure FtpServer1Start(Sender: TObject);
procedure FtpServer1Stop(Sender: TObject);
procedure FtpServer1StorDataAvailable(Sender: TObject;
Client: TFtpCtrlSocket; Data: TWSocket; Buf: PChar; Len: Integer;
AError: Word);
procedure FtpServer1StorSessionClosed(Sender: TObject;
Client: TFtpCtrlSocket; Data: TWSocket; AError: Word);
procedure FtpServer1StorSessionConnected(Sender: TObject;
Client: TFtpCtrlSocket; Data: TWSocket; AError: Word);
procedure FtpServer1ValidateDele(Sender: TObject;
Client: TFtpCtrlSocket; var FilePath: TFtpString;
var Allowed: Boolean);
procedure FtpServer1ValidateGet(Sender: TObject;
Client: TFtpCtrlSocket; var FilePath: TFtpString;
var Allowed: Boolean);
procedure FtpServer1ValidatePut(Sender: TObject;
Client: TFtpCtrlSocket; var FilePath: TFtpString;
var Allowed: Boolean);
procedure FtpServer1ValidateRmd(Sender: TObject;
Client: TFtpCtrlSocket; var FilePath: TFtpString;
var Allowed: Boolean);
procedure FtpServer1ValidateRnFr(Sender: TObject;
Client: TFtpCtrlSocket; var FilePath: TFtpString;
var Allowed: Boolean);
procedure FtpServer1ValidateRnTo(Sender: TObject;
Client: TFtpCtrlSocket; var FilePath: TFtpString;
var Allowed: Boolean);
procedure FtpServer1ValidateSize(Sender: TObject;
Client: TFtpCtrlSocket; var FilePath: TFtpString;
var Allowed: Boolean);
procedure FormCreate(Sender: TObject);
procedure sjjy;
procedure sjdr;
procedure SpeedButton7Click(Sender: TObject);
function WinExecAndWait32(FileName:String; Visibility : integer): DWORD;
procedure myZipBadCRC(Sender: TObject; CalcCRC, StoredCRC,
FileIndex: Integer);
procedure SpeedButton8Click(Sender: TObject); private i,filelen,rp_wj,cp_wj:integer;//rp_wj:表示收到加油站文件的指针,cp_wj:文件倒入到数据库的指针
wj1,wj2,wj3,wj4,wj5,wj6,wj7,wj8,wj9,wj0:string;//文件件池,最多10个
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.UpdateClientCount;
begin
if FtpServer1.ClientCount = 0 then
statusbar1.panels[0].text:='连接用户数: '+ IntToStr(FtpServer1.ClientCount)
else
statusbar1.panels[0].text:='连接用户数: '+IntToStr(FtpServer1.ClientCount) ;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
ftpserver1.Stop;
ftpserver1.DisconnectAll;
except
end;
end;procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
update;
ftpserver1.Start;
cp_wj:=0;
rp_wj:=0;
end;
begin
ftpserver1.Stop;
ftpserver1.DisconnectAll;
end;procedure TForm1.SpeedButton3Click(Sender: TObject);
var
portnum:integer;
tmpstr:string;
begin
tmpstr:=inputbox('FTP服务端口设置','请输入FTP服务端口号:','99');
try
portnum:=strtoint(tmpstr);
except
showmessage('请输入数字!');
exit;
end;
speedbutton2click(sender);
ftpserver1.port:=inttostr(portnum);
// ftpserver1.port:=inttostr(2048);
speedbutton1click(sender);end;procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
memo1.Clear;
end;procedure TForm1.SpeedButton5Click(Sender: TObject);
begin
showmessage('FTP简易服务器');
//,
// #13+'FTP简易服务器'+
// #13+'欢迎使用!',0);
end;procedure TForm1.SpeedButton6Click(Sender: TObject);
begin
close;end;procedure TForm1.FtpServer1AlterDirectory(Sender: TObject;
Client: TFtpCtrlSocket; var Directory: TFtpString; Detailed: Boolean);
begin
memo1.Lines.Add('# '+datetimetostr(now)+' '+'FtpServer1AlterDirectory');
end;procedure TForm1.FtpServer1AnswerToClient(Sender: TObject;
Client: TFtpCtrlSocket; var Answer: TFtpString);
begin
memo1.Lines.Add('FtpServer1AnswerToClient');end;procedure TForm1.FtpServer1Authenticate(Sender: TObject;
Client: TFtpCtrlSocket; UserName, Password: TFtpString;
var Authenticated: Boolean);
begin
Memo1.Lines.Add('# '+datetimetostr(now)+' '+ Client.GetPeerAddr +client.UserName+
' User ''' + UserName + ''' is authenticated');
if Password = 'bad' then
Authenticated := FALSE;
// memo1.Lines.Add('FtpServer1Authenticate');end;procedure TForm1.FtpServer1ClientCommand(Sender: TObject;
Client: TFtpCtrlSocket; var Keyword, Params, Answer: TFtpString);
begin
if keyword='PASS' THEN
Memo1.Lines.Add('# '+datetimetostr(now)+' '+ Client.GetPeerAddr +client.UserName+ ' ' +
Keyword + ' ' + '********')
ELSE Memo1.Lines.Add('# '+datetimetostr(now)+' '+ Client.GetPeerAddr +client.UserName+ ' ' +
Keyword + ' ' + Params);
if keyword='STOR' then
wj1:=params;
// memo1.Lines.Add('FtpServer1ClientCommand');end;procedure TForm1.FtpServer1ClientConnect(Sender: TObject;
Client: TFtpCtrlSocket; AError: Word);
begin
{ The next test shows how to refuse a client }
if Client.GetPeerAddr = '193.121.12.25' then begin
Client.SendStr('421 Connection not allowed.' + #13#10);
Client.Close;
Exit;
end;
memo1.Lines.Add('# '+datetimetostr(now)+' '+Client.GetPeerAddr+ client.UserName+'客户试图连接');
UpdateClientCount;
end;
非常强大而且稳定