FTP客户端的设计与实现
摘要:FTP(File Transfer Protocol)即文件传输协议是TCP/IP协议族中的一个应用层协议。FTP客户端利用TCP的可靠传输服务,减少了不同文件系统间的不兼容性,实现了文件的传送功能;而且它提供了直观的文件传输操作方式,用户只需要使用鼠标拖动选择就可以完成相关操作。文章主要介绍了FTP的相关知识、Visual Basic各种控件以及Windows API函数的调用等内容。在此基础上文章最后介绍了如何使用VB完成FTP客户端应用程序的开发。
关键词:VB ; FTP ; Windows API
0 引言
FTP(File Transfer Protocol)协议即文件传输协议是TCP/IP体系结构中的一个重要协议,专门用于局域网或Internet中服务器和客户端之间进行文件传输。FTP协议利用TCP的可靠传输服务,减少了不同文件系统间的不兼容,实现了文件的传送功能。FTP极大的丰富了我们的网络生活,成为互联网上不可缺少的服务方式之一[1]。
1 设计内容
FTP使用客户/服务器方式,本课题就是设计一个FTP客户端程序,其具有以下基本功能:能完成FTP链接的打开和关闭;能实现本地和远程目录的浏览;能执行文件的上传和下载等有关操作。
2 开发工具简介
2.1 Visual Basic简介
Basic 发展到今天已经有很多版本,如 GW-Basic 、QBasic 、Visual Basic 等等。其中Visual Basic 是最容易学习与应用的程序语言之一,而且其功能也非常强大。Visual Basic 6.0自带的一些功能控件可以帮助我们实现网络通信的功能,是我们网络编程中的一个重要的编程工具。
2.2 Windows API函数介绍
Win32 API也就是Microsoft Windows 32位平台的应用程序编程接口。Windows API可以提供形形的服务,凡是在Windows操作系统环境下开发的应用程序,都可以调用Windows API。
2.3 Internet Transfer控件介绍
Internet Transfer 控件是微软为方便使用者设计Internet应用程序所提供的一种控件。它提供两种Internet protocol:HTTP及FTP。我们在使用时,必须先设置好它的存取方式。存取方式分为直接连接或通过proxy来连接Internet网络两种。当我们设置好相关参数之后,Internet Transfer 控件提供两个method(OpenURL及Execute)让我们执行网络相关操作,我们可以用这两个命令来执行一些Internet command。
2.4 Windows Socket控件
Socket由 UNIX操作系统逐步移植到Windows,Windows Socket规范于90年代初,依次有1.0、1.1、2.0和3.0。Windows Socket规范定义并记录了如何使用API;Socket是网络通信的基本操作单元,目前Windows支持两种套接口:流套接口和数据报套接口。TCP/IP中的TCP协议使用的是流套接口,提供了面向连接的、无差错的、发送先后顺序一致、包长度不限和非重复的网络信息包的传输。TCP/IP中的UDP则使用数据报套接口,该接口提供双向的、有序的、无重复并有记录边界的数据报服务。
2.5 FTP基础理论知识
FTP是TCP/IP的一种具体应用,它工作在OSI模型的第七层,TCP模型的第四层,即应用层,同时在传输层使用TCP,所以FTP客户在和服务器建立连接前就要经过一个被称作"三次握手"的过程。其连接是可靠的,传输是面向连接的,所以能为数据传输提供可靠的保证。
使用FTP时必须首先登录,在远程主机上获得相应的权限以后,方可上传或下载文件。但其违背了Internet的开放性,为此系统管理员建立了一个特殊的用户ID,名为anonymous, Internet上的任何人在任何地方都可使用该用户ID。习惯上,人们用自己的E-mail地址作为口令。
2.6 FTP工作原理
FTP协议中,控制连接均由客户端发起,而数据连接有两种工作方式:PORT方式和PASV方式。下面以PORT方式为例,如图1所示:
①FTP服务器运行FTP守护进程,等待用户的FTP请求。
②用户运行FTP命令,请求FTP服务器为其服务
③FTP守护进程收到用户的FTP请求后,派生出FTP子进程与用户进程
交互,建立文件传输控制连接,使用TCP端口21。
④用户输入FTP子命令,服务器接收子命令,如命令正确,双方各派生一个数据传输进程FTP-DATA,建立数据连接,使用TCP端口20进行数据传输。
⑤本次子命令请求的数据传输完毕,拆除数据连接,结束FTP-DATA进程。
⑥用户继续输入FTP子命令,重复④、⑤的过程,直至用户输入quit命令,
双方拆除控制连接,结束文件传输,结束FTP子进程。
图1 FTP工作原理示意图
3 详细设计
3.1 程序数据流程图
FTP的客户端程序设计的主要内容如图2所示:客户登录模块、FTP服务器目录浏览模块、上传和下载模块。设计流程:客户端程序先连接服务器,然后浏览FTP服务器目录,选择文件下载或上传,进行文件数据传输,最后断开连接[2,3]。
3.2 系统界面设计
系统界面主要包括以下几个方面的内容:登录部分、远程目录浏览部分、本地目录文件浏览部分等。系统界面是在新建窗体的基础上将其Caption改为“FTP客户端”,增加相应的文本框、命令按钮等一些控件实现,具体如图3所示
图2 程序数据流程图
图3 系统界面
3.3 模块设计
3.3.1 登录模块
为使客户端能登录服务器,须设置以下属性:
◆FTP服务器地址 :txtserver
◆ 用户名 :txtuser
◆密码 :txtpassword
◆端口号 :txtport(一般为21 )
txtuser及txtpassword代表登录此FTP服务器所需要的用户名及密码,若两者皆为空字符串,则代表是以anonymous(匿名)身份登入;若输入用户名与密码,Connect会以此做为其用户名及密码与FTP服务器建立连接;随后是对“连接”按钮的设置,实现与服务器端的连接[4]。
以下为“连接”命令按钮的代码:
Private Sub cmdConnect_Click()
If Not bActiveSession And hOpen <> 0 Then
If txtServer.Text = "" Then
MsgBox "Please enter a server name!"
Exit Sub
End If
Dim nFlag As Long
If chkPassive.Value Then
nFlag = INTERNET_FLAG_PASSIVE
Else
nFlag = 0
End If
If hConnection = 0 Then
bActiveSession = False
ErrorOut Err.LastDllError, "InternetConnect"
Else
bActiveSession = True
EnableUI (CBool(hOpen))
FillTreeViewControl (txtServer.Text)
FtpEnumDirectory ("")
If EnumItemNameBag.Count = 0 Then Exit Sub
FillTreeViewControl (txtServer.Text)
End If
End If
End Sub
3.3.2 浏览模块
3.3.2.1 远程端浏览模块
本模块是通过对treeview控件的设置以及相关代码的编写来实现对FTP服务器默认目录与文件的读取。当建立连接成功之后,通过函数调用取得FTP服务器端默认最大的目录(FTP服务器针对不同用户开放不同的目录名称)。当然FTP服务器端也必须开放目录读取权限,允许客户端连接登录及浏览目录,否则Connect的执行将失效[5,6,7]。
3.3.2.2 本地浏览模块
本地浏览模块通过DriveComboBox、DirectoryListBox和FileListBox三个控件设计实现。DriveComboBox用于设置驱动器,DirectoryListBox用于显示当前驱动器所有文件与目录,FileListBox用于显示所选中的文件夹中的所有文件。
3.3.3 文件上传下载模块
文件传输是一个双向的过程,既可以把服务器上的文件下载到指定的文件下,也可以把本地某文件上传到服务器。
3.3.3.1 文件下载模块
文件下载是通过点击“下载”按钮来完成对选定的远程目录下文件的下载。此功能实现主要是通过程序获取本地和远程的当前路径,区分被选中的内容类型为文件还是目录,若为文件时执行下载过程,否则退出。
以下为“下载”命令按钮的代码[8]:
Private Sub cmdGet_Click()
Dim bRet As Boolean
Dim szFileRemote As String, szDirRemote As String, szFileLocal As String
Dim szTempString As String
Dim nPos As Long, nTemp As Long
Dim nodX As Node
Set nodX = TreeView1.SelectedItem
If bActiveSession Then
If nodX Is Nothing Then
MsgBox "Please select the item to GET!"
Exit Sub
End If
szTempString = TreeView1.SelectedItem.Text
szFileRemote = szTempString
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论