基于VB多线程技术的FTP的实现

合集下载

VB实现SFTP下载和上传的功能

VB实现SFTP下载和上传的功能

VB实现SFTP下载和上传的功能背景 因为安全原因,需要SFTP协议(sftp是Secure File Transfer Protocol的缩写,安全。

可以为传输⽂件提供⼀种安全的加密⽅法。

sftp 与ftp 有着⼏乎⼀样的语法和功能。

SFTP 为的⼀部份,是⼀种传输档案⾄ Blogger 伺服器的安全⽅式。

其实在SSH软件包中,已经包含了⼀个叫作SFTP(Secure File Transfer Protocol)的安全⽂件传输⼦系统,SFTP本⾝没有单独的,它必须使⽤sshd守护进程(号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像⼀个程序,⽽更像是⼀个客户端程序。

SFTP同样是使⽤加密传输认证信息和传输的数据,所以,使⽤SFTP是⾮常安全的。

但是,由于这种传输⽅式使⽤了加密/,所以⽐普通的要低得多,如果您对⽹络安全性要求更⾼时,可以使⽤SFTP代替FTP)准备阶段 需要引⽤第三⽅类库Tamir.SharpSSH.dll。

链接地址()我下载的是(Download binaries: )⽂件 把Tamir.SharpSSH.dll加载到项⽬中。

实现阶段 增加⼀个类SFTPHelper1Imports Tamir.SharpSsh.jsch23Public Class SFTPHelper4Private m_session As Session5Private m_channel As Channel6Private m_sftp As ChannelSftp78Public Sub New(ByVal host As String, ByVal user As String, ByVal pwd As String)9Dim arr() As String = host.Split(":")10Dim ip As String = arr(0)11Dim port As Integer = 2212If (arr.Length > 1) Then13 port = Int32.Parse(arr(1))14End If1516Dim jsch As JSch = New JSch()17 m_session = jsch.getSession(user, ip, port)18Dim ui As MyUserInfo = New MyUserInfo()19 ui.setPassword(pwd)20 m_session.setUserInfo(ui)21End Sub2223'SFTP获取⽂件24Public Function GetInfo(ByVal remotePath As String, ByVal localPath As String) As Boolean25Try26Dim src As Tamir.SharpSsh.java.String = New Tamir.SharpSsh.java.String(remotePath)27Dim dst As Tamir.SharpSsh.java.String = New Tamir.SharpSsh.java.String(localPath)28 m_sftp.get(src, dst)29Return True30Catch31Return False32End Try33End Function34'SFTP连接状态35Public Property Connected As Boolean36Get37Return m_session.isConnected()38End Get39Set(ByVal value As Boolean)4041End Set42End Property4344'连接SFTP45Public Function Connect() As Boolean46Dim flag As Boolean = False47Try48If (Not Connected()) Then49 m_session.connect()50 m_channel = m_session.openChannel("sftp")51 m_channel.connect()52 m_sftp = m_channel53 flag = True54End If55Catch56 flag = False57End Try58Return flag59End Function6061'断开SFTP62Public Sub Disconnect()6364If (Connected()) Then65 m_channel.disconnect()66 m_session.disconnect()67End If68End Sub6970'登录验证信息71Public Class MyUserInfo72Implements UserInfo7374Dim passwd As String7576Public Sub setPassword(ByVal ppasswd As String)77 passwd = ppasswd78End Sub79Public Function getPassphrase() As String Implements erInfo.getPassphrase80Return Nothing81End Function82Public Function getPassword() As String Implements erInfo.getPassword83Return passwd84End Function8586Public Function promptPassphrase(ByVal message As String) As Boolean Implements erInfo.promptPassphrase87Return True88End Function89Public Function promptPassword(ByVal message As String) As Boolean Implements erInfo.promptPassword90Return True91End Function92Public Function promptYesNo(ByVal message As String) As Boolean Implements erInfo.promptYesNo93Return True94End Function95Public Sub showMessage(ByVal message As String) Implements erInfo.showMessage9697End Sub98End Class99100End Class 这⾥我只实现了下载的功能,上传的功能修改后加上。

在VB中通过API函数实现FTP功能

在VB中通过API函数实现FTP功能


B V l is Dr c oy A t i )A o la ya p zi e tr sS r n s B oe n g
’ 把文件上传到 FP 服务器上 T

D t玎一包禽要到达的 目 i 0 1 录名.可以是相对的或绝对的路径。
P ia e D c a e F n t o tP t ie L b w n n t d l A / s r v t e lr u c i n F pu F l i i ie . l 1 a F p uF l A tP t ie
B V ld C ne tA o g A o la ya  ̄o t x s Ln ) s Bo en


lFr ie t s耵 鹇 2F m ^^ pi 心 l啮 aA - I n T,
d F as A w lg s 噶

