VB開發客戶服務器軟件的設計與實現
|
摘 要 本文介紹了TCP/IP協議和客戶/服務器程序的基本原理,給出了利用Visual Basic6.0開發客戶/服務器軟件的設計方法;最后給出了應用實例。
關鍵詞 VB TCP/IP協議 Winsock控件 客戶/服務器
1 引言
隨著網絡通信的興起與迅速發展,TCP/IP協議已成為計算機網絡中最主要的傳輸協議,TCP/IP傳輸協議也越來越為人所熟知。目前的Internet 網就是基于TCP/IP協議的互聯網絡。TCP/IP除了用于廣域外,在局域網中也廣泛應用。
TCP是傳輸控制協議,它提供了一種可靠的、面向會話連接的數據流服務,它可以在一個分組可能發生丟失、破壞、重復、延遲和亂序的不可靠物理網絡之上通過確認、流控、復用同步等自動糾錯技術提供一種可靠的進程間通信機制,從而充分保證用戶數據傳送的可靠和有序性。使用TCP協議通信時,TCP建立并控制數據發送方與接收方的會話關系,當接收方正確收到數據后,必須向發送方發送確認信息。如果發送方在指定時間內未能收到確認信息,將重發數據包。
IP指分組交換協議,是聯網的主機之間定義數據包傳送路由的規則,它的基本任務是通過網絡傳送數據報,各個IP數據報之間是相互獨立的。IP本身沒有連接協議,在交換數據前不會建立會話關系。IP收到數據后也不確認,發送方和接收方都不檢測數據傳輸的正確性。所以僅有IP是不可靠的,不能確保正確傳輸數據。TCP與IP的組合則構成了功能完整的傳輸協議。
在TCP/IP網絡應用中,多數網絡應用程序是使用客戶/服務器模型方式,客戶向服務器發出服務請求,服務器作出應答響應,服務器通常在一個眾所周知的地址偵聽客戶向服務器發出的請求,服務進程這時一直是處于休眠狀態,直到有一個客戶程序提出連接請求。服務器作出應答,并為客戶提供相應的服務。客戶/服務器模型最重要的特點是非對等相互作用,客戶與服務器處于不平等的地位。服務器擁有客戶機所不具備的各種軟硬件資源和運算處理能力,服務器提供服務,客戶請求服務,這種模式適應了網絡資源、運算能力、信息分布不均等現象,成為IP應用的主要模式。Internet中的WWW、FTP、Telnet、E-mail等許多典型應用都是采用客戶/服務器模型方式。
Visual Basic是Windows環境下簡單、易學、高效的可視化編程語言開發系統,以其所見即所得的可視化界面設計風格和32位面向對象的程序設計等特點,已廣泛地應用于各個領域,是很多計算機軟件開發人員采用的開發工具。VB不但提供了良好的界面設計能力,而且在網絡通信方面的功能也很強。采用VB開發網絡通信應用軟件十分方便,尤其軟件界面設計非常便捷,編程工作量較小,開發周期短。
Visual Basic6.0中提供了Winsock控件,用于支持網絡中兩臺以上計算機之間進行通信。Winsock控件提供了多樣化的屬性和方法來實現網絡通信。通過設置Winsock控件屬性及調用控件方法就能夠實現TCP或UDP方式的網絡通信。因此,使用Winsock控件編寫網絡通信程序的過程,實際上就是設置Winsock控件屬性和調用控件方法的過程。利用這個控件,編程人員可以輕松地編寫出TCP/IP客戶服務器程序。
2 Winsock控件
Winsock控件是不可視控件,它提供了訪問TCP和UDP網絡服務非常簡便的途徑,使編程人員開發客戶/服務器應用程序時,不必了解TCP的細節或調用低級的WinsockAPIs函數,只通過設置Winsock控件的屬性并調用其方法,就可直接連接到一臺遠程計算機進行,并可實現雙向數據交換。Microsoft Access、Visual Baisc、Visual C++或Visual FoxPro都可用其編寫客戶服務器程序。
如果訪問TCP傳輸控制協議服務功能,則須建立連接并實現主機間點對點通信。如果訪問UDP數據文報協議功能,則不建立連接,發送數據將以廣播方式上網傳輸。
3 TCP/IP客戶服務器程序設計方法
使用TCP/IP協議通訊,首先要指定通信方式為TCP方式,將Winsock控件的Protocol屬性設置為sckTCPProtocol。然后,按TCP通信協議規定,先要申請建立網絡連接,然后才能傳輸數據。
3.1服務器程序開始偵聽網絡
服務器程序窗體中有三個Winsock控件,Name分別為sckServer、sckBusy和sckListen。
其中sckListen是偵聽控件;sckBusy是;sckServer連接控件。偵聽控件和連接控件不能是同一個Winsock控件。
服務器程序必須首先偵聽網絡,等待客戶的連接申請,才有可能建立網絡連接。服務器程序開始偵聽網絡前,需要為偵聽用(sckListen)控件的LocalPort屬性設置通信接口,然后調用Listen方法。服務器程序開始偵聽網絡的程序代碼如下:
| sckListen.LocalPort=4477 sckListen.Listen '偵聽網絡 |
3.2客戶程序申請連接
當服務器程序已經啟動運行并開始偵聽網絡后,在客戶程序申請連接前,需要為客戶Winsock控件的RemodeHost屬性設置遠程主機,為RemodePort屬性設置通信接口,然后再調用Connect方法向服務器程序申請連接。
設置遠程主機名,可以是計算機名也可是IP地址。如果是主機計算機名,則需要系統翻譯為相應的IP地址;如果是主機IP地址,則直接進行連接。
申請連接的程序代碼如下:
| sckClient.Protocol = sckTCPProtocol '設置協議為TCP方式 'IP地址"127.0.0.1"代表本機,與本機的實際地址無關 sckClient.RemoteHost = "127.0.0.1""129.200.0.1" '設置遠程主機接口號,該值必須與設置遠程主機服務器程序的接口號一致 sckClient.RemotePort = 4477 sckClient.Connect '申請連接 |
3.3服務器程序應答連接請求
服務器程序啟動偵聽網絡后,當客戶程序執行Connect方法申請連接時,服務器程序的偵聽控件(sckListen)觸發ConnectionRequest事件,并傳遞連接請求句柄。編程人員需要在該當事件程序中調用連接控件(sckServer)的Accept方法實現連接。
服務器程序應答連接的程序代碼如下:
| Private Sub sckListen_ConnectionRequest(ByVal requestID As Long) sckServer.Accept requestID '應答連接請求 End Sub |
當服務器程序執行Accept方法建立連接后,客戶程序中的接連控件將觸發Connect事件通報連接完成,否則觸發Error事件通報連接失敗。可以在該事件程序中加入連接后的處理程序。
如果要求服務器程序支持多用戶連接,則需要創建Winsock控件數組,在連接時動態生成Winsock控件與客戶程序建立連接。程序代碼應修改如下:
| Private Sub sckListen_ConnectionRequest(ByVal requestID As Long) Dim i As Long If CurNumber<MaxNumber Then 'MaxNumber為最大連接數,CurNumber為當前連接數 For i = 1 To CurNumber If sckServer(i).State = 0 Then '判斷是否有空閑Winsock控件 Exit For End If Next i If i = CurNumber Then CurNumber = CurNumber + 1 i = CurNumber End If Load sckServer(i) '動態加載Winsock控件 sckServer(i).Accept requestID Exit Sub End If sckBusy.Close sckBusy.Accept requestID End Sub |
3.4傳送數據
當服務器程序和客戶程序連接成功后,可以開始傳送數據。建立連接后的服務器程序和客戶程序都可以發送或接收數據。當一方要發送數據時,調用SendData方法。
| Dim SendStr As String SendStr = "連接成功!" Winsock1.SendData SendStr '傳送數據 |
如果一方發送了數據,在連接的另一方控件將產生DataArrival事件,在DataArrival事件處理程序中需要調用GetData方法接收數據。接收數據類型必須與發送數據的類型一致方可正確接收數據。接收數據的程序代碼如下:
| Dim RecStr As String sckClient.GetData RecStr Print RecStr |
3.5關閉連接
當應用程序結束數據傳送后,必須關閉連接,釋放系統資源。當連接的一方關閉連接時,可以調用Close方法。關閉連接程序代碼如下:
| sckClient.Close '關閉連接 |
一方執行關閉連接后,在連接的另一方控件將產生Close事件。程序需要處理事件,完成關閉連接的最后工作。該事件的處理代碼如下:
| Private Sub sckServer_Close() sckServer(Index).Close '釋放接連 Unload sckServer(Index) '刪除控件 End Sub |
4 使用UDP通信方式程序設計方法
UDP用戶報文協議是一個無連接協議,與TCP協議操作不同,UDP協議不使用報文確認機制,不對報文排序,不進行流控,因而UDP報文可能出現丟失、重復、亂序等現象,但由于它的前期工作比TCP少,計算機不建立連接,因而可以迅速地展開通信,一般用于傳輸少量不重要的數據和信息。Winsock控件的UDP通信方式是一種廣播方式,當UDP主機發送數據時,網絡上所有其它主機都能收到數據,UDP通信比TCP方式簡單,由于UDP不需要連接,所以沒有申請連接和關閉連接的過程。UDP發送者忽略接收者是否實際收到數據,而接收者也忽略發送者是否已發送了數據。這使編寫UDP通信方式的網絡程序非常簡單。
4.1 設置服務器程序中Winsock控件的屬性
在服務器程序中,需要為Winsock控件的LocalPort屬性設置通信接口:
| sckserver.LocalPort=4477 |
4.2 客戶程序發送數據
當UDP主機要發送數據時,可調用SendData方法。發送數據程序的代碼如下:
| Dim SendStr As String SendStr = "發送信息!" sckClient.SendData SendStr '傳送數據 |