高永強,李翠蓮
(1.呂梁學院 計算機系,山西 呂梁 033000;2.離石師范 計算機系;山西 呂梁 033000)
當今軟件技術主要是網絡編程,TCP/IP網絡通訊協議應用最為廣泛。文章通過討論采用Winsock控件對TCP/IP協議訪問網絡的捷徑,不需了解TCP/IP實現過程的細節和調用復雜的Winsock API,只需設置相應的屬性值和編寫相應事件代碼,就可以實現不同計算機系統之間的數據通信。
Winsock是Windows下廣泛應用的、開放的、支持多種協議的網絡編程接口。通信的基礎是套接口(Socket),一個套接口是通訊的一端。在這一端上可以找到與其對應的一個名字。為了保證通訊的可靠性,在下面的程序中使用的是TCP/IP協議,并且在客戶端和服務端均采用預設端口1001(大家在實踐時可以自行更改)。
一個在建立點對點的應用時最常用的范例便是客戶機/服務器模型。在這種方案中,客戶應用程序向服務器程序請求服務。這種方式隱含了在建立客戶機/服務器間通訊時的非對稱性??蛻魴C/服務器模型工作時要求有一套為客戶機和服務器所共識的慣例來保證服務能夠被提供(或被接受)。這一套慣例包含了一套協議。它必須在通訊的兩頭都被實現。根據不同的實際情況,協議可能是對稱的或是非對稱的。在對稱的協議中,每一方都有可能扮演主從角色;在非對稱協議中,一方被不可改變地認為是主機,而另一方則是從機。一個服務程序通常在一個眾所周知的地址監聽對服務的請求,也就是說,服務進程一直處于休眠狀態,直到一個客戶對這個服務的地址提出了連接請求。在這個時刻,服務程序被“驚醒”并且為客戶提供服務-對客戶的請求作出適當的反應。這一請求/相應的過程可以簡單的用圖表示。雖然基于連接的服務是設計客戶機/服務器應用程序時的標準,但有些服務也是可以通過數據報套接口提供的,其大致流程如圖1所示。

圖1 Winsock工作原理
端口號范圍是0-65535,(其中0-1023被預先定義所占用(如http占用端口80),故端口號設置在1024-65535之間,防止端口沖突。
建立服務器端和客戶端,服務器端設置與客戶端口相同的一個監聽端口,同時調用服務器端的Listen方法監聽客戶端的請求;當接收到客戶端的連接請求就調用事件ConnectionRequest的方法Accept與客戶端建立連接??蛻舳吮仨氈婪掌鞫说牡刂罚槐仨毰c服務器端有相同的端口(用于數據的輸入和輸出);調用方法Connect與服務器端連接??蛻舳撕头掌鞫诉B接后,服務器與客戶機端通過SendData方法和GetData方法自由地收發數據[1]。
文章通過一個具體事例,來說明使用Winsock控件進行點對點的網絡通信。事例需要兩臺計算機,分別為服務器端和客戶端,實現將服務器端的某一文件發送到客戶端,從而服務器端和客戶端點對點的文件傳輸。
文章實現點對點文件的傳輸中最基本的文件傳輸方式,只建立一個發送端和接收端。基本原理:發送端獲取要傳輸文件的基本信息(文件名及文件長度)發送接收端,并建立一個和文件一樣大小的數據緩沖區,并將文件內容讀入緩沖區,軟后將數據緩沖區中的數據發送給接收端。同時,接收端接收到文件基本信息后,也為其創一個文件和相同大小數據緩沖區,將發送的文件數據存儲到數據緩沖區中,然后,將數據緩沖區的數據寫入創建的文件中去。從而實現了不同計算機之間文件的傳輸。[3]
“通用”中聲明如下:


“通用”中聲明如下:


上例介紹了Winsock控件文件傳輸的過程。但是,要傳送的數據量較大時,不能將幾百MB甚至上GB的數據放到內存中區,應該將文件分割為一定的大小,分成若干個數據塊。所以,先設置數據塊的大?。ㄈ?28 K),根據文件長度計算出數據塊數。接著,依次讀取數據塊到數據緩沖區中,然后,將數據緩沖區中的數據發送接收端的計算機上。接收端也建立一個與發送端相同大小數據緩沖區,依次接收傳輸過來的數據塊,并將緩沖區的數據寫入到文件中,從而實現大文件的傳輸。
有時,當正傳輸的文件突然被中斷,為了節省時間可以采用“斷點續傳”?!皵帱c續傳”的方法采用設置一個臨時文件,記錄已經傳輸的文件信息,通過臨時文件信息推算出未傳輸的數據。所以每次文件傳輸前,查找文件是否有臨時文件,并將此文件信息傳輸給服務器端,服務器端據此接著傳輸剩余的數據,當文件全部傳輸完畢時,臨時文件被刪除,這樣就實現了“斷點續傳”。
文章依然通過上面的實例,介紹如何在VB中使用Winsock控件實現文件的分塊傳輸和斷點續傳。
“通用”中聲明如下:



“數據到達”事件的代碼:



文章介紹在VB中使用Winsock控件實現點對點文件傳輸的網絡傳輸。此外,本文還介紹了實際工作中“斷點續傳”編程方法,以滿足實際工作需要,其設計的思想也具有普遍的通用性[2]。
[1]微軟中國有限公司譯.Microsoft C orporation.中文Visual Basic 6.0程序員指南[M].北京:科學出版社,1998.
[2]黃淼云.VB 6.0辦公自動化編程[M].北京:國防工業出版社,2000.
[3]何克石.基于 Winsock 的點對點網絡通信[J].交通與計算機,2000,(5):22-23.