s Lc F l ̄ z oali e-要 发 送 的 文件 名
C n tF L TR B I O ES D=& 8o’ o s I EA T IIE C ̄R S E / H 0 被压缩的文件和 目录
C n t F L T R B T ( ZI E =  ̄{O 0 o s IE A T IU E  ̄ N Jl 0
_
0 a F pe s o s Ln , vl h tS s in A og
’ ̄o t x - 要取回的文件的描述表标识符 d net ’ 下载 文件
’ w l g 一 数据 传输的方式 ,通常 设置为 0 A C 方式 ) dFa s ,(S I I
’ 续由F p i d i s F l )函数发起的文件搜索操作 继 t F n F r t i e(
P ia e D ca eF c i ̄ It re F n e t ieL b w nn t rv t e lr a to n en t i ̄ x F l i ii e. n

VB开发的FTP上传文件

VB开发的FTP上传文件

公司里有个VB开发的软件要做个ftp上传文件功能,基本实现方法如下:1、inet控件添加:打开VB,新建一个工程,新建一个窗体Form1,点击VB6.0上面的工程-部件-控件-选择“Microsoft Internet Transfer 6.0 (SP4)”-应用-确定;这样,把inet控件添加到了左侧的工具栏2、界面控件添加:在FORM1窗体中添加4个控件(1)iinet1 (这个就是刚添加的inet控件)(2)Command1(3)label3(4)text13、建文件目录:FTP目录:ftp://192.192.0.35用户名:ftpID 密码:ftpPWD本地要上传的文件目录:D:\Vbinet(向D:\Vbinet目录下添加文件DD.txt用于测试)4、代码:Option ExplicitPrivate Sub Command1_Click()Dim filename, putfile As String'设置FTP的地址、协议类型、用户名、密码Inet1.URL = "ftp://192.192.0.35" 'FTP的地址Inet1.Protocol = icFTP'协议类型erName = "ftpID" 'FTP的用户名Inet1.Password = "ftpPWD" 'FTP的密码'以下是同一文件夹下多文件上传'(把D:\VBinet文件夹下的所有txt文件上传到ftp://192.192.0.35的receive目录下)filename = Dir("D:\VBinet\*.txt")' If filename <> "" ThenDo While filename <> ""Text1.Text = filename & vbCrLf & Text1.Textputfile = "put D:\VBinet\" & filename & " " & "receive\" & filenameInet1.Execute , putfileDo While Inet1.StillExecutingDoEventsLoopfilename = DirLoop'以下是单文件上传'(把D:\VBinet文件夹下的DD.txt文件上传到ftp://192.192.0.35的receive目录下)'Inet1.Execute , "put D:\VBinet\DD.txt receive\DD.txt"'Do While Inet1.StillExecuting'DoEvents'LoopEnd SubPrivate Sub Inet1_StateChanged(ByVal State As Integer) Dim temp As StringSelect Case StateCase icNoneCase icResolvingHosttemp = "正在查找"Case icHostResolvedtemp = "已找到IP地址"Case icConnectingtemp = "正在连接。

在vb中利用Winsock控件实现FTP编程

在vb中利用Winsock控件实现FTP编程

在vb中利用Winsock控件实现FTP编程利用Winsock控件实现FTP编程一引言随着计算机在铁路各部门的普及,办公无纸化逐渐成为一种趋势,文件、资料、报表等数据的传送都通过计算机网络来完成。

FTP成为传送这些数据的流行工具。

为了更好地使用FTP,应该了解和掌握FTP 编程。

只有把FTP内嵌到应用程序中去,FTP的应用才更灵活,才能满足各种数据传输的需要。

本文以VB中的Winsock控件为工具,根据FTP的基本原理,阐明了FTP客户端编程的一般方法。

二FTP客户端与服务器间的基本协作过程下面是FTP模型的基本原理图:服务器数据传输进程客户端数据传输进程文件系统服务器协议接口客户端协议接口用户界面用户FTP命令FTP响应数据连接文件系统服务器FTP 客户端FTP1、客户端与服务器连接FTP是建立在TCP之上的连接,端口号使用21。

若客户端与服务器之间成功连接,服务器将返回字符串,如:220 GMS (Version 5.0)前三个字符220表示客户端与服务器成功连接,后面的字符会因服务器的不同而不同,但我们只关心前三个字符。

2、用户名和密码认证客户端发送用户名给服务器,如:USER guo如果服务器找到用户名guo,将返回字符串,如:331 User name okay, need password.接着客户端应发送密码给服务器,如:PASS aaa密码正确,返回如:230 User logged in, proceed.如果用户名或密码认证没通过,返回如:530 Not logged in.用户名也可以使用匿名,如:USER anonymous返回如:331 Anonymous access allowed,send identity (e-mail name) as password.3、建立数据连接FTP协议用两个连接来达到客户机与服务器之间交换数据的目的。

刚才建立了第一个连接——控制连接,它用于传送命令和响应。

VB+FTP删除文件代码

VB+FTP删除文件代码
Public Function 文件改名(ByVal 原文件名 As String, ByVal 新文件名 As String)
If 连接状态 = True Then
ReturnVal& = FtpRenameFile(连接句柄, 原文件名, 新文件名)
Else
Dim 连接状态 As Boolean
Dim 连接句柄 As Long
Public Function 连接服务器(IP As String, 端口 As Integer, 帐号 As String, 密码 As String) As Boolean
Dim 初始化 As Long
MsgBox "请先确认连接"
End If
End Function
初始化 = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0&)
连接句柄 = InternetConnect(初始化, IP, 端口, 帐号, 密码, 1, 0, 0)
Private Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean
Private Declare Function FtpRenameFile Lib "wininet.dll" Alias "FtpRenameFileA" (ByVal hFtpSession As Long, ByVal lpszExsiting As String, ByVal lpszNew As String) As Boolean

精易模块 ftp 用法

精易模块 ftp 用法

精易模块ftp 用法精易模块FTP 用法简介:精易模块(JEasy)是一款基于Visual Basic 编写的模块库,其中包含了许多对于软件开发非常有用的功能和工具。

其中包括了一个用于连接和操作FTP(文件传输协议)服务器的模块,该模块可以帮助开发人员轻松地实现文件的上传和下载功能。

本文将详细介绍精易模块FTP 的用法,并提供一步一步的指南,帮助读者快速掌握这一功能。

目录:1. 安装和配置精易模块2. 连接FTP 服务器3. 上传文件到FTP 服务器4. 从FTP 服务器下载文件5. 删除FTP 服务器上的文件6. 列出FTP 服务器上的文件7. 断开与FTP 服务器的连接1. 安装和配置精易模块首先,我们需要下载并安装精易模块库,确保它可以被我们的开发环境使用。

下载地址为:[精易模块下载地址]。

安装完成后,我们需要在我们的项目中引入JEasy 模块。

在VB 项目的工具箱中,右键单击并选择“选择项”。

在“选择项目”对话框中,找到JEasy 模块并选中它,然后点击“确定”按钮。

2. 连接FTP 服务器在我们的VB 项目中,首先需要添加以下引用:Imports Imports .SocketsImports JEASYFTP在代码中,我们需要创建一个JEASYFTP 对象来连接到FTP 服务器。

使用以下代码来实现:Dim Ftp As New FtpClsFtp.FtpConnect("ftp.example", "username", "password")在上述代码中,需要将"ftp.example" 替换为你要连接的FTP 服务器的主机名或IP 地址,"username" 替换为你的用户名,"password" 替换为你的密码。

3. 上传文件到FTP 服务器要上传文件到FTP 服务器,只需使用以下代码:Ftp.FtpPut("localfile.txt", "remotefile.txt")上述代码中,需要将"localfile.txt" 替换为本地文件的路径,"remotefile.txt" 替换为上载到FTP 服务器的文件的名称。

基于vb环境WINDOWS API的ftp上传下载服务的实现

基于vb环境WINDOWS API的ftp上传下载服务的实现

基于vb的ftp上传下载服务的实现Option ExplicitPublic Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _ (ByVal sAgent As String, ByVal LAccessType As Long, ByVal sProxyName As String, _ ByVal SProxyBypass As String, ByVal lFlags As Long) As LongPublic Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _(ByVal hInternetSession As Long, ByVal sServerName As String, _ByVal nServerPort As Integer, ByVal sUsername As String, _ByVal sPassword As String, ByVal lService As Long, _ByVal lFlags As Long, ByVal lContext As Long) As LongPublic Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" _(ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, _ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, _ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, _ByVal dwContext As Long) As BooleanPublic Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _(ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _ByVal lpszRemoteFile As String, ByVal dwFlags As Long, _ByVal dwContext As Long) As BooleanPublic Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" _ (ByVal hFtpSession As Long, ByVal lpszFileName As String) As BooleanPublic Declare Function FtpRenameFile Lib "wininet.dll" Alias "FtpRenameFileA" _ (ByVal hFtpSession As Long, ByVal lpszExsiting As String, ByVal lpszNew As String) As BooleanPublic Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As IntegerPublic Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _ (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, _lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, _ByVal dwContent As Long) As LongPublic Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _(ByVal hFind As Long, lpvFndData As WIN32_FIND_DATA) As LongPublic Type FILETIMEdwLowDateTime As LongdwHighDateTime As LongEnd TypePublic Type WIN32_FIND_DATAdwFilAttributes As LongftCreationTime As FILETIMEftLastAccessTime As FILETIMEftLastWriteTime As FILETIMEnFileSizeHigh As LongnFileSizeLow As LongdwReserved0 As LongdwReserved1 As LongcFileName As String * 260cAlternate As String * 14End TypePublic Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _ "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As LongType OPENFILENAMElStructSize As LonghwndOwner As LonghInstance As LonglpstrFilter As StringlpstrCustomFilter As StringnMaxCustFilter As LongnFilterIndex As LonglpstrFile As StringnMaxFile As LonglpstrFileTitle As StringnMaxFileTitle As LonglpstrInitialDir As StringlpstrTitle As Stringflags As LongnFileOffset As IntegernFileExtension As IntegerlpstrDefExt As StringlCustData As LonglpfnHook As LonglpT emplateName As StringEnd TypePrivate Sub Command1_Click()lnginet = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, _ vbNullString, vbNullString, 0&)If lnginet Thenlnginetconn = InternetConnect(lnginet, "ip地址", 0, _"用户名", "密码", 1, 0, 0)If lnginetconn ThenblnRC = FtpGetFile(lnginetconn, "website/address.asp", "c:\address.asp", 0, 0, 1, 0)If blnRC ThenMsgBox "download ok!!!"End IfInternetCloseHandle lnginetconnInternetCloseHandle lnginetMsgBox "close ok!!!"ElseMsgBox "can't connect"End IfElseMsgBox "ftp wrong"End IfEnd SubPrivate Sub Command2_Click()Dim pData As WIN32_FIND_DATADim lngHINet As LongDim intError As IntegerDim strT emp As StringDim blnRC As BooleanpData.cFileName = String(260, 0)lnginet = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, _ vbNullString, vbNullString, 0&)If lnginet Thenlnginetconn = InternetConnect(lnginet, "IP地址", 0, _"用户名", "密码", 1, 0, 0)If lnginetconn ThenlngHINet = FtpFindFirstFile(lnginetconn, "*.*", pData, 0, 0)strT emp = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)DopData.cFileName = String(260, 0)blnRC = InternetFindNextFile(lngHINet, pData)If Not blnRC ThenExit DoElsestrT emp = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)End IfLoopT ext1.T ext = strT empEnd IfEnd IfInternetCloseHandle lngHINetInternetCloseHandle lnginetconnInternetCloseHandle lnginetEnd Sub在FTP中,Put、Rename、Delete是怎样的?这些函数也相当简单。

在vb中利用Winsock控件实现FTP编程

在vb中利用Winsock控件实现FTP编程

利用Winsock控件实现FTP编程一引言随着计算机在铁路各部门的普及,办公无纸化逐渐成为一种趋势,文件、资料、报表等数据的传送都通过计算机网络来完成。

FTP成为传送这些数据的流行工具。

为了更好地使用FTP,应该了解和掌握FTP编程。

只有把FTP内嵌到应用程序中去,FTP的应用才更灵活,才能满足各种数据传输的需要。

本文以VB中的Winsock控件为工具,根据FTP的基本原理,阐明了FTP客户端编程的一般方法。

二FTP客户端与服务器间的基本协作过程下面是FTP模型的基本原理图:服务器数据传输进程客户端数据传输进程文件系统服务器协议接口客户端协议接口用户界面用户FTP命令FTP响应数据连接文件系统服务器FTP 客户端FTP1、客户端与服务器连接FTP是建立在TCP之上的连接,端口号使用21。

若客户端与服务器之间成功连接,服务器将返回字符串,如:220 GMS (Version 5.0)前三个字符220表示客户端与服务器成功连接,后面的字符会因服务器的不同而不同,但我们只关心前三个字符。

2、用户名和密码认证客户端发送用户名给服务器,如:USER guo如果服务器找到用户名guo,将返回字符串,如:331 User name okay, need password.接着客户端应发送密码给服务器,如:PASS aaa密码正确,返回如:230 User logged in, proceed.如果用户名或密码认证没通过,返回如:530 Not logged in.用户名也可以使用匿名,如:USER anonymous返回如:331 Anonymous access allowed,send identity (e-mail name) as password.3、建立数据连接FTP协议用两个连接来达到客户机与服务器之间交换数据的目的。

刚才建立了第一个连接——控制连接,它用于传送命令和响应。

我们还要建立第二个连接——数据连接,用于数据传输。

浅谈在VB中实现FTP文件传输的技巧

浅谈在VB中实现FTP文件传输的技巧

浅谈在VB中实现FTP文件传输的技巧
魏文红;吴清江
【期刊名称】《福建电脑》
【年(卷),期】2004(000)001
【摘要】本文基于FTP的传输协议,系统地介绍地在VB中使用WINSOCK和INET控件实现文件的有条件传输,特别是针对大型企业各部门之间数据信息文件之间的传输有很大的优势.
【总页数】2页(P79,68)
【作者】魏文红;吴清江
【作者单位】华侨大学计算机系,福建,泉州,362011;华侨大学计算机系,福建,泉州,362011
【正文语种】中文
【中图分类】TP3
【相关文献】
1.用RPC_FTP实现分布式系统中的文件传输 [J], 陈柱成;郝克刚;葛玮;朱浩悦
2.基于FTP协议的文件传输组件设计与实现 [J], 王占军;王伟;赵志刚
3.文件传输软件WS-FTP使用方法及技巧 [J], 沈柏竹;赵立民;赵秀英
4.基于SDK包实现FTP文件传输 [J], 慕文静;郑鑫;曾海燕
5.基于VS的FTP文件传输设计与实现 [J], 宋毅
因版权原因,仅展示原文概要,查看原文内容请购买。

VB编程FTP(微软详实案例附带源程序)

VB编程FTP(微软详实案例附带源程序)

实例7 FTP客户端程序目标和要点实例目标本实例将介绍创建FTP客户端程序并进行与FTP服务器连接的实例,程序运行的结果如图所示。

图启动窗体:图7-1 Ftp客户端程序运行时的启动窗体主窗体:图7-2 Ftp客户端程序运行时的主窗体175本例中利用API函数实现与FTP服务器的连接与对话,可以根据主机服务器的地址和端口连接到Internet上任何一台FTP服务器上,对FTP服务器进行文件上载、文件下载等操作。

技术要点本实例的技术要点主要包括:1.建立FTP连接的基本原理与步骤2.建立FTP连接的要使用到的API函数3.对FTP进行文件与目录操作在本实例中,与FTP服务器的连接与对话是通过API函数来实现的,建立连接必须遵循一定的步骤和规则,才能正确地与FTP服务器取得连接和对话,总的说来,建立连接的步骤一般分为以下几步:①打开Internet会话②建立FTP类型的Internet连接③设置FTP服务器的当前目录④查看FTP服务器上指定目录下的文件⑤从FTP服务器当前目录下载文件或上载文件⑥在FTP服务器上进行目录或文件操作,如创建新目录,删除目录,删除文件等⑦关闭与FTP服务器的连接⑧关闭Internet对话(其中步骤④、⑤、⑥可重复进行)设计窗体时,设计窗体时为了便于了解建立连接的步骤,将打开Internet对话作为一个单独的启动时显示的窗体,在成功打开Internet对话后,显示进行FTP对话的主窗体,在主窗体中与FTP服务器交互对话。

对于实现连接与对话的每一个步骤,API函数至关重要,在整个交互对话过程中,我们只要熟悉了相应的API函数,就不难理解进行FTP操作的用法。

至于API函数怎么样通过Internet与FTP进行会话的底层细节,我们可不必去考虑。

实现步骤☞创建启动窗体frmFTPst启动VB,新建一个标准EXE过程,在默认的窗体Form1中加载以下控件:两个CommonButton控件、两个TextBox控件、两个Frame控件、两个Label控件。

FTP上传控件的实现

FTP上传控件的实现
电脑 编 程 技 巧 与 维 护
F P上传控件 的实现 T
刘德 春
( 洛阳人才交流 中心 ,河南 洛阳 4 10 ) 7 0 0
摘 要 : 通 过 丌 P上 传控 件 -  ̄ F P与 We 进 行 结合 ,可 以像 操 作 其他 We 页 一 样进 行 F P上 传 。为 了使 用 - X让 T 1 - b b网 T
的代码 。同样 ,通 过实现 标准接 口调用 ,一个 遵循 规范 的容 器 可 以很 容 易 地嵌 入 任何 遵 循规 范 的 控件 。如 果使 用 的是 Widw 操 作 系统 ,或许 会 注意 到一些 以 O X结尾 的文 件 , nos C O X代表 “ C 对象链接与嵌入控件 ” ( L ) OE。 21 控件开发策略 .
了 扩 展 , 即 Widw ne t ( 称 WiIe 。 通 过 对 主 要 no sIt me 简 nnt )
个控件 通过一个 由 I i ac Ds th派生 的接 口来 向外部 展示 p
We b协议 的封装 ,Mi oo 已大大简 化 了应 用程序 基 于 We c sf r t b
N me B T pod eut a , S Ru laR sl ); };
p pod p 、C tU la Cr、C tU l d rp ae U l A p Fp pod t a l Fp po Po P g ,分别 派生 a
自 C lC nrl dl、 C lC nrl C l rpr Pg 。 C l Oe o t Moue O e ot 、 Oe oet ae Oe o o P y —
C nrl d l 似 于标 准 MF o t Moue类 o C应 用 程序 的 C n p WiA p功 能 。 C lC nrl Oe o t 是基类 ,由此 可以派 生 出控 件 ,一 个项 目可 以包 o 含多个控件 ,都从 这个类 派生 。C l rpr P g Oe oet ae以类 似于对 P y 话框的图形化界面来 显示定制控件 的属性 ,在此不涉及 。

