摘 要: 本文介紹利用WinSock控件及控件數組建立連接,并討論怎樣實現客戶機/服務器模式下一個服務端同時為多個客戶端提供WinSock連接。
關鍵詞: VB WinSock控件 數組
隨著計算機局域網的不斷發展、普及,網絡版軟件也越來越體現出了網絡時代的優點與其先進性。往往此類軟件都會有一個服務端,由服務端控制著若干客戶端的運行。一般來說,服務端和客戶端之間都要進行大量的信息傳送,而其中很多就是使用WinSock控件。
一、WinSock控件的基礎知識
WinSock控件對用戶來說是不可見的,它提供了訪問TCP和UDP網絡服務的方便途徑。使用WinSock編寫網絡應用程序,不必了解網絡協議的細節或調用低級的WinSock API,通過對WinSock控件的屬性設置和方法調用就可以輕易實現計算機之間的連接,并且還可以實現雙向交換數據。
1.常用屬性
LocalPort:本地通信程序(WinSock)的端口號。
RemoteHost:遠程機器名,機器名也可以是IP地址。
RemoteHostIP:遠程機器IP地址。RemoteHost和RemoteHostIP屬性只設置其中之一。
RemotePort:遠程通信程序(WinSock)端口號。
Protocol:使用協議。可選的協議是TCP和UDP,對應的VB的常量分別是sck、TCP、Protocol和sck、UDP、Protocol,Winsock控件默認協議是TCP。
2.常用方法
Accept:接受一個連接請求。格式:對象.accept requestID。
Bind:多協議接口下,把接口卡、IP地址捆綁在一起。格式:對象.Bind端口號,IP。
Close:關閉連接。格式:對象.Close。
Connect:發送連接請求。格式:對象.Connect(IP,遠程端口)。
GetData:取出數據后清除數據緩沖區。格式:對象.Getdata變量。
PeekData:取出數據后,但不清除數據緩沖區。格式:對象.Peekdata變量。
Listen:進入監聽狀態,以便及時對連接請求進行響應。格式:對象.Listen。
SendData:發送數據。格式:對象.SendData data。
3.常用事件
Close:遠程設備關閉連接時觸發事件。
Connect:建立連接,進行通信時觸發。
ConnectionRequest:有連接請求時觸發。
DataArrival:有數據到達時觸發。
二、WinSock控件應用方法
1.WinSock連接過程
網絡應用軟件中,必須有服務端和客戶端。服務端能夠接受客戶端的連接請求,而連接必須由客戶端發起。具體過程如下。
準備工作:
服務端:設置WinSock端口號(LocalPort),使用協議(Protocol),如果機器中有兩塊以上的網卡,則需要進行端口綁定(Bind),使用Listen方法進入監聽狀態,等待響應客戶端的連接請求。
客戶端:設置WinSock遠程計算機名或IP地址(RemoteHost或RemoteHostIP),設置遠程計算機端口號(此處要和服務端端口號一致),使用協議(Protocol)。
連接過程:
第一步,由客戶端使用Connect方法請求建立連接。
第二步,服務端接收到連接請求,觸發ConnectionRequest事件,同時得到一個requestID參數。
第三步,服務端使用Accept方法建立連接,該方法必須用到上一步得到的requestID參數,Listen狀態自動結束。
第四步,連接建立后,客戶端會觸發Connect事件(如果設置響應的話)。
第五步,雙方可以進行雙向數據傳輸,使用SendData方法發送數據,接收方接收到數據后,會觸發DataArrival事件,使用GetData或PeerData方法接收數據。
第六步,任意一方發出結束請求(Close)或直接關閉,對方觸發Close事件(如果設置相應的話)。
以上就是一個WinSock連接實施的全過程,適應于一個服務端對應一個客戶端的情況。但是實際應用中,往往是一個服務端可能要同時和多個客戶端連接,而所有的客戶端設置的遠程端口號是相同的。從上面的連接過程可以看出,當服務端響應某個客戶端的連接請求后,服務端的監聽狀態隨即結束,客戶端的連接請求也不會再被響應,也就是說,服務端不能夠同時和多個客戶端連接。為了使得服務端能夠同時和多個客戶端同時連接,我們往往在服務端采用WinSock控件數組來進行連接。
2.WinSock控件數組的應用
應用WinSock控件數組,能夠輕松實現一個服務端對應多個客戶端的連接請求,從而實現一對多的網絡版應用程序。其原理如下:
將WinSock控件的Index屬性設置為0,使之成為一個控件數組,再設置端口號等參數,用Listen方法使WinSock(0)控件進入監聽狀態。有客戶端請求連接時,WinSock(0)會觸發ConnectionRequest事件,此時,不使用WinSock(0)響應連接請求,而是裝入一個WinSock(i)控件,由WinSock(i)調用Accept方法建立連接。建立連接時,只需要在Accept后面注明從WinSock(0)的ConnectionRequest事件中得來的requestID參數,即可實現WinSock(i)和客戶端的連接。由于連接時未使用WinSock(0),所以其監聽狀態并未改變,還可以響應其它客戶端發出的連接請求。
參考文獻:
[1]李立宗.VB程序設計教程[M].南開大學出版社,2009.2.
[2]Andrew S.Tanenbaum.計算機網絡(第4版)[M].清華大學出版社,2004.8.
[3]袁帥等.Visual Basic編程實例教程[M].北京希望電子出版社,2002.11.