摘要:介紹了VB中Winsock控件的屬性、方法、事件,并示例性地說明在VB中用 Winsock控件實現(xiàn)網絡通信的一種簡易方法。
關鍵詞:網絡編程;Winsock控件;TCP協(xié)議;UDP協(xié)議
中圖分類號:TP311.1 文獻標識碼:A 文章編號:1009-3044(2009)14-3695-02
Based on Winsock Control ofNetwork Programming Technology
QIU Yu-qiao
(Department of chemistry, Qiongzhou University, Wuzhishan 572200, China)
Abstract: The attribute, method and event of Winsock control in VB has been introduced. And a simplemethod of the use of Winsock control to realize network communication ispresented.
Key words: Winsock control; TCP; UDP; network communication
近幾年來,計算機網絡的應用越來越廣泛,網絡應用軟件的開發(fā)需求與日俱增。在網絡編程時,常常會遇到客戶端之間或者客戶端和服務器之間的信息互傳問題。 常用的解決方法是利用 Socket套接字數(shù)據(jù)通信來進行點對點的文件傳輸。Windows Socket作為一個開放的、支持多種協(xié)議的 Windows下的網絡編程接口已經得到了普遍的應用。 采用這種方法較為簡便,卻能做到在互通的網絡中任何兩臺計算機之間的文件共享和傳輸。
1 Winsock控件介紹
Winsock是在1991年由JSB公司Marting Hall所提出的。Windows Sockets是指在MS Windows下發(fā)展網絡程序的應用程序接口(API),并通過傳輸控制協(xié)議TCP和數(shù)據(jù)文報協(xié)議UDP進行數(shù)據(jù)交換。 TCP協(xié)議是基于連接的協(xié)議,可以將它同電話系統(tǒng)相比,在開始數(shù)據(jù)傳輸之前,用戶必須先建立連接;UDP協(xié)議則是一個無連接、不可靠的協(xié)議,跟TCP操作不同,計算機并不建立連接。 如果你所傳輸?shù)臄?shù)據(jù)可靠性是要求較高的,請選用TCP協(xié)議進行通信,否則可以選用UDP協(xié)議進行通信。 選用TCP進行通信需要更多的系統(tǒng)資源。 本文著重對其TCP協(xié)議的應用進行討論。
2 Winsock控件的常用屬性、方法和事件
1) Winsock控件的屬性:
LocalHostName/RemoteHost:本地/遠程 主機名;
LocalPort/RemotePort:本地/遠程 機使用的端口號;
Protocol:設置通信所使用的協(xié)議( TCP或UDP);
State:控件當前的狀態(tài)
2) Winsock 控件的方法:
Connect/Accept/Listen:發(fā)送/接收/監(jiān)聽一個連接請求;
GetData/SendData:獲取/發(fā)送數(shù)據(jù);
Close:關閉一個TCP連接;
3) Winsock控件的事件:
Close:遠程主機已關閉觸發(fā)此事件;
ConnectRequest:連接請求到達觸發(fā)此事件;
DataArrival:數(shù)據(jù)到達觸發(fā)此事件;
3 Winsock控件的工作原理及過程
使用TCP協(xié)議創(chuàng)建客戶應用程序,確定服務器計算機名或者 IP地址(RemoteHost屬性)及其監(jiān)聽的端口(RemotePort屬性),然后調用 Connect方法發(fā)送連接請求;服務器端應用程序,則設置一個監(jiān)聽端口(LocalPort屬性),并調用 Listen方法監(jiān)聽連接請求,當客戶計算機需要連接時就會發(fā)生 ConnectionRequest事件,為完成連接,可在ConnectionRequest事件中調用 Accept方法。 建立連接后,任何一方計算機都可以收發(fā)數(shù)據(jù)??烧{用 SendData方法發(fā)送數(shù)據(jù);當接收數(shù)據(jù)時會發(fā)生 DataArrival事件,在DataArrival事件中調用 GetData方法就可獲取數(shù)據(jù)。一個 TCP連接需要客戶機和服務器都要有一個 IP地址和端口,所標識的端口一定不能再讓其它應用程序使用。
UDP協(xié)議創(chuàng)建連接,首先要設置客戶計算機的 LocalPort屬性,然后服務器計算機需將 RemoteHost設置為客戶計算機的 Internet地址,將 RemotePort屬性設置為跟客戶計算機的 LocalPort屬性相同的端口,并調用 SendData方法來發(fā)送信息,GetData方法來獲取已發(fā)送的信息。由于UDP協(xié)議沒有建立連接,通信效率高,但可靠性不如 TCP協(xié)議,使用 UDP發(fā)送消息,有時會出現(xiàn)收不到消息的情況。
4 Winsock控件的實例編程
下面實例介紹WinSock控件采用TCP協(xié)議實現(xiàn)網絡通信的一種簡單編程方法。
4.1 服務器端應用程序
1) 新建“標準 EXE”工程。
2) 在窗體上放入一個 winsock控件,并將它的名字改為:tcpServer。
3) 在窗體上放兩個 TextBox控件。
4) 代碼及注釋如下:
Private Sub Form_Load()
tcpServer.LocalPort = 2001 '端口
tcpServer.Listen'監(jiān)聽
End Sub
Private Sub tcpServer_ConnectionRequest (ByVal requestID As Long)
If tcpServer.State <> sckClosed Then tcpServer.Close
' 使收到對方連接請求之前保持關閉狀態(tài)
tcpServer.Accept requestID '建立連接
End Sub
Private Sub tcpServer_DataArrival (ByVal bytesTotal As Long)
Dim strDataAs String
tcpServer.GetData strData '接收信息
txtOutput.Text = strData
End Sub
Private SubtxtSendData_Change()
tcpServer.Send DatatxtSendData.Text '發(fā)送信息
EndSub
4.2 TCP客戶端的建立
1) 在工程中添加一個新的窗體,在窗體上添加一個Winsock控件其命名為tcpClient。
2) 在窗體上添加2個TextBox控件和2個CommandButton控件。
3) 代碼及注釋如下:
Private Subcmdconnect_Click()'建立連接命令按鈕
tcpClient.Connect
End Sub
PrivateSubcmdSent_Click()'發(fā)送信息命令按鈕
tcpClient.SendData txtsend.Text
EndSub
Private Sub Form_Load()
tcpClient.RemoteHost=\"qiuyuqiao\"
tcpClient.RemotePort=2001
'設置遠程主機名(或 IP地址)和端口號
End Sub
Private SubtcpClient_Close()
MsgBox\"服務器已關閉\"
EndSub
PrivateSubtcpClient_Connect()
MsgBox\"連接成功\"
EndSub
PrivateSubtcpClient_DataArriva(ByValbytesTotalAsLong)
Dim str As String
tcpClient.GetData str
txtoutput.Text=str
EndSub
上面設計的基本服務器只能接收一個連接請求。一般來說,客戶端是不止一個的,如果每一個客戶端都使用一個端口連接時,那么有上百個或更多的客戶時就需要許多個Wnsock控件與之相對應。其實可以通過創(chuàng)建控件數(shù)組,使用一個控件也可以同時接收多個連接請求。利用這種方法,不需要關閉連接,而只需要創(chuàng)建新的控件實例(通過設置其索引屬性),然后在新的實例上調用 Accept方法。在這就不再做詳細的論述。
5 結束語
以上的實例是使用VB Winsock編程實現(xiàn)計算機網絡中點對點通信。Winsock技術的出現(xiàn)極好地屏蔽了網絡低層復雜的結構和協(xié)議,這使得基于Winsock的網絡應用程序可以在不同類型的網絡上運行,同時使Winsock成為網絡編程的最流行技術。
參考文獻:
[1] 王曉平, 鐘軍. VisualBasic網絡通信協(xié)議分析與應用實現(xiàn)[M].北京:人民郵電出版社,2003.
[2] 高俊光. 基于VB的Winsock控件的原理與應用[J]. 應用科技,2004;31(3):13-14.
[3] 黃玲玲,楊剴,王穎. 在VB中使用Winsock控件實現(xiàn)局域網通信[J].信息技術,2005(6):24-26.