基于VB多线程技术的FTP的实现

基于VB多线程技术的FTP的实现

基于VB多线程技术的FTP的实现1 引言Internet 的发展非常迅猛,面对Internet 这个无穷宝库,人们会经常下载所需要的各种各样的信息,这就要用到文件传输协议FTP(File Transfer Protocol)。

FTP 是因特网上较早出现的服务功能之一,迄今其仍是Internet 上最常用也是最重要的服务功能。

面对频繁的文件下载和相对拥挤的网络通路,如何快速、高效、方便地利用FTP 获取所需要的信息显得越来越重要。

为使系统具有更好的交互性,可以使用近年来出现的多线程机制提高系统的性能。

线程是比进程更小的能完成一个任务的执行流。

多线程是指在应用程序中有多个并发的线程在同时运行,这可以加快程序的响应时间,提高计算机资源的使用效率。

多线程技术在VB 的Internet Transfer 控件实际上是一个Activex 控件,他支持HTTP 和FTP 协议。

前者用于浏览WWW 的HTML 页面,后者用于连接FTP 服务器进行文件传输。

新建一个工程,在窗体上放置Internet Transfer 控件itl,另外放置2 个文本框ta 和tc,分别用来输入FTP 站点地址和列出该站点指定目录下的可供下载的文件。

