idFtpServer
使用 FTP server 搭建 FTP 服务器
使用 FTP server 搭建 FTP 服务器
1、访问天互数据资源镜像站下载并安装FTP server 程序
2、安装完成后桌面会出现 ftpserv 的图标,同时会弹出下图所示的窗口,第一步点击启动服务器,接下来点击管理器,打开 ftp 服务器管理面板。
3、打开管理面板后,系统任务栏后面的托盘区会出现相应的图标,请查看托盘区图标中的 FZ 是否为黄色(颜色较量),如果不是,说明服务没有正常启动,21 端口被占用,这时请检查 iis 中的 ftp 服务器是否开启,如果已经开启,请停止 iis 默认的 ftp 站点。
4、点击菜单栏中的“编辑”,选择“用户”,进入用户设置。
5、进入管理页面后,点击添加按纽,输入要创建的 ftp 用户名(例如 ftpuser),然后确定;
6、这时,创建的账户就会在右边的用户栏中显示出来,勾选密码,并输入密码,再选择左边的共享文件夹,进入 ftp 目录设置。
7、点击添加按钮,选择 ftp 要指向的目录,然后根据需求给予相应的权限,点击左边的确定,然后将窗口最小化即可。
8、在防火墙例外规则中添加 21 端口。
9、使用 ftp 客户端连接时,如果出现能够连接服务器,但不能获取目录的情况,请将客户端的传输模式更改为主动模式即可。
idftp用法 -回复
idftp用法-回复"IDFTP用法" - 一步一步回答IDFTP(Internet Direct FTP)是Delphi语言开发的一个功能强大的FTP 组件,用于在Delphi应用程序中进行FTP文件的传输和管理。
本文将一步一步介绍IDFTP的用法,帮助读者了解如何使用该组件来实现FTP功能。
第一步:安装和使用IDFTP组件在使用IDFTP之前,首先需要在Delphi开发环境中安装该组件。
通常可以从第三方网站下载安装文件,然后按照安装向导进行安装。
安装完成后,在Delphi的组件面板中会出现IDFTP组件,可以将其拖放到需要使用FTP 功能的窗体上。
第二步:建立FTP连接在使用IDFTP组件之前,需要先建立与FTP服务器的连接。
可以使用以下代码来建立连接:delphiIDFTP.Host := 'ftp.example'; FTP服务器地址ername := 'username'; FTP登录用户名IDFTP.Password := 'password'; FTP登录密码IDFTP.Connect;上述代码中,将`Host`、`Username`和`Password`属性设置为相应的FTP 服务器地址、登录用户名和密码,然后调用`Connect`方法建立连接。
第三步:上传文件连接成功后,可以使用IDFTP组件的`Put`方法将文件上传到FTP服务器。
可以使用以下代码实现上传功能:delphiIDFTP.Put('localfile.txt', '/remotefolder/remoteFile.txt');上述代码中,将要上传的本地文件路径作为`Put`方法的第一个参数,将要保存在服务器上的文件路径作为第二个参数。
第四步:下载文件与上传类似,可以使用`Get`方法从FTP服务器下载文件。
以下是一个示例代码:delphiIDFTP.Get('/remotefolder/remoteFile.txt', 'localfile.txt');上述代码中,将要下载的文件路径作为`Get`方法的第一个参数,将要保存在本地的文件路径作为第二个参数。
idFTPserver控件实现的ftp服务器
idFTPserver控件实现的ftp服务器program FTPServer_console;(*Sample of the usage of the TIdFtpServer component.Also shows how to use Indy in console appsCreatedby:BasGooijen(*********************)Disclaimer:Use it at your own risk, it could contain bugs.Copyright:Freeware for all use*){$APPTYPE console}usesClasses,windows,sysutils,IdFTPList,IdFTPServer,idtcpserver,IdSocketHandle,idglobal,IdHashCRC;typeTFTPServer = classprivate{ Private declarations }IdFTPServer: tIdFTPServer;procedure IdFTPServer1UserLogin( ASender: TIdFTPServerThread; const AUsername, APassword: string; varAAuthenticated: Boolean ) ;procedure IdFTPServer1ListDirectory( ASender: TIdFTPServerThread; const APath: string; ADirectoryListing: TIdFTPListItems ) ;procedure IdFTPServer1RetrieveFile( ASender: TIdFTPServerThread; const AFilename: string; var VStream: TStream ) ;procedure IdFTPServer1StoreFile( ASender: TIdFTPServerThread; const AFilename: string; AAppend: Boolean; var VStream: TStream ) ;procedure IdFTPServer1MakeDirectory( ASender: TIdFTPServerThread; var VDirectory: string ) ;// procedure IdFTPServer1GetFileSize( ASender: TIdFTPServerThread; const AFilename: string; var VFileSize: Int64 ) ;procedure IdFTPServer1ChangeDirectory( ASender: TIdFTPServerThread; var VDirectory: string ) ;// procedure IdFTPServer1CommandXCRC( ASender: TIdCommand ) ;// procedure IdFTPServer1DisConnect( AThread: TIdPeerThread ) ;protectedfunction TransLatePath( const APathname, homeDir: string ) : string;publicconstructor Create; reintroduce;destructor Destroy; override;end;constructor TFTPServer.Create;beginIdFTPServer := tIdFTPServer.create( nil ) ;IdFTPServer.DefaultPort := 1000;IdFTPServer.AllowAnonymousLogin := False;IdFTPServer.EmulateSystem := ftpsUNIX;IdFTPServer.HelpReply.text := '帮助还没实现';IdFTPServer.OnChangeDirectory := IdFTPServer1ChangeDirectory;IdFTPServer.OnChangeDirectory := IdFTPServer1ChangeDirectory;// IdFTPServer.OnGetFileSize := IdFTPServer1GetFileSize;IdFTPServer.OnListDirectory := IdFTPServer1ListDirectory;IdFTPServer.OnUserLogin := IdFTPServer1UserLogin;IdFTPServer.OnRetrieveFile := IdFTPServer1RetrieveFile;IdFTPServer.OnStoreFile := IdFTPServer1StoreFile;IdFTPServer.OnMakeDirectory := IdFTPServer1MakeDirectory;IdFTPServer.Greeting.Text.Text := '欢迎进入FTP服务器! ';IdFTPServer.Greeting.NumericCode := 220;// IdFTPServer.OnDisconnect := IdFTPServer1DisConnect;// with mandHandlers.add do// begin// Command := 'XCRC';// OnCommand := IdFTPServer1CommandXCRC;// end;IdFTPServer.Active := true;end;{function CalculateCRC( const path: string ) : string;varf: tfilestream;value: dword;IdHashCRC32: TIdHashCRC32;beginIdHashCRC32 := nil;f := nil;tryIdHashCRC32 := TIdHashCRC32.create;f := TFileStream.create( path, fmOpenRead or fmShareDenyWrite ) ;value := IdHashCRC32.HashValue( f ) ;result := inttohex( value, 8 ) ;finallyf.free;IdHashCRC32.free;end;end;procedureTFTPServer.IdFTPServer1CommandXCRC( ASender: TIdCommand ) ;// note, this is made up, and not defined in any rfc.vars: string;beginwith TIdFTPServerThread( ASender.Thread ) dobeginif Authenticated thenbegintrys := ProcessPath( CurrentDir, ASender.UnparsedParams ) ;s := TransLatePath( s,TIdFTPServerThread( ASender.Thread ) .HomeDir ) ;ASender.Reply.SetReply( 213, CalculateCRC( s ) ) ;exceptASender.Reply.SetReply( 500, 'file error' ) ;end;end;end;end;}destructor TFTPServer.Destroy;beginIdFTPServer.free;inherited destroy;end;function StartsWith( const str, substr: string ) : boolean;beginresult := copy( str, 1, length( substr ) ) = substr;end;function BackSlashToSlash( const str: string ) : string;vara: dword;beginresult := str;for a := 1 to length( result ) doif result[a] = '/' thenresult[a] := '/';end;function SlashToBackSlash( const str: string ) : string;vara: dword;beginresult := str;for a := 1 to length( result ) doif result[a] = '/' thenresult[a] := '/';end;function TFTPServer.TransLatePath( const APathname, homeDir: string ) : string;vartmppath: string;beginresult := SlashT oBackSlash( homeDir ) ;tmppath := SlashT oBackSlash( APathname ) ;if homedir = '/' thenbeginresult := tmppath;exit;end;if length( APathname ) = 0 thenexit;if result[length( result ) ] = '/' thenresult := copy( result, 1, length( result ) - 1 ) ;if tmppath[1] <> '/' thenresult := result + '/';result := result + tmppath;end;{function GetSizeOfFile( const APathname: string ) : int64;beginresult := FileSizeByName( APathname ) ;end;}function GetNewDirectory( old, action: string ) : string;vara: integer;beginif action = '../' thenbeginif old = '/' thenbeginresult := old;exit;end;a := length( old ) - 1;while ( old[a] <> '/' ) and ( old[a] <> '/' ) dodec( a ) ;result := copy( old, 1, a ) ;exit;end;if ( action[1] = '/' ) or ( action[1] = '/' ) thenresult := actionelseresult := old + action;end;procedure TFTPServer.IdFTPServer1UserLogin( ASender: TIdFTPServerThread;const AUsername, APassword: string; var AAuthenticated: Boolean ) ;beginAAuthenticated := ( AUsername = 'wjh' ) and ( APassword = 'jhw' ) ;if not AAuthenticated thenexit;ASender.HomeDir := './';asender.currentdir := '/';end;procedure TFTPServer.IdFTPServer1ListDirectory( ASender: TIdFTPServerThread; const APath: string; ADirectoryListing: TIdFTPListItems ) ;procedure AddlistItem( aDirectoryListing: TIdFTPListItems; Filename: string; ItemType: TIdDirItemType; size: int64; date: tdatetime ) ;varlistitem: TIdFTPListItem;beginlistitem := aDirectoryListing.Add;listitem.ItemType := ItemType;listitem.FileName := Filename;listitem.OwnerName := 'anonymous';listitem.GroupName := 'all';listitem.OwnerPermissions := 'rwx';listitem.GroupPermissions := 'rwx';erPermissions := 'rwx';listitem.Size := size;listitem.ModifiedDate := date;end;varf: tsearchrec;a: integer;beginADirectoryListing.DirectoryName := APath;a := FindFirst( TransLatePath( APath, ASender.HomeDir ) + '*.*', faAnyFile, f ) ;while ( a = 0 ) dobeginif ( f.Attr and faDirectory > 0 ) thenAddlistItem( ADirectoryListing, , ditDirectory, f.size, FileDateToDateTime( f.Time ) )elseAddlistItem( ADirectoryListing, , ditFile, f.size, FileDateToDateTime( f.Time ) ) ;a := FindNext( f ) ;end;FindClose( f ) ;end;procedure TFTPServer.IdFTPServer1RetrieveFile( ASender: TIdFTPServerThread;const AFilename: string; var VStream: TStream ) ;beginVStream := TFileStream.create( translatepath( AFilename, ASender.HomeDir ) , fmopenread or fmShareDenyWrite ) ;end;procedure TFTPServer.IdFTPServer1StoreFile( ASender: TIdFTPServerThread;const AFilename: string; AAppend: Boolean; var VStream: TStream ) ;beginif FileExists( translatepath( AFilename, ASender.HomeDir ) ) and AAppend thenbeginVStream := TFileStream.create( translatepath( AFilename,ASender.HomeDir ) , fmOpenWrite or fmShareExclusive ) ;VStream.Seek( 0, soFromEnd ) ;endelseVStream := TFileStream.create( translatepath( AFilename, ASender.HomeDir ) , fmCreate or fmShareExclusive ) ;end;procedure TFTPServer.IdFTPServer1MakeDirectory( ASender: TIdFTPServerThread;var VDirectory: string ) ;beginMkDir( TransLatePath( VDirectory, ASender.HomeDir ) ) ;end;{procedure TFTPServer.IdFTPServer1GetFileSize( ASender: TIdFTPServerThread;const AFilename: string; var VFileSize: Int64 ) ;begin// VFileSize := GetSizeOfFile( TransLatePath( AFilename, ASender.HomeDir ) ) ;end; }procedureTFTPServer.IdFTPServer1ChangeDirectory( ASender: TIdFTPServerThread;var VDirectory: string ) ;beginVDirectory := GetNewDirectory( ASender.CurrentDir, VDirectory ) ;end;{procedure TFTPServer.IdFTPServer1DisConnect( AThread: TIdPeerThread ) ;begin// nothing much hereend;}beginwith TFTPServer.Create dotrywriteln( '程序正在运行,按 [enter]键退出。
iPhone、iPad访问FTP服务器的设置方法
iPhone、iPad访问FTP服务器的设置方法现在拥有和使用iPhone或iPad的人越来越多,体积小、重量轻、可以随身携带。
所以在外出时携带笔记本电脑的人越来越少,但是有些时候需要用到家中电脑的文件。
下面是店铺跟大家分享的是iPhone、iPad访问FTP服务器的设置方法,欢迎大家来阅读学习。
iPhone、iPad访问FTP服务器的设置方法1.确保iPhone或iPad可以连接到互联网。
二、iPhone或iPad使用功能已经拨入到PacketiX (派克斯)搭建的服务器上。
使iPhone或iPad和需要访问的电脑在同一个局域网中。
三、接下来介绍如何搭建Windows的FTP服务器。
1、这里以Windows Server2003为例来介绍,FTP服务是Windows系统的一个组件,安装的时候需要Windows Server2003的系统安装光盘。
点击开始→设置→控制面板→添加或删除程序→添加删除Windows组件→应用程序服务器→Interne t信息服务(IIS)→“文件传输(FTP)服务”打钩→点击“确定”。
图片一2、安装完成以后,查看电脑中多了C:¥Inetpub¥ftproot目录,此时不需要做任何设置,只要把需要被访问的文件放到此目录下,其他电脑就可以在IE的地址栏里输入FTP://服务器IP地址,来访问此目录内的文件。
图片二四、在iPhone或iPad里下载并安装FTP客户端工具FTP On The Go,(此软件需要付费)图片三4、安装完成后点击FTP On The Go图标进入FTPOnTheGo客户端,在Connect T o FTPServer栏中输入Windows FTP服务器的IP 地址,然后点击Connect。
就可连接上WindowsFTP服务器,并显示出服务器内的文件目录。
图片四5、选中想要的文件,点击下面的“下载”图标,即可把文件下载到iPhone或iPad上。
idftp用法 -回复
idftp用法-回复IDFTP是一种常用的FTP(文件传输协议)组件,它允许开发人员通过程序代码来实现文件的上传和下载操作。
在这篇文章中,我将详细介绍IDFTP 的用法,以便读者能够逐步了解如何使用该组件。
第一步:引入IDFTP组件要使用IDFTP组件,首先需要在项目中引入Indy组件库。
在Delphi中,可以通过在代码的Uses语句中添加"IdFTP"来实现引入。
例如:uses IdFTP;第二步:创建和配置IDFTP组件接下来,需要在程序中创建一个IDFTP对象,然后对其进行配置。
可以在代码中添加以下语句:varFTP: TIdFTP;beginFTP := TIdFTP.Create(nil);try配置FTP连接参数FTP.Host := 'ftp.example';ername := 'username';FTP.Password := 'password';配置其他FTP选项FTP.Passive := True;FTP.TransferType := ftBinary;配置ftp连接模式FTP.DataPortProtection := ftpdpsPrivate;配置超时时间FTP.ReadTimeout := 10000;连接FTP服务器FTP.Connect;执行上传或下载操作...断开FTP连接FTP.Disconnect;finallyFTP.Free;end;end;在上述代码中,首先创建了一个TIdFTP对象,并配置了FTP的连接参数。
其中,Host属性指定了FTP服务器的地址,Username和Password属性分别指定了连接的用户名和密码。
Passive属性表示使用被动模式进行数据传输,TransferType属性指定了数据传输的类型(二进制或文本)。
DataPortProtection属性用于指定FTP连接的模式,ReadTimeout属性用于设置超时时间。
phpstudy教程之自带ftpserver使用方法详解(图文)
phpstudy教程之⾃带ftpserver使⽤⽅法详解(图⽂)
1、⽤户设置,FTP设置,IP限制等都在菜单设置下。
2、⽤户设置也很简单,看图就能明⽩。
3、如果⽆法连接ftp服务器,请检查服务器上的防⽕墙。
如果在wiin2003/2008 已经安装FTP服务器组件,
请卸载FTP服务器组件或改端⼝后再运⾏phpStudy⾃带的ftp server。
4、如果出现错误
[右] 数据 Socket 错误: 连接超时
[右] 列表错误
[右] PASV 模式失败, 尝试 PORT 模式。
被动模式是先从21端⼝向服务器发送请求,然后服务器开放空闲端⼝来进⾏连接。
⽽这个PASV开启的端⼝,因为没有在防⽕墙中打开。
为了设置⽅便,这个端⼝范围可以设置为同样的。
然后在防⽕墙中开启对应的端⼝即可。
同时将ftp客户端设为主动模式。
5、ftp客户端设为主动模式。
建立个人ftp服务器
建立个人ftp服务器建立个人ftp服务器2010-05-13 11:30建立个人FTP服务器教程以及内网、局域网设置IP,建立FTP【怎样建立个人FTP】Serv-U FTP Server5.0.0.11 final特别破解版汉化版点击下载《FTP Serv-U教程》+《FTP的建立和维护手册》点击下载在网上做过软件下载的人都知道,建立一个FTP下载服务器相对比较简单,一般用WIN2000下自带的IIS就可以,但IIS在功能上好多都不尽人如意,下面我就介绍一款功能非常强大,但使用简单的FTP服务器构建软件-Serv-U FTP Server,让我们也来体验一下自己DIY FTP服务器的快乐!在说明使用之前,让我先大致介绍一下Serv-U(本文中提到Serv-U版本为3.0.0.17),Serv-U是一个可以运行于Windows 95/98/2000/ME和Windows NT 4.0下的FTP服务器程序如图所示,有了它,你的个人电脑就可以模拟为一个FTP服务器,也就是说,你所连接的网络中的计算机用户可以访问你的个人电脑,通过FTP协议(文件传输协议)复制、移动、删除你的电脑中的文件或文件夹,可以做一切权限所允许的事情。
FTP协议规定了计算机之间的标准通讯方式,使所有不同类型,不同操作系统,不同格式的电脑之间得以互换文件。
它可以用最简单的方式创建用户帐号,并且在硬盘空间上划分一定的区域用以存放文件,让用户以各种FTP客户端软件(如CuteFTP、WS_FTP等)上传或下载所需要的文件。
有许多FTP服务器和客户端软件可用于不同的系统中,Serv-U是用于运行MS-Windows并且已安装了WinSock版本1.1兼容TCP/IP协议的个人电脑中的,这几乎包括了所有的Windows操作系统。
Serv-U由两大部分组成,引擎和用户界面。
Serv-U引擎(ServUDaemon.exe)其实是一个常驻后台的程序,也是Serv-U整个软件的心脏部分,它负责处理来自各种FTP客户端软件的FTP命令,也是负责执行各种文件传送的软件。
ftp服务器搭建教程
ftp服务器搭建教程FTP(File Transfer Protocol)是一种用于在计算机网络上进行文件传输的协议,通过使用FTP服务器,用户可以方便地上传和下载文件。
下面是FTP服务器搭建的简单教程。
第一步,选择合适的FTP服务器软件。
市场上有很多不同的FTP服务器软件可供选择,例如ProFTPD、FileZilla Server等。
根据自己的实际需求和操作系统选择适合自己的软件。
第二步,安装和配置FTP服务器软件。
下载并安装选择的FTP服务器软件后,需要对其进行配置。
在配置中,需要设置FTP服务器的监听端口、允许的用户、文件存储路径等。
此外还需要考虑安全性,设置防火墙、白名单等。
第三步,添加用户账户和权限。
在FTP服务器上创建账户是为了让用户登录并使用FTP服务。
添加用户账户时,需要设置用户名和密码,并为不同的用户设置不同的权限,如读、写、删除等。
第四步,配置FTP服务器的共享文件夹。
共享文件夹是FTP服务器上存储文件的地方,可以指定一个或多个文件夹作为共享文件夹。
在共享文件夹中,可以设置不同的权限,以限制用户对文件夹的操作。
第五步,配置FTP服务器的网络设置。
FTP服务器的网络设置包括被动模式设置和主动模式设置。
被动模式适用于服务器位于防火墙后或使用NAT路由器的情况,主动模式适用于服务器没有防火墙或位于DMZ的情况。
第六步,启动FTP服务器并连接FTP客户端进行测试。
启动FTP服务器后,可以使用FTP客户端连接FTP服务器进行测试。
在FTP客户端中,需要输入FTP服务器的IP地址、端口号、用户名和密码进行连接。
连接成功后,可以进行上传和下载文件的操作。
以上是一个简单的FTP服务器搭建教程,希望能够帮助到你。
当然,在实际搭建过程中,还有其他一些高级配置和安全性考虑,需要根据实际情况进行相应的设置。
FTP服务器配置方法
FTP服务器配置方法FTP服务器配置方法引言FTP服务器是一种用于文件传输的网络服务,它在互联网中扮演着至关重要的角色。
本文将介绍FTP服务器的基本概念、功能和优点,并提供详细的配置步骤,帮助您设置和优化FTP服务器。
介绍FTP服务器FTP,全称为文件传输协议(File Transfer Protocol),是一种用于在网络上进行文件传输的标准网络协议。
通过FTP服务器,用户可以在客户端和服务器之间进行文件的上传、下载和删除等操作。
FTP服务器广泛应用于互联网、企业内部网和局域网中,为各类用户提供稳定、高效的文件传输服务。
安装FTP服务器首先,需要选择一个合适的FTP服务器软件,例如Apache、ProFTPD 等。
然后,根据服务器的硬件环境和操作系统,安装并配置FTP服务器软件。
以下以Linux操作系统为例,介绍安装和配置FTP服务器的基本步骤:1、打开终端,以root用户身份登录。
2、使用apt-get或yum命令安装FTP服务器软件,如vsftpd。
3、安装完成后,编辑FTP服务器配置文件/etc/vsftpd.conf,根据需要进行必要的设置。
常见的设置包括允许匿名登录、设置本地用户和匿名用户等。
31、重新启动FTP服务器软件,使配置生效。
配置FTP服务器配置FTP服务器主要是针对服务器的端口、用户和权限等参数进行设置。
以下是一些常见的配置步骤:1、打开FTP服务器的配置文件,根据需要进行修改。
常见的配置包括设置被动模式端口范围、允许或禁止某些用户或IP地址访问等。
2、创建FTP用户并设置密码。
可以使用Linux的useradd和passwd 命令创建用户,并设置密码。
3、根据需要创建FTP目录,并设置适当的权限。
确保FTP目录对用户具有正确的读写权限。
4、根据业务需求,配置FTP服务器的日志记录和审核功能。
可以设置日志文件路径、记录等级等参数。
5、重新启动FTP服务器,使配置生效。
管理FTP服务器管理FTP服务器主要包括对服务器的监控和维护。
建立ftp服务器的方法
建立ftp服务器的方法一、准备工作。
1.1 了解需求。
咱要建个FTP服务器呢,得先知道为啥建,是为了公司内部文件共享呢,还是自己存点东西方便随时下载。
这就好比盖房子,得先知道盖来干啥,是住人还是开店。
1.2 硬件和软件。
硬件方面,得有台性能还过得去的电脑或者服务器设备。
要是电脑性能太差,就像小马拉大车,肯定跑不动。
软件呢,有很多选择,像Windows系统自带一些功能可以用来搭建简单的FTP服务器,还有像FileZilla Server这种专门的软件,免费又好用。
二、使用Windows系统搭建(简单方法)2.1 启用功能。
在Windows里,找到“控制面板”,然后找到“程序和功能”,接着点“启用或关闭Windows功能”。
在里面找到“Internet Information Services”,把FTP服务器相关的选项都勾上。
这就像在一个大工具箱里找到我们要用的工具一样。
2.2 配置FTP站点。
打开IIS管理器,在里面创建一个新的FTP站点。
给站点起个名字,就像给孩子起名似的,得好记。
然后指定站点的物理路径,这就是FTP服务器上存放文件的地方。
好比仓库,得告诉别人东西放在哪儿。
再设置一下IP地址和端口号,一般默认的端口号21就行,不过要是有特殊需求也可以改。
这就像给房子定个门牌号一样。
2.3 用户权限设置。
添加用户,并且给用户设置权限。
是只读呢,还是可以读写。
这就好比在仓库里,有的人只能看,有的人能拿东西放东西。
权限设置不好,就可能乱套,就像家里没规矩一样。
三、使用FileZilla Server搭建。
3.1 下载安装。
先去FileZilla的官方网站下载FileZilla Server软件。
下载安装过程就像普通软件一样,一路点“下一步”就行,简单得很,别想得太复杂,就像吃面条一样顺溜。
3.2 初始设置。
安装好之后打开软件,会有个初始设置向导。
跟着向导一步一步来,设置监听的IP地址和端口号。
这里要注意,别和其他程序冲突了,不然就像两个小孩抢一个玩具,会打架的。
Indy9的IdFTP完全使用
无幻潜心成魔.....I ndy9的IdFTP完全使用分类: 4.2 Delphi编程 2011-04-29 16:13 932人阅读 评论(0) 收藏举报Delphi 7自带的INDY控件,其中包含了IdFTP,可以方便的实现FTP客户端程序,参考自带的例子,其中有上传、下载、删除文件,但是不包含对文件夹的操作,得自己实现上传、下载、删除整个文件夹(带子目录和文件)。
于是自己参考了网上的资料,重新整理下,使用归纳如下示例工程所示:窗体上放置TIdFTP、TIdAntiFreeze组件,还有其他一些基本控件。
当在列表框选择的是“文件夹”时,点击“下载”、“删除”就会对此文件夹进行下载或删除,若是选择的是“文件”类型,则对单个文件操作;上传分单个文件上传和上传整个目录。
工程源码如下:{*******************************************************} { } { 系统名称 IdFTP完全使用 } { 版权所有(C) /akof1314 } { 单元名称 Unit1.pas } { 单元功能 在Delphi 7下实现FTP客户端 } { } {*******************************************************} unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, IdFTPCommon, IdFTPList, ComCtrls, IdGlobal, IdAntiFreezeBase, IdAntiFreeze, FileCtrl; type TForm1 = class(TForm) idftp_Client: TIdFTP;edt_CurrentDirectory: TEdit; lst_ServerList: TListBox; edt_ServerAddress: TEdit; edt_UserName: TEdit; edt_UserPassword: TEdit; lbl1: TLabel; lbl2: TLabel; lbl3: TLabel; lbl4: TLabel; btn_Connect: TButton; btn_EnterDirectory: TButton; btn_Back: TButton; btn_Download: TButton; btn_Upload: TButton; btn_Delete: TButton; btn_MKDirectory: TButton; btn_Abort: TButton; mmo_Log: TMemo; pb_ShowWorking: TProgressBar; dlgSave_File: TSaveDialog; lbl_ShowWorking: TLabel; idntfrz1: TIdAntiFreeze;dlgOpen_File: TOpenDialog; btn_UploadDirectory: TButton; procedure btn_ConnectClick(Sender: TObject); procedure btn_EnterDirectoryClick(Sender: TObject); procedure btn_BackClick(Sender: TObject); procedure lst_ServerListDblClick(Sender: TObject); procedure btn_DownloadClick(Sender: TObject); procedure idftp_ClientWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); procedure idftp_ClientWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); procedure idftp_ClientWorkEnd(Sender: TObject; AWorkMode: TWorkMode); procedure FormCreate(Sender: TObject); procedure btn_AbortClick(Sender: TObject); procedure btn_UploadClick(Sender: TObject); procedure btn_DeleteClick(Sender: TObject); procedure btn_MKDirectoryClick(Sender: TObject); procedure btn_UploadDirectoryClick(Sender: TObject); private FTransferrignData: Boolean; //是否在传输数据 FBytesToTransfer: LongWord; //传输的字节大小 FAbortTransfer: Boolean; //取消数据传输 STime : TDateTime; //时间 FAverageSpeed : Double; //平均速度 procedure ChageDir(DirName: String); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm}{------------------------------------------------------------------------------- Description: 窗体创建函数 -------------------------------------------------------------------------------} procedure TForm1.FormCreate(Sender: TObject); begin Self.DoubleBuffered := True; //开启双缓冲,使得lbl_ShowWorking描述不闪烁 idntfrz1.IdleTimeOut := 50; idntfrz1.OnlyWhenIdle := False; end;{------------------------------------------------------------------------------- Description: 连接、断开连接 -------------------------------------------------------------------------------} procedure TForm1.btn_ConnectClick(Sender: TObject); begin btn_Connect.Enabled := False; ifidftp_Client.Connected then begin //已连接 try if FTransferrignData then //是否数据在传输idftp_Client.Abort; idftp_Client.Quit; finally btn_Connect.Caption := '连接';edt_CurrentDirectory.Text := '/'; lst_ServerList.Items.Clear; btn_Connect.Enabled := True;mmo_Log.Lines.Add(DateTimeToStr(Now) + '断开服务器'); end; end else begin //未连接 with idftp_Client do try Passive := True; //被动模式 Username := Trim(edt_UserName.Text); Password :=Trim(edt_UserPassword.Text); Host := Trim(edt_ServerAddress.Text); Connect();Self.ChageDir(edt_CurrentDirectory.Text); finally btn_Connect.Enabled := True; if Connected thenbtn_Connect.Caption := '断开连接'; mmo_Log.Lines.Add(DateTimeToStr(Now) + '连接服务器'); end; end; end; {------------------------------------------------------------------------------- Description: 改变目录 -------------------------------------------------------------------------------} procedure TForm1.ChageDir(DirName: String); var LS: TStringList; i: Integer; begin LS := TStringList.Create;try idftp_Client.ChangeDir(AnsiToUtf8(DirName)); idftp_Client.TransferType := ftASCII;edt_CurrentDirectory.Text := Utf8ToAnsi(idftp_Client.RetrieveCurrentDir); idftp_Client.List(LS);LS.Clear; with idftp_Client.DirectoryListing do begin for i := 0 to Count - 1 do begin ifItems[i].ItemType = ditDirectory then LS.Add(Format('%-22s%15s%-10s%s',[Utf8ToAnsi(Items[i].FileName),IntToStr(Items[i].Size),' 文件夹',DateTimeToStr(Items[i].ModifiedDate)])) else LS.Add(Format('%-22s%15s%-10s%s',[Utf8ToAnsi(Items[i].FileName),IntToStr(Items[i].Size),' 文件',DateTimeToStr(Items[i].ModifiedDate)])); end; end; lst_ServerList.Items.Clear;lst_ServerList.Items.Assign(LS); finally LS.Free; end; end;{------------------------------------------------------------------------------- Description: 进入目录按钮 -------------------------------------------------------------------------------} procedure TForm1.btn_EnterDirectoryClick(Sender: TObject); begin Self.ChageDir(edt_CurrentDirectory.Text); end; {------------------------------------------------------------------------------- Description: 后退按钮 -------------------------------------------------------------------------------} procedureTForm1.btn_BackClick(Sender: TObject); begin Self.ChageDir('..'); end;{------------------------------------------------------------------------------- Description: 双击文件夹名称,进入该目录 -------------------------------------------------------------------------------} procedure TForm1.lst_ServerListDblClick(Sender: TObject); begin if not idftp_Client.Connected then Exit; if idftp_Client.DirectoryListing.Items[lst_ServerList.ItemIndex].ItemType = ditDirectory then Self.ChageDir(Utf8ToAnsi(idftp_Client.DirectoryListing.Items[lst_ServerList.ItemIndex].FileName)); end; {------------------------------------------------------------------------------- Description: 下载按钮 -------------------------------------------------------------------------------} procedure TForm1.btn_DownloadClick(Sender: TObject); procedure DownloadDirectory(var idFTP: TIdFtp;LocalDir, RemoteDir: string); var i,DirCount: Integer; strName: string; begin if not DirectoryExists(LocalDir + RemoteDir) then begin ForceDirectories(LocalDir + RemoteDir); //创建一个全路径的文件夹mmo_Log.Lines.Add('建立目录:' + LocalDir + RemoteDir); end; idFTP.ChangeDir(AnsiToUtf8(RemoteDir)); idFTP.TransferType := ftASCII; idFTP.List(nil); DirCount := idFTP.DirectoryListing.Count; for i := 0 to DirCount - 1 do begin strName := Utf8ToAnsi(idFTP.DirectoryListing.Items[i].FileName);mmo_Log.Lines.Add('解析文件:' + strName); if idFTP.DirectoryListing.Items[i].ItemType = ditDirectory then if (strName = '.') or (strName = '..') then Continue else begin DownloadDirectory(idFTP,LocalDir + RemoteDir + '/', strName); idFTP.ChangeDir('..'); idFTP.List(nil); end else begin if (ExtractFileExt(strName) = '.txt') or (ExtractFileExt(strName) = '.html') or (ExtractFileExt(strName) = '.htm') then idFTP.TransferType := ftASCII //文本模式 else idFTP.TransferType := ftBinary; //二进制模式 FBytesToTransfer := idFTP.Size(AnsiToUtf8(strName)); ; idFTP.Get(AnsiToUtf8(strName), LocalDir + RemoteDir + '/' + strName, True); mmo_Log.Lines.Add('下载文件:' + strName); end;Application.ProcessMessages; end; end; var strName: string; strDirectory: string; begin if notidftp_Client.Connected then Exit; btn_Download.Enabled := False; strName :=idftp_Client.DirectoryListing.Items[lst_ServerList.ItemIndex].FileName; ifidftp_Client.DirectoryListing.Items[lst_ServerList.ItemIndex].ItemType = ditDirectory then begin if SelectDirectory('选择目录保存路径','',strDirectory) then beginDownloadDirectory(idftp_Client,strDirectory + '/',Utf8ToAnsi(strName)); idftp_Client.ChangeDir('..'); idftp_Client.List(nil); end; end else begin //下载单个文件 dlgSave_File.FileName :=Utf8ToAnsi(strName); if dlgSave_File.Execute then begin idftp_Client.TransferType := ftBinary; FBytesToTransfer := idftp_Client.Size(strName); if FileExists(dlgSave_File.FileName) then begin case MessageDlg('文件已经存在,是否要继续下载?', mtConfirmation, mbYesNoCancel, 0) of mrCancel: //退出操作 begin Exit; end; mrYes: //断点继续下载文件 begin FBytesToTransfer := FBytesToTransfer -FileSizeByName(strName); idftp_Client.Get(strName,dlgSave_File.FileName,False,True); end; mrNo: //从头开始下载文件 begin idftp_Client.Get(strName,dlgSave_File.FileName,True); end; end; end elseidftp_Client.Get(strName, dlgSave_File.FileName, False); end; end; btn_Download.Enabled := True; end; {------------------------------------------------------------------------------- Description: 读写操作的工作事件 -------------------------------------------------------------------------------} procedure TForm1.idftp_ClientWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); Var S: String; TotalTime: TDateTime; H, M, Sec, MS: Word; DLTime: Double; begin TotalTime := Now -STime; //已花费的时间 DecodeTime(TotalTime, H, M, Sec, MS); //解码时间 Sec := Sec + M * 60 + H * 3600; //转换成以秒计算 DLTime := Sec + MS / 1000; //精确到毫秒 if DLTime > 0 then FAverageSpeed := (AWorkCount / 1024) / DLTime; //求平均速度 if FAverageSpeed > 0 then begin Sec :=Trunc(((pb_ShowWorking.Max - AWorkCount) / 1024) / FAverageSpeed); S := Format('%2d:%2d:%2d', [Sec div 3600, (Sec div 60) mod 60, Sec mod 60]); S := '剩余时间 ' + S; end else S := ''; S := FormatFloat('0.00 KB/s', FAverageSpeed) + '; ' + S; case AWorkMode of wmRead: lbl_ShowWorking.Caption := '下载速度 ' + S; wmWrite: lbl_ShowWorking.Caption := '上传速度 ' + S; end; if FAbortTransfer then //取消数据传输 idftp_Client.Abort; pb_ShowWorking.Position := AWorkCount; FAbortTransfer := false; end; {------------------------------------------------------------------------------- Description: 开始读写操作的事件 -------------------------------------------------------------------------------} procedure TForm1.idftp_ClientWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin FTransferrignData := True; btn_Abort.Enabled := True; FAbortTransfer := False; STime := Now; if AWorkCountMax > 0 then pb_ShowWorking.Max := AWorkCountMax else pb_ShowWorking.Max := FBytesToTransfer; FAverageSpeed := 0; end;{------------------------------------------------------------------------------- Description: 读写操作完成之后的事件 -------------------------------------------------------------------------------} procedure TForm1.idftp_ClientWorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin btn_Abort.Enabled := False; FTransferrignData := False; FBytesToTransfer := 0; pb_ShowWorking.Position := 0; FAverageSpeed := 0; lbl_ShowWorking.Caption := '传输完成'; end;{------------------------------------------------------------------------------- Description: 取消按钮 -------------------------------------------------------------------------------} procedureTForm1.btn_AbortClick(Sender: TObject); begin FAbortTransfer := True; end;{------------------------------------------------------------------------------- Description: 上传按钮 -------------------------------------------------------------------------------} procedureTForm1.btn_UploadClick(Sender: TObject); begin if idftp_Client.Connected then begin ifdlgOpen_File.Execute then begin idftp_Client.TransferType := ftBinary;idftp_Client.Put(dlgOpen_File.FileName, AnsiToUtf8(ExtractFileName(dlgOpen_File.FileName))); ChageDir(Utf8ToAnsi(idftp_Client.RetrieveCurrentDir)); end; end; end;{------------------------------------------------------------------------------- Description: 删除按钮 -------------------------------------------------------------------------------} procedureTForm1.btn_DeleteClick(Sender: TObject); procedure DeleteDirectory(var idFTP: TIdFtp; RemoteDir: string); var i,DirCount: Integer; strName: string; begin idFTP.List(nil); DirCount :=idFTP.DirectoryListing.Count; if DirCount = 2 then begin idFTP.ChangeDir('..');idFTP.RemoveDir(RemoteDir); idFTP.List(nil); Application.ProcessMessages; mmo_Log.Lines.Add('删除文件夹:' + Utf8ToAnsi(RemoteDir)); Exit; end; for i := 0 to 2 do begin strName :=idFTP.DirectoryListing.Items[i].FileName; if idFTP.DirectoryListing.Items[i].ItemType = ditDirectory then begin if (strName = '.') or (strName = '..') then Continue; idFTP.ChangeDir(strName); DeleteDirectory(idFTP,strName); DeleteDirectory(idFTP,RemoteDir); end else beginidFTP.Delete(strName); Application.ProcessMessages; mmo_Log.Lines.Add('删除文件:' +Utf8ToAnsi(strName)); DeleteDirectory(idFTP,RemoteDir); end; end; end; Var strName: String; begin if not idftp_Client.Connected then exit; strName :=idftp_Client.DirectoryListing.Items[lst_ServerList.ItemIndex].FileName; ifidftp_Client.DirectoryListing.Items[lst_ServerList.ItemIndex].ItemType = ditDirectory then tryidftp_Client.ChangeDir(strName); DeleteDirectory(idftp_Client,strName);ChageDir(Utf8ToAnsi(idftp_Client.RetrieveCurrentDir)); finally end else //删除单个文件 tryidftp_Client.Delete(strName); ChageDir(Utf8ToAnsi(idftp_Client.RetrieveCurrentDir)); finally end; end; {------------------------------------------------------------------------------- Description: 新建目录按钮 -------------------------------------------------------------------------------} procedure TForm1.btn_MKDirectoryClick(Sender: TObject); var S: string; begin if InputQuery('新建目录','文件夹名称',S) and (Trim(S) <> '') then begin idftp_Client.MakeDir(AnsiToUtf8(S));Self.ChageDir(Utf8ToAnsi(idftp_Client.RetrieveCurrentDir)); end; end;{------------------------------------------------------------------------------- Description: 上传目录按钮 -------------------------------------------------------------------------------} procedure TForm1.btn_UploadDirectoryClick(Sender: TObject); functionDoUploadDir(idftp:TIdFTP;sDirName:String;sToDirName:String):Boolean; var hFindFile:Cardinal;tfile:String; sCurDir:String[255]; FindFileData:WIN32_FIND_DATA; begin //先保存当前目录sCurDir:=GetCurrentDir; ChDir(sDirName); idFTP.ChangeDir(AnsiToUtf8(sToDirName));hFindFile:=FindFirstFile( '*.* ',FindFileData); Application.ProcessMessages; ifhFindFile<>INVALID_HANDLE_VALUE then begin repeat tfile:=FindFileData.cFileName; if (tfile= '.') or (tfile= '..') then Continue; if FindFileData.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY then begin try IdFTP.MakeDir(AnsiToUtf8(tfile)); mmo_Log.Lines.Add('新建文件夹:' + tfile); except end;DoUploadDir(idftp,sDirName+ '/'+tfile,tfile); idftp.ChangeDir('..'); Application.ProcessMessages; end else begin IdFTP.Put(tfile, AnsiToUtf8(tfile)); mmo_Log.Lines.Add('上传文件:' + tfile); Application.ProcessMessages; end; until FindNextFile(hFindFile,FindFileData)=false; end else begin ChDir(sCurDir); result:=false; exit; end; //回到原来的目录下 ChDir(sCurDir); result:=true; end; var strPath,strToPath,temp: string; begin if idftp_Client.Connected then begin if SelectDirectory('选择上传目录','',strPath) then begin temp := Utf8ToAnsi(idftp_Client.RetrieveCurrentDir); strToPath := temp; if Length(strToPath) = 1 then strToPath := strToPath + ExtractFileName(strPath) else strToPath := strToPath + '/' + ExtractFileName(strPath); tryidftp_Client.MakeDir(AnsiToUtf8(ExtractFileName(strPath))); except end;DoUploadDir(idftp_Client,strPath,strToPath); Self.ChageDir(temp); end; end; end; end.运行工程如下图所示:示例源码下载:/source/3236325。
delphi idftp用法
delphi idftp用法Delphi中的IDFTP组件是用于实现FTP(文件传输协议)客户端功能的组件。
以下是使用IDFTP的基本步骤:1. 添加IDFTP组件:将IDFTP组件拖动到Delphi的窗体上或创建一个全局的IDFTP对象。
2. 设置FTP服务器信息:通过IDFTP的Host、Port和UserName属性设置FTP服务器的主机地址、端口号和用户名。
还可以设置Password属性设置登录密码。
3. 连接到FTP服务器:调用IDFTP的Connect方法来建立与FTP服务器的连接。
可以在OnConnect事件中处理连接成功之后的逻辑。
4. 执行FTP操作:通过调用IDFTP的各种方法来执行FTP操作,如上传文件、下载文件、创建目录、删除文件等。
- 使用Put方法上传文件:可以通过代码像以下示例这样上传文件:delphiIDFTP1.Put('local_file_path', 'remote_file_path');- 使用Get方法下载文件:可以通过代码像以下示例这样下载文件:delphiIDFTP1.Get('remote_file_path', 'local_file_path');- 使用MakeDir方法创建目录:可以通过代码像以下示例这样创建目录:delphiIDFTP1.MakeDir('directory_name');- 使用Delete方法删除文件:可以通过代码像以下示例这样删除文件:delphiIDFTP1.Delete('remote_file_path');5. 断开连接:使用IDFTP的Disconnect方法来断开与FTP服务器的连接。
这只是IDFTP的基本用法,还可以通过查阅IDFTP的文档来了解更多操作和事件处理的细节。
IdTCPServer简介
IdTCPServer简介Indy的全名是Internet Direct(也叫Winshoes),它是一套开放源代码的Internet控件集,它支持大部分流行的Internet协议。
IdTCPServer 在开始工作后,首先会自动建立一个侦听线程TidListenerThread,该线程负责侦听客户端的连接请求,并对每一个服务器已接受的连接创建一个TidPeerThread线程。
每个连接通过运行各自所属的TidPeerThread来实现与服务器的数据交互。
IdTCPServer 该控件包含一个完整的、多线程TCP服务器。
该控件使用一个或者多个线程监听(listen)客户机连接,使用时与TIdThreadMgr联合使用,将每个线程分配给与客户机连接的连接上。
Indy 是一个多线程控件,在Server 连接的时候,针对每客户会创建一个线程,只要有客户发送数据,就会激活Srever 的OnExecute 事件。
由于数据的接收是在各个为连接所建的线程中并发进行的。
需要做的,就是在OnExecute中识别是哪个客户(也即线程)发来的请求,针对这个客户的socket 连接返回服务就可以了。
Server 端首先是响应客户的Connect 事件,一旦连接了,就自动在服务端建立了一个连接线程。
而这个连接线程是需要Server 维护的,indy 的最大连接线程数不会大于600 个,有600 个线程你还不够用的话,基本上就不能使用indy 控件了。
TCPServer每次侦听到一个连接,就会新建一个idPeerThread,而当这个idPeerThread触发OnExecute事件的时候,就会调用IdTCPServer1Execute,///////////{ 怎样识别是哪线程发来的请求的问题?}//////////DATA线程附加信息包,可以自己定义//以便区分到底是那一个线程发来的数据。
//Indy是阻塞式(Blocking)的当你使用Winsock开发网络应用程序时,从Socket中读取数据或者向Socket写入数据都是异步发生的,这样就不会阻断程序中其它代码的执行。
用Serv-U FTP Server 架设FTP服务器
使用Serv-U FTP Server 架设FTP服务器动态IP下如何架设FTP服务器?对于那些动态IP可以用花生壳啊,申请一个免费的域名,比如我的域名就是.只要启动FTP服务器后,在ftp://就能登陆我的ftp服务器.就能登陆我的Web服务器.你这种情况用网络硬盘就可以了,不用FTP吧,那样你的一直开机.在局域网中架设FTP服务器中要注意的问题是:必须要映射广域网IP地址到你的局域网ip上,否则局域网外是无法登陆你的FTP服务器的,在路由器上“转换法规”上的“虚拟服务器”有设置。
(注意端口)核心提示:Serv-U 是一种被广泛运用的FTP服务器端软件,支持9x/ME/NT/2K 等全Windows系列。
它设置简单,功能强大,性能稳定。
这篇教程就详细介绍了如何架设FTP服务器。
Serv-U 是一种被广泛运用的FTP服务器端软件,支持9x/ME/NT/2K 等全Windows系列。
它设置简单,功能强大,性能稳定。
这篇教程就详细介绍了如何架设FTP服务器。
Serv-U FTP Server启动Serv-U adminisrator之后,出现如图界面,先看看“本地服务器”这个项目,如图,有个选项是“自动开始(系统服务)”,选中后,Serv-U就把自己注册成系统服务,开机自动运行,而且在用户没有登录的情况下就开始运行了。
这里说说Serv-U的运行方式,看看安装后的根目录,有几个文件:ServUAdmin.exe是配置管理工具,ServUTray.exe是驻留系统托盘的工具,ServUDaemon.exe是Serv-U后台运行的守护程序。
只要ServUDaemon.exe在运行,FTP就已经在运行了,其它两个程序不过是个工具,有时候Serv-U运行时系统托盘里什么也没有,但是其它人仍然可以登录你的FTP,就是因为ServUDaemon.exe在后台运行中。
下面是一些设置,注意这里的设置是全局设置,你在这里设置的最大上传下载速度还有用户数量都对下面的域或者用户的设置有限制作用,也就是说,即使在用户上设置的速度很大,实际也不会超过这里设置的值。
Linux下的Ftp Server
Red Hat Enterprise Linux As 4.3Linux下的Ftp Severssh一、什么是ftp1、文件传输协议(File Transfer Protocol,FTP)标准是在RFC959说明的。
2、协议定义了一个在远程计算机系统和本地计算机系统之间传输文件的一个标准。
3、ftp运行在OSI模型的应用层,并利用传输控制协议TCP在不同的主机之间提供可靠的数据传输。
4、ftp在文件传输中还支持断点续传功能,可以大幅度地减小CPU和网络带宽的开销。
二、ftp的特点ftp文件传输协议(file transfer protocol),他通过客户端和服务器端的ftp应用程序,在internet 上实现远程文件传送,是internet 上实现资源共享的基本手段之一,只要两台计算机遵守ftp 协议,不受操作系统的限制,就可以进行文件传输。
在实际的应用中,各种操作系统中都开发了应用于本系统的、遵守ftp协议的ftp的应用程序。
使用端口:20(ftp-data),21(ftp-control)三、ftp服务器的连接模式1、主动模式:client 先连接服务器的21端口(命令端口),然后client开放一个大于1024的端口等待服务器的20端口连接,21号端口的链接建立以后,服务器就用20去连接client开放的端口,简单来说就是服务器主动连客户端基于上面的连接方式,如果client端有个防火墙,服务器的20端口就连接不进入,导致会连接失败。
2、被动模式:就是client开启大于1024的n端口连接服务器的21(命令端口),同时开启n+1端口当21号端口连接成功后,client会发送PASV命令,通知服务器自己处于被动模式,服务器收到这个消息后,就会开放一个大于1024的端口Y通知client,client接到通知后就会用n+1来连接服务器的Y端口,简单的说就是client主动连接服务器四、ftp服务器的访问方式1、Dos:C:\>ftp | ftp 192.168.9.2542、Windows:IE, Mozilla Firefox3、Linux:# ftp | ftp 192.168.9.254gftp (text/X11)五、常见的ftp server software(软件)1、Wu-ftpd –UNIX系统早期流行的匿名自由的ftp服务器软件。
FTPServer
FTP SERVER 几点配置被动模式设置和SSL设置1、FileZilla server1.optoinsA)Passive mode setting(not use 21 or 20)Use the following IP:External IPDon’t use external IP for local connectionsUse custom port range:6000-6002(端口加入防火墙规则或路由器转发规则(TCP)B)SSL/TLS settingsGenterate new certificate…建立证书Port:990(端口加入防火墙规则或路由器转发规则(TCP))2、Serv-U1.本地服务器——设置SSL证书——应用高级:PASV端口范围:6000-60022.域服务器——设置高级——允许被动模式:External IP虚拟路径:物理路径:指定物理路径(用户目录访问中也添加此目录)映射到:用户主目录虚拟名称:用户主目录中显示名称域设置:安全性:只允许SSL/TLS会话,端口990三、FileZilla ClientA)端口990B)服务器类型:FTP OVER SSL/TLS(Implicit)(隐含加密)C)被动模式Passive mode参考FileZilla设置SSLFTPS using Explicit SSL/TLS howto (Server)ConfigurationFirst you'll want to create a certificate, this can be used in the Certificate Generator in FileZilla Server. The Generator will want country code, state, city, etc.. This information doesn't need to be correct at all, it is just used to generate the hash used to encrypt and decrypt the data being sent by the server and client.Encryption strength for the certificate is chosen at the top of the generator: 1024bit, 2048bit, 4096bit. The bigger the hash encryption the more secure the data and account information will be. There is however one thing that needs to be taken into account, CPU utilization. When you applyencryption to your FileZilla server the CPU will have to do many calculations to encrypt the data being sent and decrypt the data being received. Bandwidth will also play a factor in how much the CPU is being utilized. If you have a slower connection, lets say around 1.5mbps up you may not have to worry about CPU utilization as much. The best way to decide is to test. After you have created the Certificate enter its location into the "Private key file" field, or browse to it.If your server has a direct connection to the internet the configuration is simple, check "Enable SSL/TLS Support".Configure with NATIf you are behind NAT the transmission process can be tricky. If you are setting up SSL/TLS you may have seen "425 data connection could not be opened". While using NAT and using SSL/TLS you can't use Active FTP you have to use passive. Passive is a client side option, but passive doesn't use port 20 and 21. To minimize the available ports open to the internet you will want to set a custom range of ports. In the "Passive mode settings" menu in the server you'll want to check "Use custom port range:" set the ports you want to use for passive mode. Make sure you add these ports to port forwarding on your NAT device (Router).Enable Explicit SSL/TLS In the SSL/TLS settings menu check "allow Explicit SSL/TLS on normal connections." I recommend also checking "Force Explicit SSL/TLS" and "Force PROT P to encrypt data Channel in SSL/TLS mode." This will further enforce encryption policies. If you only want certain groups or users to have encryption you can set that up in the user or group editor. If there is data you still want available to the general public the "Force" setting should be disabled in the server settings menu, as you will need an FTP client rather than a web browser to access the FTP server.Setting up your FTP server in this way allows you to encrypt your data and login information without having to get 3rd party programs. With explicit SSL/TLS you will need a FTP client. Internet Explorer and Firefox don't support SSL/TLS without special plugins.Retrieved from /FTPS_using_Explicit_SSL/TLS_howto_ %28Server%29Serv-U安全设置(参考)作为一款精典的FTP服务器软件,SERV-U一直被大部分管理员所使用,它简单的安装和配置以及强大的管理功能的人性化也一直被管理员们称颂。
ftp server
FTP服务器架设--架设篇架设一台FTP服务器其实很简单。
首先,要保证你的机器能上网,而且有不低于ADSL 512Kbps的网络速度。
其次,硬件性能要能满足你的需要。
最后,需要安装FTP服务器端的软件,这类软件很多,可以使用微软的IIS(因特网信息服务系统),也可以使用专业软件。
不同的软件提供的功能不同,适应的需求和操作系统也不同。
一般来说,系统最低要求如下:CPU:PⅢ450MHz以上/内存:256MBSDRAM以上/带宽:ADSL512Kbps以上至于操作系统,Windows98/Me/NT/2000/XP均可,如果对服务器的性能和安全性要求很低,可以采用Windows98和WindowsMe。
本文中,如无特殊说明,均以WindowsXP专业版为操作系统,其余操作系统下FTP服务器的架设及设置均大同小异用Serv-U等第三方FTP服务器软件架设Serv-U是一种被广泛运用的FTP服务器端软件,支持Windows9x/9x/Me/NT/2000等全Windows系列。
它安装简单,功能强大,可以用同一个IP设定多个FTP服务器、限定登录用户的权限、登录主目录及空间大小、支持远程登录管理等,适合绝大部分个人自建FTP的需要。
1.安装Serv-U的安装。
先执行英文原版安装文件,按提示一路“NEXT”即可。
要注意的是,在选择安装目录时,最好选择安装在一个非系统盘里,以免将来系统发生异常时还要重新进行账号等的设置。
然后执行汉化文件,选择原版安装目录,一路“下一步”即可完成安装。
2.设置Serv-U在第一次运行时会以向导的方式一步一步地提示用户进行设置,整个过程不超过五分钟,非常人性化。
为了方便说明,先假设我们要架设一个固定IP为218.1.1.1,端口为21,根目录绝对路径为G \Ftp,允许匿名访问和拥有一个用户名为dys、密码为syd、管理账户名叫“MyFtp”的公网FTP服务器。
运行Serv-U,弹出向导窗口,依次设置如下选项:1)“您的IP地址”:这里我们填入218.1.1.1,如果你是ADSL等方式拨号上网,拥有的是动态IP或者不知道本机IP,此处请留空。
Delphi使用TIdFtp控件实现FTP协议
Delphi使用TIdFtp控件实现FTP协议现在很多应用都需要上传与下载大型文件,通过HTTP方式上传大文件有一定的局限性。
幸好FTP作为一个非常老而且非常成熟的协议可以高效稳定地完成大文件的上传下载,并且可以完美地实现续传。
就拿我写的电影服务器管理端程序来说,各种方案比较后,发现使用FTP可以完美地实现要求。
但是要通过WinSocket库实现FTP比较麻烦,幸好有Indy--一个包装了大多数网络协议的组件包。
通过Indy,程序设计人员可以通过阻塞方式进行编程,可以抛开蹩脚的Winsocket异步模式,采用与Unix系统上等同的阻塞编程模式进行。
这样,程序员就可以很好的处理程序的运行流程。
下面,我们进入到Indy的TIdFtp世界。
1.控件的说明使用Indy 9中的TIdFtp控件可以实现通过FTP方式进行文件的上传与下载。
2.控件的具体使用(1)控件属性设置默认属性即可,与服务器连接直接相关的属性如主机名与用户等在建立连接时进行设定。
需要设定的是RecvBufferSize和SendBufferSize两属性的值。
另外需要根据要传输的文件类型指定TransferType属性,而其他属性按默认值设定即可。
RecvBufferSize说明(默认值为8192字节):该属性为整型变量,用于指定连接所用的接受缓冲区大小。
SendBufferSize说明(默认值为32768字节):该属性也为整型变量,用于指定连接所用的发送缓冲区的最大值。
该属性在WriteStream方法中时,可用于TStream指定要发送内容的块数。
如果要发送的内容大于本属性值,则发送内容被分为多个块发送。
TransferType说明(默认值为ftBinary):该属性为TIdFTPTransferType型变量。
用于指定传输内容是二进制文件(ftBinary )还是ASCII文件(ftASCII)。
应用程序需要使用二进制方式传输可执行文件、压缩文件和多媒体文件等;而使用ASCII方式传输文本或超文本等文本型数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a: dword;
begin
result := str;
for a := 1 to length( result ) do
if result[a] = '\' then
result[a] := '/';
end;
function SlashToBackSlash( const str: string ) : string;
procedure IdFTPServer1ListDirectory( ASender: TIdFTPServerThread; const APath: string; ADirectoryListing: TIdFTPListItems ) ;
procedure IdFTPServer1RetrieveFile( ASender: TIdFTPServerThread; const AFilename: string; var VStream: TStream ) ;
public
constructor Create; reintroduce;
destructor Destroy; override;
end;
constructor TFTPServer.Create;
begin
IdFTPServer := tIdFTPServer.create( nil ) ;
exit;
end;
if length( APathname ) = 0 then
exit;
if result[length( result ) ] = '\' then
result := copy( result, 1, length( result ) - 1 ) ;
s := TransLatePath( s, TIdFTPServerThread( ASender.Thread ) .HomeDir ) ;
ASender.Reply.SetReply( 213, CalculateCRC( s ) ) ;
except
Disclaimer:
Use it at your own risk, it could contain bugs.
Copyright:
Freeware for all use
*)
{$APPTYPE console}
uses
Classes,
windows,
sysutils,
program FTPServer_console;
(*
Sample of the usage of the TIdFtpServer component.
Also shows how to use Indy in console apps
Created by: Bas Gooijen (bas_gooijen@)
f := TFileStream.create( path, fmOpenRead or fmShareDenyWrite ) ;
value := IdHashCRC32.HashValue( f ) ;
result := inttohex( value, 8 ) ;
finally
var
f: tfilestream;
value: dword;
IdHashCRC32: TIdHashCRC32;
begin
IdHashCRC32 := nil;
f := nil;
try
IdHashCRC32 := TIdHashCRC32.create;
var
s: string;
begin
with TIdFTPServerThread( ASender.Thread ) do
begin
if Authenticated then
begin
try
s := ProcessPath( CurrentDir, ASender.UnparsedParams ) ;
var
tmppath: string;
begin
result := SlashToBackSlash( homeDir ) ;
tmppath := SlashToBackSlash( APathname ) ;
if homedir = '/' then
begin
result := tmppath;
// procedure IdFTPServer1CommandXCRC( ASender: TIdCommand ) ;
// procedure IdFTPServer1DisConnect( AThread: TIdPeerThread ) ;
protected
function TransLatePath( const APathname, homeDir: string ) : string;
end;
function StartsWith( const str, substr: string ) : boolean;
begin
result := copy( str, 1, length( substr ) ) = substr;
end;
function BackSlashToSlash( const str: string ) : string;
// Command := 'XCRC';
// OnCommand := IdFTPServer1CommandXCRC;
// end;
IdFTPServer.Active := true;
end;
{
function CalculateCRC( const path: string ) : string;
begin
result := FileSizeByName( APathname ) ;
end;
}
function GetNewDirectory( old, action: string ) : string;
var
a: integer;
begin
if action = '../' then
var
a: dword;
begin
result := str;
for a := 1 to length( result ) do
if result[a] = '/' then
result[a] := '\';
end;
function TFTPServer.TransLatePath( const APathname, homeDir: string ) : string;
begin
if old = '/' then
begin
procedure IdFTPServer1StoreFile( ASender: TIdFTPServerThread; const AFilename: string; AAppend: Boolean; var VStream: TStream ) ;
procedure IdFTPServer1MakeDirectory( ASender: TIdFTPServerThread; var VDirectory: string ) ;
IdFTPServer.OnListDirectory := IdFTPServer1ListDirectory;
IdFTPServer.OnUserLogin := IdFTPServer1UserLogin;
IdFTPServer.OnRetrieveFile := IdFTPServer1RetrieveFile;
IdFTPServer.OnStoreFile := IdFTPServer1StoreFile;
IdFTPServer.OnMakeDirectory := IdFTPServer1MakeDirectory;
IdFTPServer.Greeting.Text.Text := '欢迎进入FTP服务器! ';
f.free;
IdHashCRC32.free;
end;
end;
procedure TFTPServer.IdFTPServer1CommandXCRC( ASender: TIdCommand ) ;
// note, this is made up, and not defined in any rfc.
IdFTPList,
IdFTPServer,
idtcpserver,
IdSocketHandle,
idglobal,
IdHashCRC;
type
TFTPServer = class
private
{ Private declarations }
ASender.Reply.SetReply( 500, 'file error' ) ;
end;
end;
end;
end;
}
destructor TFTPServer.Destroy;
begin
IdFTPServer.free;
inherited destroy;
IdFTPServer.DefaultPort := 21;
IdFTPServer.AllowAnonymousLogin := False;