610 likes | 871 Views
第 7 章 FTP 应用编程. 7.1 FTP 概述 7.2 FTP 规范 7.3 FTP 编程相关类 7.4 FTP 编程举例. 7.1 FTP 概述. FTP ( File Transfer Protocol ,文件传输协议) 是 TCP/IP 协议组中的协议之一,是 Internet 传递文件最主要的方法。 FTP 的主要功能如下: 1. 提供文件的共享,包括程序文件和数据文件; 2. 支持间接使用远程计算机; 3. 使用户不因各类主机文件存储器系统的差异而受影响; 4. 使用 TCP 提供可靠且有效的传输 。.
E N D
第7章 FTP应用编程 7.1 FTP概述 7.2 FTP规范 7.3 FTP编程相关类 7.4 FTP编程举例
7.1 FTP概述 FTP(File Transfer Protocol,文件传输协议)是TCP/IP 协议组中的协议之一,是Internet传递文件最主要的方法。 FTP 的主要功能如下: 1. 提供文件的共享,包括程序文件和数据文件; 2. 支持间接使用远程计算机; 3. 使用户不因各类主机文件存储器系统的差异而受影响; 4. 使用TCP提供可靠且有效的传输 。
7.1 FTP概述(续) FTP应用软件举例 服务器举例: (1)IIS提供的FTP服务器 适合于用户数不太多(一般10个左右),功能相对简单的场合; (2)Serv-U 目前流行的FTP服务器软件,功能强大; (3)其他FTP服务器软件,例如Secure FTP Server等
7.1 FTP概述(续) 客户端举例: (1)各类浏览器,比如IE、FireFox、Chrome等; (用法:ftp://......) (2)Windows自带“ftp”工具(命令行方式) (3)各类下载软件,常用的有: CuteFTP FlashFXP 迅雷 FlashGet 电驴 BT软件
7.1.2 FTP的工作原理 通过FTP传输文件,双方至少需要建立两个TCP连接 一个称为控制连接,用于传输FTP命令; 一个称为数据连接,用于传输文件数据。 建立控制连接后,用户通过客户机进程向服务器进程发送命令,服务器执行命令,然后将执行结果返回到客户端。
7.1.1 FTP的工作原理 以下载文件为例说明其工作原理
7.1.1 FTP的工作原理 一般情况下,使用FTP传输文件时,客户端必须首先登录服务器,获得相应的权限以后才能上传或者下载文件。 比如实验室的FTP登录时需要进行身份验证 有些场合下,服务器并不要求每个用户都拥有合法的账号,此时也就是允许匿名登录FTP。这些服务器的目的是向公众提供文件拷贝服务,匿名FTP是Internet上传输分发软件的一种基本方法。 比如:redhat等公司提供的匿名访问站点
7.1.2 FTP的数据传输方式 FTP常用的两种数据传输方式:ASCII传输方式和二进制传输方式。 1.ASCII传输方式 该方式以ASCII编码方式传输数据; 适用于传输仅包含英文的命令和参数,或者在不同的平台间传输英文文本文件的场合。 2.二进制传输方式 该方式以二进制形式数据传输时,可以指定采用哪种编码传输命令或文件数据。 适用传输程序、带中文的文件的场合。
7.1.3 文件传输模式 FTP客户端与服务器建立控制连接后,首先要告诉服务器采用哪种文件传输模式,即与服务器协商数据连接请求建立的方式。 FTP提供两种文件传输模式 主动模式(Port模式) 服务器主动向客户端发起数据连接请求; 被动模式(PASV模式) 客户端向服务器发起数据连接请求; 注意:主动和被动是从服务器的角度来说的 ;
7.1.3 文件传输模式 1. 主动模式(PORT模式) 该模式表示服务器主动连接客户端,然后传输文件。 连接建立过程: FTP客户端先用一个端口N(N>1024)向服务器的21号端口发起控制连接,连接成功后,再发出PORT N+1命令告诉服务器自己监听的端口号为N+1。 服务器接收到PORT命令后,用一个新的数据端口(一般是20号端口)与客户端的端口N+1建立连接。 服务器通过20端口进行文件数据传输,而客户端则通过监听N+1端口接收文件数据。
主动模式——控制连接和数据连接建立 工作步骤: (1)客户端的1026命令端口与服务器的21命令端口发起控制连接请求;客户端发出PORT 1027命令给服务器,同时监听1027端口; (2)控制连接建立,服务器回复“ACK”确认消息。 (3)服务器使用20数据端口与客户端的1027端口发起数据连接请求; (4)客户端给服务器返回“ACK”消息。
7.1.3 文件传输模式 主动模式的特点 FTP的客户端只是告诉服务器自己监听的端口,服务器主动与客户端监听的端口建立数据连接; 可能存在的问题: 对于客户端的防火墙来说,这是外部系统(服务器)发往内部系统(客户端)的连接;这通常会被阻塞。也就是说外部FTP服务器无法使用主动模式穿透防火墙主动连接客户端,就会造成文件数据无法传输;
7.1.3 文件传输模式 2. 被动模式 (PASV,被动模式) 该模式表示服务器被动接受客户端连接请求,即控制连接请求和数据连接请求都由客户端发起。 在此模式下,FTP客户端先随机开启一个端口N向服务器的21号端口发起控制连接,然后向服务器发送PASV命令,服务器收到此命令后,会用一个新的端口P(P>1024)进行监听,同时将该端口号告诉客户端,客户端收到响应命令后,再通过新的端口N+1连接服务器的端口P,然后进行文件数据传输。
被动模式——控制连接和数据连接建立 工作步骤: (1)客户端使用端口1026与服务器的21端口发起控制连接请求,同时向服务器发送PASV命令; (2)服务器收到命令后,将自己监听的端口2024告诉客户端。 (3)客户端使用1027端口与服务器的2024端口发起连接请求; (4)连接建立,服务器回复确认消息;
被动模式 • 被动模式特点: • 控制连接和数据连接均是由客户端主动发起连接; • 服务器与客户端进行通信时,随机选择端口P(>1024)。 • 可能存在问题: • 如果服务器安装防火墙,客户端可能无法与服务器的端口P建立数据连接请求; • 解决办法: • 实际应用中,一般服务器会指定一个端口范围,允许客户端与该范围内的端口建立数据连接。
7.1.3 文件传输模式 • 主动模式和被动模式的异同 • 共同点: • 服务器均使用21端口进行用户验证及管理; • 都有可能因防火墙的问题,造成数据连接无法建立; • 不同点: • 数据连接建立方式不同:主动模式服务器主动连接,被动模式由客户端主动连接。 • 数据传送的端口不同:主动模式的FTP服务器的数据端口固定在20,被动模式的FTP服务器的数据端口则在1025-65535之间随机产生。
7.2 FTP规范 7.2.1 FTP命令 7.2.2 FTP响应码
7.2.1 FTP命令 FTP每个命令都由3到4个字母组成,后面是该命令的参数,命令与参数之间用空格隔开。每个命令都以回车换行结束。 部分命令举例: 1.访问命令(重点介绍USER、PASS、QUIT) (1)USER命令 格式:USER <username> 功能:指定登录的用户名,以便服务器进行身份验证。此命令通常是控制连接后第一个发出的命令。
7.2.1 FTP命令(续) (2)PASS命令 格式:PASS <password> 功能:指定用户口令,该命令必须跟在登录用户名命令之后。对于需要用户口令的FTP服务器,它是完成访问控制不可缺少的一步。 (3)QUIT命令 格式:QUIT 功能:关闭与服务器的连接。
7.2.1 FTP命令(续) 其他访问命令: (4)ACCT命令 格式:ACCT <account> 功能:指定用户账号。此命令不需要和USER相关,服务器端可以设置客户端帐号,也可以限制账户访问权限。 (5)REIN命令 格式:REIN 功能:表示重新初始化用户信息。此命令终止当前USER的传输,同时终止正在传输的数据,然后重置所有参数,并打开控制连接,以便客户端再次发送USER命令。
7.2.1 FTP命令(续) 2.模式设置命令 (1)PASV命令 格式:PASV 功能:该命令告诉FTP服务器,让FTP服务器在指定的数据端口进行监听,进入被动接收请求的状态。这种方式对于有代理服务器的客户端更安全,因为客户端代理服务器不必接受传入的连接。 如果未指定任何模式,则FTP服务器默认使用PASV模式。
7.2.1 FTP命令(续) (2)PORT命令 格式:PORT <address> 功能:该命令告诉FTP服务器,客户端监听的端口号是address,让FTP服务器采用主动模式连接客户端。 程序员可以对所有FTP服务器启用PORT模式,也可以仅对特定FTP服务器启用此模式。但是要注意,如果客户端代理服务器位于防火墙之后,使PORT模式不起作用,则无法启用PORT模式,此时可以尝试使用PASV模式。
7.2.1 FTP命令(续) (3)TYPE命令 格式:TYPE < data type> 功能:指定要传输的数据类型,有ASCII(A)和BINARY(I)两种类型。 格式:MODE <mode> 功能:指定传输模式,S表示流,B表示块,C表示压缩。 例如: TYPE I //表示传输类型是Binary MODE S //传输模式是流
7.2.1 FTP命令(续) 3.文件管理命令 --------------改变目录相关的命令--------------- CWD命令 格式:CWD <directory> 功能:改变工作目录。此命令使用户可以在不同的目录或数据集下工作而不用改变它的登录或帐户信息,传输参数也不变。参数一般是目录名或与系统相关的文件集合。 PWD命令:返回当前工作目录 格式:PWD CDUP命令:回到上层目录。 格式:CDUP
7.2.1 FTP命令(续) --------------目录管理相关的命令-------------- MKD命令: 格式:MKD <directory> 功能:在指定路径下创建新目录,参数为表示特定目录的字符串。 RMD命令: 格式:RMD < directory > 功能:删除指定目录。参数为表示特定目录的字符串。
7.2.1 FTP命令(续) ------------目录下目录和文件获取命令---------- LIST命令 格式:LIST <name> 功能:返回指定路径下的子目录及文件列表,省略<路径>时,返回当前路径下的文件列表。如果路径名指定一个文件,服务器返回文件的当前信息,参数为空表示用户当前的工作目录或默认目录。 NLST命令 格式:NLST <directory> 功能:返回指定路径下的目录列表,省略<路径>时,返回当前目录。
7.2.1 FTP命令(续) ------------文件操作相关的命令---------- RNFR命令(重命名命令) 格式:RNFR <old path> 功能:重新命名文件,该命令的下一条命令应该用RNTO指定新的文件名。 RNTO命令 格式:RNTO <new path> 功能:该命令和RNFR命令共同完成对文件的重命名。 DELE命令 格式:DELE <filename> 功能:删除指定路径下的文件。
7.2.1 FTP命令(续) 4.文件传输命令:包括RETR命令和STOR命令。 (1)RETR命令 格式:RETR <filename> 功能:请求服务器将指定路径内的文件复制到客户端,也即下载指定的文件。 (2)STOR命令 格式:STOR <filename> 功能:上传一个指定的文件,并将其存储在指定的位置。如果文件已存在,原文件将被覆盖。如果文件不存在,则创建新文件。
7.2.2 FTP响应码 客户端发送FTP命令后,服务器返回约定的FTP响应码。 响应码用三位数字编码表示: 第一个数字给出有关命令状态的一般性指示; 第二个数字指示所发生的常规错误类型; 第三个数字提供了更为详细的信息。 在实际使用时,只需要知道这三位组合在一起表示什么意思就可以了。 部分响应码及其意义见表7-1。
7.2.2 FTP响应码 FTP响应码举例: 控制连接请求: (1)服务器准备就绪则返回220; (2)如果服务器接收到命令但还需要时间准备则返回110; (3)其他情况下返回420。 登录 如果客户端接收到服务器端返回220响应码,便可以相继发送USER、PASS和ACCT命令登录。
FTP客户登录以及响应码举例 使用CuteFtp与FTP服务器建立连接的验证信息: 状态:> [2012-5-15 20:49:39] 正在连接到 FTP 服务器... 218.196.207.98:21 (ip = 218.196.207.98)... 状态:> [2012-5-15 20:49:39] 已连接套接字。正在等待欢迎信息... [2012-5-15 20:49:40] 220 FTP Server v1.0 状态:> [2012-5-15 20:49:40] 已连接。正在验证身份... 命令:> [2012-5-15 20:49:40] USER mytestName [2012-5-15 20:49:40] 331 USER command OK, password required. 命令:> [2012-5-15 20:49:40] PASS ***** [2012-5-15 20:49:40] 230 User logged in success 状态:> [2012-5-15 20:49:40] 登录成功。
文件下载时命令与状态码举例 命令:> [2012-5-17 8:53:25] TYPE I [2012-5-17 8:53:25] 200 Type set to I. 命令:> [2012-5-17 8:53:25] PASV [2012-5-17 8:53:25] 227 Entering Passive Mode (192,168,0,166,13,230) 命令:> [2012-5-17 8:53:25] RETR C#中加载和卸载DLL.doc 状态:> [2012-5-17 8:53:25] 正在连接 FTP 数据套接字... 192.168.0.166:3558... [2012-5-17 8:53:25] 150 Opening BINARY mode data connection for C#中加载和卸载DLL.doc (27136 Bytes). [2012-5-17 8:53:25] 226 Transfer complete. 27,136 bytes (3,726 compressed to 13.73%) transferred. 117.38 actual KB/sec, 854.84 effective KB/sec. 状态:> [2012-5-17 8:53:25] 文件传输完毕。
上节内容回顾 FTP的工作原理 双TCP连接:控制连接和数据连接 FTP的数据传输模式 ASCII传输方式和二进制传输方式 FTP的文件传输模式(数据连接的建立方式) 主动模式(PORT) 被动模式(PASV) FTP的命令与响应码 命令(3-4个字母组成,空格隔开,回车换行结束) 响应码(3位数字表示)
7.3 FTP编程相关类 7.3.1 FtpWebRequest类 7.3.2 FtpWebResponse类 7.3.3 NetworkCredential类
7.3 FTP编程相关类 FTP应用程序一般编写方法: 服务端实现方式: 根据FTP的工作原理和命令,使用TCP协议实现FTP服务器(WinForm版)的功能; TCPListener、Socket... 客户端实现方式: 利用.NET Framework提供的封装类,简化FTP客户端程序的编写; TCPClient、Socket... FTP的封装类:FTPWebRequest、FtpWebResponse
7.3.1 FtpWebRequest类 .NET Framework提供对FTP提供支持的类 FtpWebRequest类 用于实现文件传输协议 (FTP) 客户端功能,例如上传文件、下载文件等。 FtpWebResponse类 用于封装FTP服务器对请求的响应。例如操作的状态及从服务器下载的数据等。
7.3.1 FtpWebRequest类 1.WebRequest类和WebResponse类 请求/响应模型的抽象基类。 FtpWebRequest和FtpWebResponse从这两个类派生。 其他协议封装类:HTTP、File等均从此派生 2.FtpWebRequest类 类对象的构造:先调用FtpWebRequest的Create方法,再经过强制转换得到FtpWebRequest的实例。 该方法有两种重载形式: FtpWebRequest.Create (String uriString) FtpWebRequest.Create (Uri uri)
7.3.1 FtpWebRequest类 FtpWebRequest类对象构造举例 例如: //使用字符串 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create("ftp://myFTPServer/myFile"); //使用Uri构造 Uri siteUri = new Uri("ftp:// myFTPServer/myFile"); FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(siteUri); 注意:uri可以相对也可以是绝对
7.3.1 FtpWebRequest类 1.FtpWebRequest类的常用属性 Credentials属性:获取或设置与FTP服务器通信的凭据(NetWorkCredential类型) NetworkCredential类用于为基于密码的身份验证方案提供凭据。该类可用于多种协议。在FTP中,用于提供FTP用户名和密码。 如果FTP服务器不允许匿名访问,客户端必须向服务器提供用户名和密码。 用法举例: NetworkCredentialnetworkCredential = new NetworkCredential(username, password); request.Credentials= networkCredential ;
7.3.1 FtpWebRequest类 1.FtpWebRequest类的常用属性 EnableSsl属性: 指定是否使用SSL(安全套接字层)连接 KeepAlive属性: 指示请求完成后是否保持连接 Method属性: 获取或设置发往FTP服务器的命令,通过WebRequestMethods.Ftp枚举指定; UseBinary属性: 获取或指定是否采用二进制传输
7.3.1 FtpWebRequest类 2.FtpWebRequest类的常用方法 Create方法 初始化新的WebRequest实例 GetResponse方法 返回FTP服务器响应,返回值为WebResponse对象 GetRequestStream方法 检索用于向FTP服务器上载数据的流;实现文件上传时在获取响应前使用此方法;
7.3.1 FtpWebRequest类 FtpWebRequest类的使用步骤 1.创建FtpWebRequest对象 2.设置FtpWebRequest对象的相关属性 Credentials属性(凭据) KeepAlive属性(是否保持连接) UseBinary(是否使用二进制) Method(操作命令) 3.根据设置的操作命令,获得服务器的响应,决定下一步执行的动作。 4.关闭对象
FtpWebRequest类使用举例 //第一步:创建对象 FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(ftpUriString); //第二步:设置对象的属性 NetworkCredential networkCredential=new NetworkCredential(UserName, Password); request.Credentials = networkCredential; request.KeepAlive = true; request.UseBinary = true; request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; //第三步:获得服务器的响应,确定下一步的动作 FtpWebResponse response = (FtpWebResponse)request.GetResponse(); … request.Close();//第四步:关闭对象
7.3.2 FtpWebResponse类 FtpWebResponse类封装文件传输协议 (FTP) 服务器对请求的响应。 1.FtpWebResponse类对象构造 没有构造函数,只能通过调用FtpWebRequest对象的GetResponse方法获取; 返回对象必须强制转换为FtpWebResponse类型。 例如: FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(ftpUriString); FtpWebResponse response = (FtpWebResponse)request.GetResponse();
7.3.2 FtpWebResponse类 2. FtpWebResponse类的常用属性和方法 StatusCode属性 获取从FTP服务器上发回的最新状态代码 StatusDescription属性 获取从FTP服务器上发回的状态代码文本信息 Close方法 关闭响应流 GetResponseStream方法 检索包含从FTP服务器上发送的响应数据的流;实现下载功能时使用此此方法;
FtpWebResponse对象使用举例 FtpWebResponse类的使用步骤 1.创建FtpWebResponse对象 FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(ftpUriString); FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 2.根据request对象的命令类型,确定下一步的动作 Stream responseStream = response.GetResponseStream(); … 3.关闭对象 response.Close();
7.4 FTP编程举例 7.4.1 服务器端开发 7.4.2 客户端开发