2.1 itl 的主要属性和方法itl.AccessType 是与Internet 的连接方式。

可以设置为1,2,0,分别表示通过电话线、局域网和缺省(按照注册表中的设置)方式与Internet 连接;itl.URL 是FTP 站点的地址;itl.RequestTimeout 为连接的时间限制。

OpenURL 方法用于同步连接指定的URL 并返回该URL 中的内容;Execute 方法异步执行对远程服务器的请求命令,此方法会触发StateChanged事件;Cancel 方法用于强行关闭当前的连接。

2.2 文件传输的实现。

VB多线程的几种实现方法概述

VB多线程的几种实现方法概述

VB多线程的⼏种实现⽅法概述转⾃先说多线程:⽅法 1 : CreateThread不⽤多说,万变不离其宗,这是 Win32 内创建线程的唯⼀系统⽅法,以下介绍的多线程创建⽅式虽然不直接接触这个 Win32 APi,但系统也是通过他创建的。

⽅法 2 : TimerSetEvent这个函数是 Win32 系统的⼀个⾼精度计时器函数,通过调⽤这个函数,系统会创建⼀个新的线程,让Timer 回调函数中的代码运⾏在这个新线程中。

⽅法 3 : SHCreateThread很多⼈应该没见过这个函数,这是 shlwapi.dll 的⼀个导出函数,这个函数看字⾯也能理解是个创建多线程的函数,⽽且。

他是基于对象操作的多线程函数,也就是说他能够稳定的运⾏⼀些⽤上⾯2种⽅法创建,但不能稳定运⾏的代码。

⾄少这个函数在 IDE 的环境下表现的中规中矩!使⽤⽅法可查 API-GUIDE⽅法 4 :想起来了, CreateRemoteThread创建远程线程,经测试⼀点也不稳定,根本没法说下去了,还不如直接调⽤ CreateThread但,做为⼀种线程的创建⽅法,还是希望能够熟悉⼀下,如果不⽤VB写代码,要写跨进程线程,这是⼀个简单易⾏的办法,否则只能继续SetWindowHook了,熟悉汇编指令的还可以远程分配内存写硬编码执⾏⽅法 5 :简单说下 ActiveX ⽅式的多线程论坛⾥⾯有⽤这种⽅法实现的稳定多线程,代码虽好,但我却不会⽤,在倡导绿⾊软件的今天,为了⼀个多线程,⽽注册表⾥⾯⼜要多点xx,不好。

⽽且卸载⿇烦。

⽤ ActiveX 创建线程与其他⽅式创建的线程最重要的地⽅要主义,任何VB函数的调⽤最好都建⽴在新线程中新初始化的对象基础上执⾏,不要跨对象调⽤,⽽ ActiveX 的安全线程本⾝也正是利⽤了这点,不知道研究 ActiveX 的⽼⼤们有没注意,利⽤他特性实现的多线程,是初始化的⼀个新的线程,⽽这个线程中初始化的对象则是整个⼯程。

VisualC网络编程案例实战之FTP客户端

VisualC网络编程案例实战之FTP客户端

PPT文档演模板
VisualC网络编程案例实战之FTP客 户端
2.连接模式
• FTP客户端连接服务器的模式有两种: PORT模式和PASV模式。
• PORT模式:PORT是主动模式。当客户 端选择这种模式与服务器进行连接的时 候,它需要向服务器提供一个IP地址和 一个端口号。
PPT文档演模板
• PASV模式:PASV是被动模式。当选择 这种模式连接时,服务器需要提供给客 户端一个IP地址和一个端口号。用户平 时从网上一个指定的FTP地址和端口下 载文件就是这种模式的一种实际应用,
VisualC网络编程案例实战之FTP客 户端
• 功能实现过程:
• (1)调用成员函数Create()创建了socket, 用于向服务器发送命令和接收来自FTP 服务器的响应。
• (2)调用成员函数Connect()连接FTP服 务器,需要向函数提供FTP服务器的IP 和端口号。
PPT文档演模板
• (3)调用我们自己将要封装的2个函数
PPT文档演模板
VisualC网络编程案例实战之FTP客 户端
图 4.1 FTP工作原理图
PPT文档演模板
VisualC网络编程案例实战之FTP客 户端
4.1.1 FTP数据结构
• 进行FTP编程之前,用户首先需要知道 FTP有哪些数据结构。由于在某些主机 上保存的文件是面向字节的,某些是面 向记录的。所以在FTP中,除了有不同 的数据类型以外,还有几种不同的文件 结构类型。这样做的目的是为了在不同 的主机之间传送文件时能够相互识别。
• FTP是属于TCP/IP簇中的一种具体应用, 所以FTP也具有数据重发机制。但在FTP 中,数据重发仅用于文件和压缩模式。 一般情况下,重发机制都要求发送者在 发送数据时加入特定标记来描述数据的 重要信息。并且该标记只针对发送者有 意义,其内容大多是用来校验数据的完 整性。特定标记可以表示任何可以标记 的属性或其他信息。

