摘 要:由于網(wǎng)絡用戶的數(shù)量與日俱增,通信阻塞現(xiàn)象時有發(fā)生。如何提高FTP的傳輸速度是一個重要的研究課題。多線程技術在提高系統(tǒng)效率、有效利用系統(tǒng)資源和保證用戶任務之間的通信質量等方面有其明顯的優(yōu)點?;赩B的多線程技術支持,探討用VB的多線程技術在Internet上進行FTP的實現(xiàn)方法。實驗結果表明,該方法安全可靠、簡單易行。
關鍵詞: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的發(fā)展非常迅猛,面對Internet這個無窮寶庫,人們會經常下載所需要的各種各樣的信息,這就要用到文件傳輸協(xié)議FTP(File Transfer Protocol)。FTP是因特網(wǎng)上較早出現(xiàn)的服務功能之一[1],迄今其仍是Internet上最常用也是最重要的服務功能。面對頻繁的文件下載和相對擁擠的網(wǎng)絡通路,如何快速、高效、方便地利用FTP獲取所需要的信息顯得越來越重要。為使系統(tǒng)具有更好的交互性,可以使用近年來出現(xiàn)的多線程機制提高系統(tǒng)的性能[2]。
線程是比進程更小的能完成一個任務的執(zhí)行流。多線程是指在應用程序中有多個并發(fā)的線程在同時運行,這可以加快程序的響應時間,提高計算機資源的使用效率。多線程技術在圖形用戶界面和網(wǎng)絡程序設計中非常有用[3]。 VC++支持多線程技術,但VC++程序目前尚不能嵌入流行的ASP網(wǎng)頁代碼中;Java的多線程技術頗佳,也可以很方便地將其Applet嵌入網(wǎng)絡的頁面中,但Java畢竟是一門類似于C++的語言,對大多數(shù)人來說,熟練掌握并非易事,遠沒有VB使用起來簡單、方便,而且VB的速度同樣也很快。VB 6.0在Internet網(wǎng)絡編程方面提供了強大功能,本文利用VB 6.0的Addressof操作符配合Windows API函數(shù)實現(xiàn)多線程技術,并將其用于Internet上的FTP。
2 VB的FTP實現(xiàn)機制
VB的Internet Transfer控件實際上是一個Activex控件[4],他支持HTTP和FTP協(xié)議。前者用于瀏覽WWW的HTML頁面,后者用于連接FTP服務器進行文件傳輸。新建一個工程,在窗體上放置Internet Transfer控件it1,另外放置2個文本框ta和tc,分別用來輸入FTP站點地址和列出該站點指定目錄下的可供下載的文件。
2.1 it1的主要屬性和方法
it1.AccessType是與Internet的連接方式。可以設置為1,2,0,分別表示通過電話線、局域網(wǎng)和缺省(按照注冊表中的設置)方式與Internet連接;it1.URL是FTP站點的地址;it1.RequestTimeout為連接的時間限制。
OpenURL方法用于同步連接指定的URL并返回該URL中的內容;Execute方法異步執(zhí)行對遠程服務器的請求命令,此方法會觸發(fā)StateChanged事件;Cancel方法用于強行關閉當前的連接。
2.2 文件傳輸?shù)膶崿F(xiàn)
文件傳輸?shù)膶崿F(xiàn)程序如下所示:
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]′執(zhí)行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的多線程實現(xiàn)機制
3.1 創(chuàng)建線程并初始化
VB通過調用Windows的API函數(shù)CreateThread實現(xiàn)多線程[4],該函數(shù)的聲明如下:
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
他返回線程的句柄。為了對線程初始化和管理,需要創(chuàng)建一個類myclass,用myclass的下述函數(shù)初始化線程。
Dim lt as long
Public sub initialize(lpfnbasfunc as long)[JY]′形參是線程函數(shù)的地址
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 ″創(chuàng)建線程失??!″ else msgbox ″線程″ lt ″正在運行……″,2
lt=lt+1;
End Sub
圖1 指定URL的可下載文件
3.2 激活線程并管理
用以下2個API函數(shù)均可激活線程。
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的一個屬性來管理線程的狀態(tài)。
Public threadstatus as Boolean
Public property let enabled(byval nValue as Boolean)
If nValue=true and me.threadstatus=1 then
Resumethread(me.thread)
Me.threadstatus=true
Elseif me.threadstatus=true then
Suspendthread(me.thread)
Me.threadstatus=1
End if
End property
Dim myThread as new myclass[JY]′創(chuàng)建類的新線程對象
myThread.Initialize AddressOf newFunc[JY]′產生處理新線程的函數(shù)
myThread.Enabled=true[JY]′激活線程
3.3 編寫處理新線程函數(shù)的代碼
在函數(shù)newFunc中,用form1.show執(zhí)行前面的實現(xiàn)FTP的程序代碼。運行時每當創(chuàng)建一個新線程成功,會彈出一個信息窗口,表明當前的線程號,如圖2所示。
圖2 正在運行的新線程
4 結 語
網(wǎng)絡技術的發(fā)展日新月異,在“時間就是金錢、效率就是生命”的信息時代,如何通過Internet快速、高效、安全、方便地獲取所需要的信息已成為一個非常重要的技術手段。多線程技術可以使程序反應更快、交互性更強。用VB實現(xiàn)多線程比用VC++和Java均簡單得多,而且運行速度毫不遜色,只是目標代碼稍大一點(約5%)。文中用Addressof操作符配合Windows API函數(shù)實現(xiàn)多線程,并成功運用于FTP遠程文件傳輸。實驗表明,該方法安全可靠,簡單易行,速度快、開銷低,每一個線程大約僅占CPU 20 ms的時間片。隨著互連網(wǎng)的普及和網(wǎng)上信息的爆炸式增加,基于VB多線程技術的FTP必然會得到更廣泛地應用。[LL]
參 考 文 獻
[1]田超.Internet的入網(wǎng)與應用[M].北京:科學技術出版社,1998.
[2]劉倩,裘鴻林.Java線程機制在FTP客戶端程序中的應用[J].中國數(shù)據(jù)通信,2004,11(2):5760.
[3]張白一,崔尚森.面向對象程序設計[CD2]Java[M].西安:西安電子科技大學出版社,2003.
[4]曾偉民,鄧勇剛.Visual Basic 6.0高級實用教程[M].北京:電子工業(yè)出版社,1999.
作者簡介 苗專生 男,1957年出生,河南伊川人,高級工程師,碩士。主要從事網(wǎng)絡通信和電子技術的研究工作。
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文