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

时间:2022-09-26 12:12:52

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

摘 要:由于网络用户的数量与日俱增,通信阻塞现象时有发生。如何提高FTP的传输速度是一个重要的研究课题。多线程技术在提高系统效率、有效利用系统资源和保证用户任务之间的通信质量等方面有其明显的优点。基于VB的多线程技术支持,探讨用VB的多线程技术在Internet上进行FTP的实现方法。实验结果表明,该方法安全可靠、简单易行。

关键词:VB;多线程技术;Internet;FTP

中图分类号:TP393文献标识码:B

文章编号:1004-373X(2008)08-059-02オ

Realization of FTP Based on VB Multithreading Technology

MIAO Zhuansheng

(Luoyang Institute of Science and Technology,Luoyang,471023,China)オ

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 the method is safe reliable andeasy to realize.

Keywords:VB;multithreading technique;Internet;FTP

1 引 言

Internet的发展非常迅猛,面对Internet这个无穷宝库,人们会经常下载所需要的各种各样的信息,这就要用到文件传输协议FTP(File Transfer Protocol)。FTP是因特网上较早出现的服务功能之一[1],迄今其仍是Internet上最常用也是最重要的服务功能。面对频繁的文件下载和相对拥挤的网络通路,如何快速、高效、方便地利用FTP获取所需要的信息显得越来越重要。为使系统具有更好的交互性,可以使用近年来出现的多线程机制提高系统的性能[2]。

线程是比进程更小的能完成一个任务的执行流。多线程是指在应用程序中有多个并发的线程在同时运行,这可以加快程序的响应时间,提高计算机资源的使用效率。多线程技术在图形用户界面和网络程序设计中非常有用[3]。 VC++支持多线程技术,但VC++程序目前尚不能嵌入流行的ASP网页代码中;Java的多线程技术颇佳,也可以很方便地将其Applet嵌入网络的页面中,但Java毕竟是一门类似于C++的语言,对大多数人来说,熟练掌握并非易事,远没有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输入完毕标志

KeyAscii = 0: ta.SelStart = 0: ta.SelLength = Len(ta)

On Error GoTo handleerror

it1.URL = ta.Text′按照输入的地址设置Internet

Transfer控件的URL属性

it1.Execute ,″dir *.*″[JY]′执行Execute方法,列出

URL当前目录的所有文件

Caption = it1.URL[JY]′在窗口的标题栏上也显示URL

End If

Exit Sub

handleerror:

…[JY]′错误判断处理

End Sub

Private Sub tc[CD#*2]DblClick( )[JY]′双击文件名开始下载

Dim sd As String

If tc.SelLength Then

If Right(tc.SelText,1) = ″/″ Then

[ZK(]ta.Text = ta.Text & ″/″ & Left(tc.SelText,tc.SelLength - 1)

On Error GoTohandleerror

sd = Right(ta.Text,Len(ta.Text) - Len(I1.URL))

it1.Execute ,″dir″ & sd & ″/*″

Else

[ZK(]sd = Right(ta.Text,Len(ta.Text) - Len(it1.URL)) & ″/″ & tc.SelText

sd = Right(sd,Len(sd) - 1)

it1.Execute ,″get″ & sd & ″ ″ & st & tc.SelText[JY]′用FTP的get命令下载远程文件

End If

End If

handleerror:

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 As Long,lpParameter As Any,ByVal dwCreationFlags As Long,lpThreadId As Long) As Long

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

Dim lt as long

Public sub initialize(lpfnbasfunc as long)[JY]′形参是线程函数的地址

Dim ds As Long: Dim dc As Long:Dim lp As Long:Dim mn As Long

mn=0&:ds=0

dc=4[JY]′暂不激活

me.Thread=createThread(mn,ds,lpfnbasfunc,mn,dc,lt)

if me.Thread=mn then msgbox ″创建线程失败!″ else msgbox ″线程″ & lt & ″正在运行……″,2

lt=lt+1;

End Sub

图1 指定URL的可下载文件

3.2 激活线程并管理

用以下2个API函数均可激活线程。

Declare Function ResumeThread Lib ″kernel32″ Alias ″ResumeThread″ (ByVal hThread As Long) As Long

Declare Function SuspendThread Lib ″kernel32″ Alias ″SuspendThread″ (ByVal hThread As Long) As Long

用类myclass的一个属性来管理线程的状态。

Public threadstatus as Boolean

Public property let enabled(byval nValue as Boolean)

If nValue=true and me.threadstatus=false then

Resumethread(me.thread)

Me.threadstatus=true

Elseif me.threadstatus=true then

Suspendthread(me.thread)

Me.threadstatus=false

End if

End property

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实现多线程比用VC++和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].北京:电子工业出版社,1999.

作者简介 苗专生 男,1957年出生,河南伊川人,高级工程师,硕士。主要从事网络通信和电子技术的研究工作。

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:基于ARM和蓝牙的无线信号采集系统的设计与实现 下一篇:基于组件模型的虚拟打印系统的研究与实现