(整理)VisualC网络编程案例实战之FTP客户端实现之二

(整理)VisualC网络编程案例实战之FTP客户端实现之二
• 浮动(fúdòng)对话框,顾名思义就是可以浮动(fúdòng) 在主窗体之上。制作方法如下:
• 〔1〕在资源视图中插入对话框资源,修改ID为 IDD_FLOAT_DLG,修改属性:去掉对话框的 边缘,将style改为child,如下图。
第十四页,共八十九页。
图5.7 对话框属性 设置 (shǔxìng)
第二十九页,共八十九页。
图 添加(tiān jiā)新类CFileTree
第三十页,共八十九页。
• 在类CFileTree的实现文件(wénjiàn),添加文件(wénjiàn) 包含指令如下:
• #include "MainFrm.h" • #include "FtpClientView.h" • 在利用类向导为它添加函数OnBegindrag(),如
第二十七页,共八十九页。
5.2.3 树形视图(shìtú)工程拖 动效果
• 我们可以通过捕获(bǔhuò)3个事件来添加拖动效果 的代码,他们是:鼠标左键选中工程并且开始 拖动、鼠标移动和鼠标左键抬起。
第二十八页,共八十九页。
1.选中视图(shìtú)项
• 我们需要用类向导添加(tiān jiā)一个新类CFileTree, 基于CTreeView,如下图。
第二十页,共八十九页。
5.2.2 客户(kèhù)区的分割
• 我们需要将整个(zhěnggè)客户区分割为3个局部:用 于显示用户操作的信息窗口、用于显示本地文 件夹资源的树形视图窗口和用于显示FTP效劳器 上文件资源的列表视图窗口。效果如下图。
第二十一页,共八十九页。
图5.10 窗口 分割效果图 (chuāngkǒu)
• 在主窗体的左侧视图中显示选定本地文件夹内 的所有文件资源,结构为树形,可以动态的改 变本地文件夹的选择,如下图。前方有加号(jiā hào) 说明路径中还有子路径,单击加号(jiā hào)翻开此 路径,加号(jiā hào)变减号,子文件将显示在子树 中。鼠标移过此视图时树子项会加亮显示。图 标H表示文件夹、图标F表示文件。

Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例

Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例

Python实现基于多线程、多⽤户的FTP服务器与客户端功能完整实例本⽂实例讲述了Python实现基于多线程、多⽤户的FTP服务器与客户端功能。

