|
一 引言 隨著計算機在鐵路各部門的普及,辦公無紙化逐漸成為一種趨勢,文件、資料、報表等數(shù)據(jù)的傳送都通過計算機網(wǎng)絡(luò)來完成。FTP成為傳送這些數(shù)據(jù)的流行工具。為了更好地使用FTP,應(yīng)該了解和掌握FTP編程。只有把FTP內(nèi)嵌到應(yīng)用程序中去,FTP的應(yīng)用才更靈活,才能滿足各種數(shù)據(jù)傳輸?shù)男枰?。本文?/span>VB中的Winsock控件為工具,根據(jù)FTP的基本原理,闡明了FTP客戶端編程的一般方法。 二 FTP客戶端與服務(wù)器間的基本協(xié)作過程 下面是FTP模型的基本原理圖: 服務(wù)器數(shù)據(jù)傳輸進程 客戶端數(shù)據(jù)傳輸進程 文件系統(tǒng) 服務(wù)器協(xié)議接口 客戶端協(xié)議接口 用戶界面 用戶 FTP命令 FTP響應(yīng) 數(shù)據(jù)連接 文件系統(tǒng) 服務(wù)器FTP 客戶端FTP 1、客戶端與服務(wù)器連接 FTP是建立在TCP之上的連接,端口號使用21。若客戶端與服務(wù)器之間成功連接,服務(wù)器將返回字符串,如: 220 GMS (Version 5.0) 前三個字符220表示客戶端與服務(wù)器成功連接,后面的字符會因服務(wù)器的不同而不同,但我們只關(guān)心前三個字符。 2、用戶名和密碼認證 客戶端發(fā)送用戶名給服務(wù)器,如: USER guo 如果服務(wù)器找到用戶名guo,將返回字符串,如: 331 User name okay, need password. 接著客戶端應(yīng)發(fā)送密碼給服務(wù)器,如: 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、建立數(shù)據(jù)連接 FTP協(xié)議用兩個連接來達到客戶機與服務(wù)器之間交換數(shù)據(jù)的目的。剛才建立了第一個連接——控制連接,它用于傳送命令和響應(yīng)。我們還要建立第二個連接——數(shù)據(jù)連接,用于數(shù)據(jù)傳輸。FTP提供了兩種方式來建立數(shù)據(jù)連接,一種用PORT命令,一種用PASV命令。我們使用后者??蛻舳税l(fā)送PASV命令給服務(wù)器,服務(wù)器返回IP地址和端口號,用來提供給客戶端進行數(shù)據(jù)連接。如: 227 Entering Passive Mode (10,175,125,49,9,17) 括號里6個數(shù)字中前4個數(shù)字表示IP地址10.175.125.49,后2個數(shù)字表示端口號,這2個數(shù)字按如下公式計算端口號: 9*256+17=2321 這樣,客戶端就可用IP地址10.175.125.49和端口號2321連接服務(wù)器,建立數(shù)據(jù)連接。 4、其它相關(guān)的命令及響應(yīng) ● LIST命令 該命令用于獲取FTP服務(wù)器的目錄列表,服務(wù)器操作成功后返回: 150 Opening ASCII mode data connection for /bin/ls. 目錄列表要通過數(shù)據(jù)連接進行傳輸,若數(shù)據(jù)連接沒有準備好,則返回: 425 Can’t open data connection. 目錄列表傳到客戶端后,返回: 226 Transfer complete. ● CWD命令 該命令用于改變服務(wù)器的工作目錄。如: CWD BOOKS 服務(wù)器操作成功返回: 250 Directory changed to /c:/BOOKS. 若沒有找到該目錄,返回: 550 /c:/BOOK: No such file or directory. ● RETR命令 該命令用于文件下載。如 RETR a.txt 服務(wù)器返回: 150 Opening ASCII mode data connection for a.txt (124 bytes). 226 Transfer complete. ● STOR命令 該命令用于上傳文件。如: STOR b.txt 服務(wù)器返回: 150 Opening ASCII mode data connection for b.txt. 以上闡明了客戶端與服務(wù)器間的基本協(xié)作過程,完整的FTP協(xié)議請參閱RFC 959文檔。 三 程序?qū)嵗?/span> 根據(jù)上述FTP的基本原理,利用VB中Winsock控件提供的TCP連接功能,下面舉一簡單的實例。該例子只實現(xiàn)從服務(wù)器(IP地址為10.175.125.49)C:\b目錄下載文本文件a.txt到客戶端C:\a目錄,從客戶端C:\a目錄上傳文本文件b.txt到服務(wù)器C:\b目錄。設(shè)服務(wù)器用戶名為aaa,密碼為aaa。 建立VB工程,添加兩個Winsock控件:Winsock1和Winsock2,Winsock1用于命令連接,Winsock2用于數(shù)據(jù)連接。添加兩個命令按扭:download和upload,download 用于下載,upload用于上傳。 程序代碼具體如下: Dim downorup As String Private Sub Form_Load() Winsock1.Connect "10.175.125.49", 21 ‘建立命令連接 End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim strData As String Winsock1.GetData strData If Left(strData, 3) = "220" Then ‘若命令連接成功 Login ’登錄 End If If Left(strData, 3) = "227" Then ‘若成功進入PASV方式 MakeDataConnection strData ‘建立數(shù)據(jù)連接 End If End Sub Private Sub Login() Winsock1.SendData "USER aaa" & vbCrLf ‘發(fā)送用戶名 Winsock1.SendData "PASS aaa" & vbCrLf ‘發(fā)送密碼 End Sub Private Sub Setpasv() Winsock1.SendData "PASV" & vbCrLf ‘設(shè)置PASV方式 End Sub Private Sub download_Click() ChDir "c:\a" ‘改變客戶端工作目錄 Winsock1.SendData "CWD b" & vbCrLf ‘改變服務(wù)器工作目錄 Setpasv Winsock1.SendData "RETR a.txt" & vbCrLf ‘下載 End Sub Private Sub upload_Click() downorup = "up" Setpasv End Sub Private Sub Winsock2_Connect() If downorup = "up" Then ‘上傳文件,數(shù)據(jù)連接建立后發(fā)送數(shù)據(jù) Dim a As String Dim MyString As String ChDir "c:\a" Open "b.txt" For Binary As #1 Do While Not EOF(1) Line Input #1, a MyString = MyString + a + Chr(13) + Chr(10) Loop Close #1 Winsock2.SendData MyString & vbCrLf End If End Sub Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long) Dim strData As String ‘服務(wù)器從數(shù)據(jù)連接傳來下載文件的數(shù)據(jù)時,保存到本地文件系統(tǒng)中 Winsock2.GetData strData ChDir "c:\a" Open "a.txt" For Output As #1 Print #1, strData Close #1 End Sub Private Sub MakeDataConnection(sData As String) Dim iPos As Integer, iPos2 As Integer Dim strDataAddress iPos = InStr(1, sData, "(") + 1 ‘獲取IP地址 For i = 1 To 4 iPos2 = InStr(iPos, sData, ",") strDataAddress = strDataAddress & Mid(sData, iPos, iPos2 - iPos) & "." iPos = iPos2 + 1 Next strDataAddress = Left(strDataAddress, Len(strDataAddress) - 1) Dim i1 As Single, i2 As Single, inPort As Single ‘計算端口號 iPos = iPos2 + 1 iPos2 = InStr(iPos, sData, ",") i1 = CSng(Mid(sData, iPos, iPos2 - iPos)) iPos = iPos2 + 1 iPos2 = InStr(iPos, sData, ")") i2 = CSng(Mid(sData, iPos, iPos2 - iPos)) inPort = i1 * 256 + i2 If Not Winsock2.State = sckConnected Then Winsock2.Close End If Winsock2.Connect strDataAddress, inPort End Sub Private Sub Winsock2_SendComplete() ChDir "c:\a" ‘上傳文件數(shù)據(jù)通過數(shù)據(jù)連接發(fā)送完后,通知服務(wù)器接收并保存到其文件系統(tǒng)中 Winsock1.SendData "CWD b" & vbCrLf Winsock1.SendData "TYPE ASCII" & vbCrLf Winsock1.SendData "STRU record-structure" & vbCrLf Winsock1.SendData "STOR b.txt" & vbCrLf End Sub 該程序在Windown 98下通過Micosoft Visual Basic 5.0編譯執(zhí)行成功,服務(wù)器是運行在Windown 98下的Seuver-U FTP軟件。對其他不同文件系統(tǒng)間的FTP,應(yīng)根據(jù)RFC 959文檔對程序進行適當?shù)男薷?,這里不再敘述。 四 結(jié)束語 在鐵路各信息系統(tǒng)中,數(shù)據(jù)的傳輸是其中重要的一部分。有些系統(tǒng)在總體設(shè)計和編程時沒有充分考慮數(shù)據(jù)傳輸部分,通過安裝FTP軟件用手工方式進行數(shù)據(jù)傳輸,不但降低了效率,還會出現(xiàn)數(shù)據(jù)漏傳,丟失等現(xiàn)象。在總體設(shè)計充分考慮數(shù)據(jù)傳輸部分,并在編程時將FTP內(nèi)嵌到應(yīng)用程序中,這樣可以提高傳輸效率和質(zhì)量。 |
|
|
來自: zjsxShenwx > 《編程技術(shù)》