高永強,李翠蓮
(1.呂梁學(xué)院 計算機系,山西 呂梁 033000;2.離石師范 計算機系;山西 呂梁 033000)
當今軟件技術(shù)主要是網(wǎng)絡(luò)編程,TCP/IP網(wǎng)絡(luò)通訊協(xié)議應(yīng)用最為廣泛。文章通過討論采用Winsock控件對TCP/IP協(xié)議訪問網(wǎng)絡(luò)的捷徑,不需了解TCP/IP實現(xiàn)過程的細節(jié)和調(diào)用復(fù)雜的Winsock API,只需設(shè)置相應(yīng)的屬性值和編寫相應(yīng)事件代碼,就可以實現(xiàn)不同計算機系統(tǒng)之間的數(shù)據(jù)通信。
Winsock是Windows下廣泛應(yīng)用的、開放的、支持多種協(xié)議的網(wǎng)絡(luò)編程接口。通信的基礎(chǔ)是套接口(Socket),一個套接口是通訊的一端。在這一端上可以找到與其對應(yīng)的一個名字。為了保證通訊的可靠性,在下面的程序中使用的是TCP/IP協(xié)議,并且在客戶端和服務(wù)端均采用預(yù)設(shè)端口1001(大家在實踐時可以自行更改)。
一個在建立點對點的應(yīng)用時最常用的范例便是客戶機/服務(wù)器模型。在這種方案中,客戶應(yīng)用程序向服務(wù)器程序請求服務(wù)。這種方式隱含了在建立客戶機/服務(wù)器間通訊時的非對稱性??蛻魴C/服務(wù)器模型工作時要求有一套為客戶機和服務(wù)器所共識的慣例來保證服務(wù)能夠被提供(或被接受)。這一套慣例包含了一套協(xié)議。它必須在通訊的兩頭都被實現(xiàn)。根據(jù)不同的實際情況,協(xié)議可能是對稱的或是非對稱的。在對稱的協(xié)議中,每一方都有可能扮演主從角色;在非對稱協(xié)議中,一方被不可改變地認為是主機,而另一方則是從機。一個服務(wù)程序通常在一個眾所周知的地址監(jiān)聽對服務(wù)的請求,也就是說,服務(wù)進程一直處于休眠狀態(tài),直到一個客戶對這個服務(wù)的地址提出了連接請求。在這個時刻,服務(wù)程序被“驚醒”并且為客戶提供服務(wù)-對客戶的請求作出適當?shù)姆磻?yīng)。這一請求/相應(yīng)的過程可以簡單的用圖表示。雖然基于連接的服務(wù)是設(shè)計客戶機/服務(wù)器應(yīng)用程序時的標準,但有些服務(wù)也是可以通過數(shù)據(jù)報套接口提供的,其大致流程如圖1所示。
圖1 Winsock工作原理
端口號范圍是0-65535,(其中0-1023被預(yù)先定義所占用(如http占用端口80),故端口號設(shè)置在1024-65535之間,防止端口沖突。
建立服務(wù)器端和客戶端,服務(wù)器端設(shè)置與客戶端口相同的一個監(jiān)聽端口,同時調(diào)用服務(wù)器端的Listen方法監(jiān)聽客戶端的請求;當接收到客戶端的連接請求就調(diào)用事件ConnectionRequest的方法Accept與客戶端建立連接??蛻舳吮仨氈婪?wù)器端的地址;必須與服務(wù)器端有相同的端口(用于數(shù)據(jù)的輸入和輸出);調(diào)用方法Connect與服務(wù)器端連接??蛻舳撕头?wù)器端連接后,服務(wù)器與客戶機端通過SendData方法和GetData方法自由地收發(fā)數(shù)據(jù)[1]。
文章通過一個具體事例,來說明使用Winsock控件進行點對點的網(wǎng)絡(luò)通信。事例需要兩臺計算機,分別為服務(wù)器端和客戶端,實現(xiàn)將服務(wù)器端的某一文件發(fā)送到客戶端,從而服務(wù)器端和客戶端點對點的文件傳輸。
文章實現(xiàn)點對點文件的傳輸中最基本的文件傳輸方式,只建立一個發(fā)送端和接收端?;驹恚喊l(fā)送端獲取要傳輸文件的基本信息(文件名及文件長度)發(fā)送接收端,并建立一個和文件一樣大小的數(shù)據(jù)緩沖區(qū),并將文件內(nèi)容讀入緩沖區(qū),軟后將數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)發(fā)送給接收端。同時,接收端接收到文件基本信息后,也為其創(chuàng)一個文件和相同大小數(shù)據(jù)緩沖區(qū),將發(fā)送的文件數(shù)據(jù)存儲到數(shù)據(jù)緩沖區(qū)中,然后,將數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)寫入創(chuàng)建的文件中去。從而實現(xiàn)了不同計算機之間文件的傳輸。[3]
“通用”中聲明如下:
“通用”中聲明如下:
上例介紹了Winsock控件文件傳輸?shù)倪^程。但是,要傳送的數(shù)據(jù)量較大時,不能將幾百MB甚至上GB的數(shù)據(jù)放到內(nèi)存中區(qū),應(yīng)該將文件分割為一定的大小,分成若干個數(shù)據(jù)塊。所以,先設(shè)置數(shù)據(jù)塊的大?。ㄈ?28 K),根據(jù)文件長度計算出數(shù)據(jù)塊數(shù)。接著,依次讀取數(shù)據(jù)塊到數(shù)據(jù)緩沖區(qū)中,然后,將數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)發(fā)送接收端的計算機上。接收端也建立一個與發(fā)送端相同大小數(shù)據(jù)緩沖區(qū),依次接收傳輸過來的數(shù)據(jù)塊,并將緩沖區(qū)的數(shù)據(jù)寫入到文件中,從而實現(xiàn)大文件的傳輸。
有時,當正傳輸?shù)奈募蝗槐恢袛啵瑸榱斯?jié)省時間可以采用“斷點續(xù)傳”。“斷點續(xù)傳”的方法采用設(shè)置一個臨時文件,記錄已經(jīng)傳輸?shù)奈募畔ⅲㄟ^臨時文件信息推算出未傳輸?shù)臄?shù)據(jù)。所以每次文件傳輸前,查找文件是否有臨時文件,并將此文件信息傳輸給服務(wù)器端,服務(wù)器端據(jù)此接著傳輸剩余的數(shù)據(jù),當文件全部傳輸完畢時,臨時文件被刪除,這樣就實現(xiàn)了“斷點續(xù)傳”。
文章依然通過上面的實例,介紹如何在VB中使用Winsock控件實現(xiàn)文件的分塊傳輸和斷點續(xù)傳。
“通用”中聲明如下:
“數(shù)據(jù)到達”事件的代碼:
文章介紹在VB中使用Winsock控件實現(xiàn)點對點文件傳輸?shù)木W(wǎng)絡(luò)傳輸。此外,本文還介紹了實際工作中“斷點續(xù)傳”編程方法,以滿足實際工作需要,其設(shè)計的思想也具有普遍的通用性[2]。
[1]微軟中國有限公司譯.Microsoft C orporation.中文Visual Basic 6.0程序員指南[M].北京:科學(xué)出版社,1998.
[2]黃淼云.VB 6.0辦公自動化編程[M].北京:國防工業(yè)出版社,2000.
[3]何克石.基于 Winsock 的點對點網(wǎng)絡(luò)通信[J].交通與計算機,2000,(5):22-23.