分享给⼤家供⼤家参考,具体如下:项⽬介绍:1. ⽤户加密认证2. 允许同时多⽤户登录3. 每个⽤户有⾃⼰的家⽬录,且只能访问⾃⼰的家⽬录4. 对⽤户进⾏磁盘配额,每个⽤户的可⽤空间不同5. 允许⽤户在ftp server上随意切换⽬录6. 允许⽤户查看当前⽬录下⽂件7. 允许上传和下载⽂件,保证⽂件⼀致性8. ⽂件传输过程中显⽰进度条实现的原理:服务器端启⽤端⼝监听,并对每⼀连接启⽤⼀个线程,对⽤户登陆密码采⽤SHA512进⾏加密并进⾏匹配,当⽤户登陆成功后,实例化FTPS,并引导客户端进⼊主命令模式,然后实现FTP的上传功能、下载功能、新建⽬录、删除⽂件或⽬录、切换⽬录等实例化操作,同时对相关上传下载进⾏进度条显⽰,服务器端显⽰下载或上传⽂件的⼤⼩等客户端与服务器协商建⽴连接后,进⾏⽤户⾝份登陆,登陆成功接收服务器指令,转⼊命令输⼊窗⼝,同时对put 与 get命令进⾏判断,实现特定的上传与下载功能核⼼代码实现如下:服务器端main.py#!/usr/bin/env python3.5# -*-coding:utf8-*-import os,sys,socket,pickleBASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))sys.path.append(BASEDIR)from conf import settingfrom core import file_handlerfrom core import db_handlerimport select,hashlibimport threadingdef login(username,password):"""FTP登陆验证函数:param username::param password::return:# testDict ={"username":"jjb","password":"123456","file_dir":"E:\python","file_size":500}# file = 'jjb.pkl'# fp = open(file,'wb')# pickle.dump(testDict,fp)# fp.close()f = open("jjb.pkl","rb")data = pickle.loads(f.read())f.close()print(data)"""#实例化加密函数hash = hashlib.sha512()db= db_handler.handler(setting.DATABASE,username)if os.path.isfile(db):f = open(db,"rb")data = pickle.loads(f.read())f.close()if username == data["name"]:hash.update(bytes(data["password"],"utf8"))hash_pwd = hash.hexdigest()if hash_pwd == password:filedir = data["file_dir"]filesize = data["file_size"]return "True|%s|%s"%(filedir,filesize)else:return "False||"else:return "False||"else:return "False||"def process(conn,addr):flage = "False"# 接收客户端连接请求信息info = conn.recv(1000)if info.decode() == "connect":conn.send(bytes("login","utf8"))# 接收⽤户及密码信息while flage =="False":user_check =conn.recv(8000)# 分割⽤户名及密码username,password = str(user_check.decode()).split("|")# 调⽤登陆验证函数login_ack = login(username,password)flage,home,size = str(login_ack).split("|")# print(flage,home,size)# print("user_input:",username,"user_pass:",password)if flage =="True":# 登陆成功发送登陆确认信息给客户端conn.send(bytes("login_ack","utf8"))# 实例化FTPserverftp = file_handler.FTPs(username,conn,home,size) # 登陆⽤户,数据连接,⼯作⽬录,磁盘配额 ftp.run()breakelse:# 登陆失败,发送给客户端重新验证conn.send(bytes("登陆失败!","utf8"))def ftp_server():'''启动FTP服务器端,开启线程监听:return:'''server = socket.socket()server.bind((setting.IP_PORT["host"],setting.IP_PORT["port"]))server.listen(10)while True:r,w,e = select.select([server,], [], [], 1)for i,server in enumerate(r):conn,addr = server.accept()# 创建线程t = threading.Thread(target=process, args=(conn, addr))# 启动线程t.start()server.close()def run():ftp_server()if __name__ =="__main__":run()file_handler.py:#!/usr/bin/env python3.5# -*-coding:utf8-*-import os,sysBASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))sys.path.append(BASEDIR)import refrom core import db_handlerfrom conf import settingimport pickleclass FTPs(object):'''ftp操作命令⽅法:'''def __init__(self,username,conn,home,total_size):'''初始化参数:param username: 操作⽤户名:param conn: sock连接:param home: ⽤户根⽬录:param total_size: 磁盘配额:return:'''ername = usernameself.conn = connself.root = homeself.home = self.rootself.total_size = int(total_size)self.cmd_file = None # ⽂件指令self.psize = 4096 # ⽂件分⽚def getdirsize(self,space):'''计算磁盘空间⼤⼩:return:'''self.dirsize = 0for root,dirs,files in os.walk(space):self.dirsize += (sum([os.path.getsize(os.path.join(root,name))for name in files])/1024)return int(self.dirsize)def put(self):'''上传⽂件:return:'''if self.cmd_file:er_space = int(self.getdirsize(self.root)/1024)# 组合接收字符串self.file_root = '%s\\%s'% (self.home,self.cmd_file)# # 获取⽂件名self.f =os.path.basename(self.file_root)if os.path.isdir(self.home):os.chdir(self.home)else:os.makedirs(self.home)os.chdir(self.home)try:self.conn.send(bytes("f_ack","utf8"))self.size = str(self.conn.recv(1024).decode()).split("|")if self.size[0]== "fsize":self.fss = int(self.size[1])self.f_total_size = int(er_space + (self.fss/1024/1024))if self.f_total_size < self.total_size: # 判断空间是否超额self.conn.send(bytes("f_ack_ready","utf8"))self.bsize = 0print("需要上传⽂件⼤⼩:",self.fss)# 打开⽂件f=open(self.f,'wb')while self.bsize < self.fss:data = self.conn.recv(self.psize)self.bsize += len(data)f.write(data)self.conn.send(bytes("ok","utf8"))print("实际已上传⽂件⼤⼩:",self.bsize)else:self.conn.send(bytes("上传空间不⾜!⽆法上传,你当前磁盘配额为%sM"%self.total_size,"utf8")) except Exception as ex:self.conn.send(bytes(ex,"utf8"))else:self.conn.send(bytes("请上传⽂件,⽂件不能为空","utf8"))def get(self):'''下载⽂件:return:'''if self.cmd_file:os.chdir(self.home) # 进⼊⽤户根⽬录self.file = os.getcwd()+"\\"+ self.cmd_fileif os.path.isfile(self.file):f = open(self.file, 'rb')self.fsize = os.path.getsize(self.file) # 获取要发送⽂件的⼤⼩self.conn.send(bytes("f_ack_read","utf8"))self.conn.recv(1000)print("需发送⽂件⼤⼩:",self.fsize)self.conn.send(bytes("fsize|%s"%self.fsize,"utf8")) # 发送⽂件⼤⼩及要发送准备完毕指令if self.conn.recv(1000).decode() == "f_ack": # 接收对⽅是否准备就绪self.fsize = int(self.fsize)self.size = 0ack =""while self.size < self.fsize and ack !="ok":data = f.read(self.fsize) # ⼀次读取分⽚⼤⼩4096self.conn.send(data)self.size += len(data)print("实际发送⽂件⼤⼩:",self.size)ack = self.conn.recv(1000).decode() # 接收客户端是否下载完指令self.conn.send(bytes("成功","utf8"))else:self.conn.send(bytes("接收失败","utf8"))else:self.conn.send(bytes("⽂件不存在","utf8"))else:self.conn.send(bytes("请输⼊⽂件名","utf8"))def dir(self):'''查看⽂件:return:'''self.current_space =int(self.getdirsize(self.home))# ⽂件列表self.li = ""# ⽬录列表self.dl = ""try:os.chdir(self.home)except:os.makedirs(self.home)os.chdir(self.home)try:if os.listdir(os.getcwd()):for self.i in os.listdir(os.getcwd()):self.file = os.getcwd()+'\\'+self.iif os.path.isfile(self.file):# 获取⽂件⼤⼩self.fsize = int(os.path.getsize(self.file)/1024)if self.fsize < 1:self.fsize = 4else:self.fsize +=4self.li += '%s -rw-rw-rw- 占⽤⼤⼩:%skb\r\n'% (self.i,self.fsize)else:self.dl += '%s\r\n'%self.iself.conn.send(bytes("⽬录:\r\n\r\n%s ⽂件:\r\n%s\r\n \r\n当前⽬录空间⼤⼩:%skb"%(self.dl,self.li,self.current_space),"utf8")) else:self.conn.send(bytes("当前⽬录为:%s"%(self.home),"utf8"))except Exception as ex:self.conn.send(bytes(ex,"utf8"))def cd(self):'''进⼊⽬录:return:'''if self.cmd_file:os.chdir(self.home) # 先进⼊到⼯作⽬录self.dir_change = os.path.abspath(os.path.join(self.home,"%s\%s"%(self.home,self.cmd_file)))if self.root in self.dir_change:try:os.chdir(self.dir_change)self.home = self.dir_changeself.conn.send(bytes("当前⼯作⽬录为:%s"%self.home,"utf8"))except:os.makedirs(self.dir_change)os.chdir(self.dir_change)self.home = self.dir_changeself.conn.send(bytes("当前⼯作⽬录为:%s"%self.home,"utf8"))else:self.conn.send(bytes("当前⼯作⽬录为:%s 更改失败!"%self.home,"utf8"))else:os.chdir(self.home)self.conn.send(bytes("当前⼯作⽬录为:%s"%self.home,"utf8"))def mkd(self):'''创建⽬录:return:'''if self.cmd_file:try:os.makedirs(self.cmd_file)self.conn.send(bytes("创建⽬录成功!","utf8"))except Exception as ex:self.conn.send(bytes("创建⽬录失败!原因:%s"%ex,"utf8"))else:self.conn.send(bytes("请输⼊⽂件夹名!","utf8"))def delete(self):'''删除⽂件:return:'''os.chdir(self.home) # 进⼊⽤户根⽬录try:self.file = self.home+'\\'+ self.cmd_fileif os.path.isfile(self.file):os.remove(self.cmd_file)self.conn.send(bytes("⽂件:%s删除成功!"%self.cmd_file,"utf8")) else:os.removedirs(self.cmd_file)self.conn.send(bytes("⽬录删除成功!","utf8"))os.chdir(self.root)except Exception:if os.path.isdir(self.root):self.conn.send(bytes("删除失败!","utf8"))else:os.makedirs(self.root)self.conn.send(bytes("删除失败!","utf8"))def help(self):'''FTP帮助信息:return:'''self.conn.send(bytes("""FTP服务器操作⽅法有: put------>上传⽂件⾄服务器get------>从服务器上下载⽂件dir------>查看服务器⽂件列表cd------->进⼊指定⽂件夹delete--->删除⽂件mkd ----->创建⽬录help----->帮助信息q ------->退出""","utf8"))def run(self):while True:# try:# # 接收客户端发来的命令信息self.cmd = self.conn.recv(1000)self.cmd_action = str(self.cmd.decode())# 判断命令是否含有空格self.fg = re.search("\s","%s"%self.cmd_action)if self.fg:self.cmd_action,self.cmd_file = str(self.cmd_action).split(" ")else:self.cmd_file =None# print("cmd_action:",self.cmd_action,"cmd_file:",self.cmd_file)if hasattr(FTPs,self.cmd_action):func = getattr(self,self.cmd_action)func()continueelse:self.conn.send(b'command is not found!')continue# except Exception as ex:# print("系统异常:%s"%ex)客户端client.py:#!/usr/bin/env python3.5# -*-coding:utf8-*-import sys,os,reimport socket,hashlibBASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))sys.path.append(BASEDIR)from core import file_handlerfrom conf import settingdef login():hash = hashlib.sha512()while True:user_input = input("请输⼊⽤户名:").strip()pass_input = input("请输⼊密码:").strip()if len(user_input) !=0 and len(pass_input) != 0:hash.update(bytes(pass_input,"utf8"))sha_pwd = hash.hexdigest()user = "%s|%s"% (user_input,sha_pwd)return userbreakdef ftp_client():sk = socket.socket()sk.connect((setting.IP_PORT["host"],setting.IP_PORT["port"]))while True:flage = Falsesk.send(bytes("connect","utf8"))msg = sk.recv(100)print("欢迎访问FTP服务器,请根据提⽰进⾏操作")if msg.decode() == "login":while flage == False:login_user =login()username,password = str(login_user).split("|")sk.send(bytes(login_user,"utf8"))user_info = sk.recv(1000)if user_info.decode() == "login_ack":print("登陆成功!")flage = Truebreakprint(user_info.decode())while flage:cmd_action = input("请输⼊操作命令如:get fy.py or help :").strip()if len(cmd_action) == 0:continueif cmd_action == "q":sys.exit()# 判断命令是否含有空格fg = re.search("\s","%s"%cmd_action)if fg:cmd,cmd_file = str(cmd_action).split(" ")ftp = file_handler.ftpc(sk,username,cmd_action,setting.DATABASE["local"]) if hasattr(ftp,cmd):func = getattr(ftp,cmd)func()continueelse:cmd_file =Nonesk.send(bytes(cmd_action,"utf8"))rec_msg = sk.recv(8000)print(rec_msg.decode())if flage == "False":sk.send(bytes("connect","utf8"))sk.close()def run():ftp_client()if __name__ == "__main__":run()file_handler.py:#!/usr/bin/env python3.5# -*-coding:utf8-*-import sys,os,reimport socketBASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))sys.path.append(BASEDIR)class ftpc(object):def __init__(self,sk,username,cmd_action,home):self.sk = skername = usernameself.cmd_action = cmd_actionself.home = homedef put(self):'''上传⽂件:return:'''try:os.chdir(self.home)except:os.makedirs(self.home)os.chdir(self.home)# 判断命令是否含有空格fg = re.search("\s","%s"%self.cmd_action)if fg:self.cmd,self.cmd_file = str(self.cmd_action).split(" ")if os.path.isfile(os.getcwd()+"\\"+self.cmd_file):self.sk.send(bytes(self.cmd_action,"utf8")) # 发送动作命令rec_msg = self.sk.recv(8000)if rec_msg.decode() == "f_ack":f = open(self.cmd_file, 'rb')self.fsize = os.path.getsize(self.cmd_file) # 获取要发送⽂件的⼤⼩ self.sk.send(bytes("fsize|%s"%self.fsize,"utf8")) # 发送⽂件⼤⼩ self.ack = self.sk.recv(1000)if self.ack.decode() =="f_ack_ready":self.fsize = int(self.fsize)self.size = 0ack =""while self.size < self.fsize and ack !="ok":data = f.read(4095) # ⼀次读取分⽚⼤⼩4095self.sk.send(data)self.size += len(data)count = int(self.size/self.fsize*100)print('#'*count,"->",(count),"%")ack = self.sk.recv(1000).decode()if ack =="ok":print("上传成功")else:print("上传失败")else:print(self.ack.decode())else:print("上传⽂件失败:%s"%rec_msg.decode())else:print("上传⽂件失败,请输⼊正确的⽂件名!")else:print("上传⽂件失败,请输⼊正确的⽂件名!")def get(self):'''下载⽂件:return:'''try:os.chdir(self.home)except:os.makedirs(self.home)os.chdir(self.home)# 判断命令是否含有空格fg = re.search("\s","%s"%self.cmd_action)if fg:self.cmd,self.cmd_file = str(self.cmd_action).split(" ")else:self.cmd_file =Noneself.sk.send(bytes(self.cmd_action,"utf8"))rec_msg = self.sk.recv(8000)if rec_msg.decode() == "f_ack_read":self.rec = self.sk.send(bytes("ok","utf8"))self.rec_size = self.sk.recv(2048)self.ack_rec= str(self.rec_size.decode()).split("|")self.sk.send(bytes("f_ack","utf8"))self.ack_s =int(self.ack_rec[1])print(self.ack_s)self.re_s = 0f = open(self.cmd_file,"wb")while self.re_s < self.ack_s:xx = self.re_s/self.ack_s*100data = self.sk.recv(4096)self.re_s += len(data)# print(data.decode("gbk"))f.write(data)count = int(xx)print('#'*count,"->",(count+1),"%")self.sk.send(bytes("ok","utf8"))print(self.re_s)self.ack_ok = self.sk.recv(1024)print("接收⽂件:%s"%self.ack_ok.decode())else:print("接收⽂件失败:%s"%rec_msg.decode())如下是重要模块进⾏收藏:OS模块os.getcwd()获取当前⼯作⽬录,即当前python脚本⼯作的⽬录路径os.chdir("dirname")改变当前脚本⼯作⽬录;相当于shell下cdos.curdir返回当前⽬录: ('.')os.pardir获取当前⽬录的⽗⽬录字符串名:('..')os.makedirs('dirname1/dirname2')可⽣成多层递归⽬录os.removedirs('dirname1')若⽬录为空,则删除,并递归到上⼀级⽬录,如若也为空,则删除,依此类推os.mkdir('dirname')⽣成单级⽬录;相当于shell中mkdir dirnameos.rmdir('dirname')删除单级空⽬录,若⽬录不为空则⽆法删除,报错;相当于shell中rmdir dirnameos.listdir('dirname')列出指定⽬录下的所有⽂件和⼦⽬录,包括隐藏⽂件,并以列表⽅式打印os.remove()删除⼀个⽂件os.rename("oldname","newname")重命名⽂件/⽬录os.stat('path/filename')获取⽂件/⽬录信息os.sep输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"os.linesep输出当前平台使⽤的⾏终⽌符,win下为"\t\n",Linux下为"\n"os.pathsep输出⽤于分割⽂件路径的字符串输出字符串指⽰当前使⽤平台。

实现FTP多线程下载

实现FTP多线程下载

实现FTP多线程下载现在有不少软件可实现多线程下载.如NetAnts,JetCar等,其实多线程下载的原理并不复杂,主要的两项技术就是多线程和断点下载。

程序中开启多个线程,每个线程利用断点下载,分别下载文件的不同部分,下载完后合并,就可以了。

多线程编程很多书已有介绍,这里不再重复,关于断点下载,MFC中提供的CInternetFile类可实现HTTP的断点下载,但无法实现FTP的断点下载。

因此,我们只好从FTP协议中的命令入手,自己编写个FTP类,来实现多线程下载。

本人编写的CMultiFTP类(在WIN2000+IIS5。

0下测试成功)已在CSDN发表。

FTP指令的详细信息,大家可从/in-notes/rfc/处获得,这里给大家介绍下与多线程下载有关的几个指令极其格式:USER〈USERNAME〉:登陆FTP的用户名,执行成功返回220;PASS〈PASSWORD〉:密码,执行成功返回230;REST〈POS〉:指定文件下载的开始位置,执行成功返回350;SIZE〈FILENAME〉:文件大小,执行成功返回213;PASV:建立数据连接,同时取得FTP服务器下载文件时用的端口号,执行成功返回227;TYPE:指定下载文件的类型,参数为I是二进制文件,为A是字符文件,执行成功返回200;RETR〈FILENAME〉:下载文件,执行成功返回125;这些命令中,REST,RETR,SIZE三个命令最关键,在后面会给大家更详细的说明,另外执行FTP命令,FTP服务器会向客户端返回一代码,命令执行成功的代码上面已给出。

向服务器发送命令,可把命令当作字符串向服务器发送,如:send(socket,”rest 100\r\n”,…)(注意:要在命令后加\r\n)。

在介绍多线程下载前,先给大家介绍下连接FTP服务器和从FTP服务器下载文件的过程。

连接FTP SERVER很简单,创建一套接字,指定服务器的地址和端口号,连接到服务器,再向它发送USER和PASS命令,服务器返回230,就代表登陆成功,并且服务器和客户建立了一控制连接。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于VB多线程技术的FTP的实现作者:苗专生来源:《现代电子技术》2008年第08期摘要:由于网络用户的数量与日俱增,通信阻塞现象时有发生。

如何提高FTP的传输速度是一个重要的研究课题。

多线程技术在提高系统效率、有效利用系统资源和保证用户任务之间的通信质量等方面有其明显的优点。

基于VB的多线程技术支持,探讨用VB的多线程技术在Internet上进行FTP的实现方法。

实验结果表明,该方法安全可靠、简单易行。

关键词:VB;多线程技术;Internet;中图分类号:TP393文献标识码:B文章编号:1004-373X(2008)08-059-Abstract:As the number of network users are increased with each passing day,the phenomenon that communications are choked always occurrence.How accelerate speed of FTP transmission is an important question for discussion.The multithreading technique is excellent in increasing system efficiency,making use of the system resources effectively and guaranteeing the communication quantity of the users′ tasks.Based on VB multithreading technique,the way of using VB multithreading technique to realize FTP on the Internet is discussed in this paper.The experiment results show theKeywords:1 引言Internet的发展非常迅猛,面对Internet这个无穷宝库,人们会经常下载所需要的各种各样的信息,这就要用到文件传输协议FTP(File Transfer Protocol)。

FTP是因特网上较早出现的服务功能之一[1],迄今其仍是Internet上最常用也是最重要的服务功能。

面对频繁的文件下载和相对拥挤的网络通路,如何快速、高效、方便地利用FTP获取所需要的信息显得越来越重要。

为使系统具有更好的交互性,可以使用近年来出现的多线程机制提高系统的性能[2]。

线程是比进程更小的能完成一个任务的执行流。

多线程是指在应用程序中有多个并发的线程在同时运行,这可以加快程序的响应时间,提高计算机资源的使用效率。

多线程技术在图形用户界面和网络程序设计中非常有用[3]。

支持多线程技术,但程序目前尚不能嵌入流行的ASP网页代码中;Java的多线程技术颇佳,也可以很方便地将其Applet嵌入网络的页面中,但Java毕竟是一门类似于的语言,对大多数人来说,熟练掌握并非易事,远没有VB使用起来简单、方便,而且VB的速度同样也很快。

VB 6.0在Internet网络编程方面提供了强大功能,本文利用VB 6.0的Addressof操作符配合Windows API函数实现多线程技术,并将其用于Internet上的FTP。

2 VB的FTP实现机制VB的Internet Transfer控件实际上是一个Activex控件[4],他支持HTTP和FTP协议。

前者用于浏览WWW的HTML页面,后者用于连接FTP服务器进行文件传输。

新建一个工程,在窗体上放置Internet Transfer控件it1,另外放置2个文本框ta和tc,分别用来输入FTP站点地址和列出该站点指定目录下的可供下载的文件。

2.1 it1的主要属性和方法it1.AccessType是与Internet的连接方式。

可以设置为1,2,0,分别表示通过电话线、局域网和缺省(按照注册表中的设置)方式与Internet连接;it1.URL是FTP站点的地址;it1.RequestTimeout为连接的时间限制。

OpenURL方法用于同步连接指定的URL并返回该URL中的内容;Execute方法异步执行对远程服务器的请求命令,此方法会触发StateChanged事件;Cancel方法用于强行关闭当前的连接。

2.2 文件传输的实现文件传输的实现程序如下所示:Private Sub ta[CD#*2]KeyPress(KeyAscii As Integer)[JY]′打开URL并显示可下载的文件If KeyAscii = Asc(13) Then[JY]′以回车为URL输入完毕标志On Error GoTo handit1.URL = ta.Text′按照输入的地址设置Transfer控件的URL属性it1.Execute ,″dir *.*″[JY]′执行Execute方法,列出URL当前目录的所有文件Caption = it1.URL[JY]′在窗口的标题栏上也显示handle…[JY]′错误判断处理Private Sub tc[CD#*2]DblClick( )[JY]′双击文件名开始下载[ZK(]ta.Text = ta.Text & ″/″ & Left(tc.SelText,tc.SelLength -sd = Right(ta.Text,Len(ta.Text) -[ZK(]sd = Right(ta.Text,Len(ta.Text) -sd = Right(sd,Len(sd) -it1.Execute ,″get″ & sd & ″ ″ & st & tc.SelText[JY]′用FTP的get命令下载远程文件End Sub程序运行如图1所示。

3 VB的多线程实现机制3.1 创建线程并初始化VB通过调用Windows的API函数CreateThread实现多线程[4],该函数的声明如下:Declare Function CreateThread Lib ″kernel32″ Alias ″CreateThread″(lpThreadAttributes As SECURITY[CD#*2]ATTRIBUTES,ByVal dwStackSize As Long,lpStartAddress AsLong,lpParameter As Any,ByVal dwCreationFlags As Long,lpThreadId As Long) As Long他返回线程的句柄。

为了对线程初始化和管理,需要创建一个类myclass,用myclass的下述函数初始化线程。

Public sub initialize(lpfnbasfunc as long)[JY]′形参是线程函数的地址dc=4[JY]′暂不激活if me.Thread=mn then msgbox ″创建线程失败!″ else msgbox ″线程″ & lt & ″正在运行End Sub图1 指定URL的可下载文件3.2 激活线程并管理用以下2个API函数均可激活线程。

Declare Function ResumeThread Lib ″kernel32″ Alias ″ResumeThread″ (ByVal hThread AsDec lare Function SuspendThread Lib ″kernel32″ Alias ″SuspendThread″ (ByVal hThread As Long) As Long用类myclass的一个属性来管理线程的状态。

Dim myThread as new myclass[JY]′创建类的新线程对象myThread.Initialize AddressOf newFunc[JY]′产生处理新线程的函数myThread.Enabled=true[JY]′激活线程3.3 编写处理新线程函数的代码在函数newFunc中,用form1.show执行前面的实现FTP的程序代码。

运行时每当创建一个新线程成功,会弹出一个信息窗口,表明当前的线程号,如图2所示。

图2 正在运行的新线程4 结语网络技术的发展日新月异,在“时间就是金钱、效率就是生命”的信息时代,如何通过Internet快速、高效、安全、方便地获取所需要的信息已成为一个非常重要的技术手段。

多线程技术可以使程序反应更快、交互性更强。

用VB实现多线程比用和Java均简单得多,而且运行速度毫不逊色,只是目标代码稍大一点(约5%)。

文中用Addressof操作符配合Windows API函数实现多线程,并成功运用于FTP远程文件传输。

实验表明,该方法安全可靠,简单易行,速度快、开销低,每一个线程大约仅占CPU 20 ms的时间片。

随着互连网的普及和网上信息的爆炸式增加,基于VB多线程技术的FTP必然会得到更广泛地应用。

[LL]参考文献[1]田超.Internet的入网与应用[M].北京:科学技术出版社,1998.[2]刘倩,裘鸿林.Java线程机制在FTP客户端程序中的应用[J].中国数据通信,2004,11(2):5760.[3]张白一,崔尚森.面向对象程序设计[CD2]Java[M].西安:西安电子科技大学出版社,2003.[4]曾伟民,邓勇刚.Visual Basic 6.0高级实用教程[M].北京:电子工业出版社作者简介苗专生男,1957年出生,河南伊川人,高级工程师,硕士。

主要从事网络通信和电子技术的研究工作。

相关文档
最新文档