邱育橋
摘要:介紹了VB中Winsock控件的屬性、方法、事件,并示例性地說(shuō)明在VB中用 Winsock控件實(shí)現(xiàn)網(wǎng)絡(luò)通信的一種簡(jiǎn)易方法。
關(guān)鍵詞:網(wǎng)絡(luò)編程;Winsock控件;TCP協(xié)議;UDP協(xié)議
中圖分類號(hào):TP311.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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
近幾年來(lái),計(jì)算機(jī)網(wǎng)絡(luò)的應(yīng)用越來(lái)越廣泛,網(wǎng)絡(luò)應(yīng)用軟件的開發(fā)需求與日俱增。在網(wǎng)絡(luò)編程時(shí),常常會(huì)遇到客戶端之間或者客戶端和服務(wù)器之間的信息互傳問題。 常用的解決方法是利用 Socket套接字?jǐn)?shù)據(jù)通信來(lái)進(jìn)行點(diǎn)對(duì)點(diǎn)的文件傳輸。Windows Socket作為一個(gè)開放的、支持多種協(xié)議的 Windows下的網(wǎng)絡(luò)編程接口已經(jīng)得到了普遍的應(yīng)用。 采用這種方法較為簡(jiǎn)便,卻能做到在互通的網(wǎng)絡(luò)中任何兩臺(tái)計(jì)算機(jī)之間的文件共享和傳輸。
1 Winsock控件介紹
Winsock是在1991年由JSB公司Marting Hall所提出的。Windows Sockets是指在MS Windows下發(fā)展網(wǎng)絡(luò)程序的應(yīng)用程序接口(API),并通過(guò)傳輸控制協(xié)議TCP和數(shù)據(jù)文報(bào)協(xié)議UDP進(jìn)行數(shù)據(jù)交換。 TCP協(xié)議是基于連接的協(xié)議,可以將它同電話系統(tǒng)相比,在開始數(shù)據(jù)傳輸之前,用戶必須先建立連接;UDP協(xié)議則是一個(gè)無(wú)連接、不可靠的協(xié)議,跟TCP操作不同,計(jì)算機(jī)并不建立連接。 如果你所傳輸?shù)臄?shù)據(jù)可靠性是要求較高的,請(qǐng)選用TCP協(xié)議進(jìn)行通信,否則可以選用UDP協(xié)議進(jìn)行通信。 選用TCP進(jìn)行通信需要更多的系統(tǒng)資源。 本文著重對(duì)其TCP協(xié)議的應(yīng)用進(jìn)行討論。
2 Winsock控件的常用屬性、方法和事件
1) Winsock控件的屬性:
LocalHostName/RemoteHost:本地/遠(yuǎn)程 主機(jī)名;
LocalPort/RemotePort:本地/遠(yuǎn)程 機(jī)使用的端口號(hào);
Protocol:設(shè)置通信所使用的協(xié)議( TCP或UDP);
State:控件當(dāng)前的狀態(tài)
2) Winsock 控件的方法:
Connect/Accept/Listen:發(fā)送/接收/監(jiān)聽一個(gè)連接請(qǐng)求;
GetData/SendData:獲取/發(fā)送數(shù)據(jù);
Close:關(guān)閉一個(gè)TCP連接;
3) Winsock控件的事件:
Close:遠(yuǎn)程主機(jī)已關(guān)閉觸發(fā)此事件;
ConnectRequest:連接請(qǐng)求到達(dá)觸發(fā)此事件;
DataArrival:數(shù)據(jù)到達(dá)觸發(fā)此事件;
3 Winsock控件的工作原理及過(guò)程
使用TCP協(xié)議創(chuàng)建客戶應(yīng)用程序,確定服務(wù)器計(jì)算機(jī)名或者 IP地址(RemoteHost屬性)及其監(jiān)聽的端口(RemotePort屬性),然后調(diào)用 Connect方法發(fā)送連接請(qǐng)求;服務(wù)器端應(yīng)用程序,則設(shè)置一個(gè)監(jiān)聽端口(LocalPort屬性),并調(diào)用 Listen方法監(jiān)聽連接請(qǐng)求,當(dāng)客戶計(jì)算機(jī)需要連接時(shí)就會(huì)發(fā)生 ConnectionRequest事件,為完成連接,可在ConnectionRequest事件中調(diào)用 Accept方法。 建立連接后,任何一方計(jì)算機(jī)都可以收發(fā)數(shù)據(jù)??烧{(diào)用 SendData方法發(fā)送數(shù)據(jù);當(dāng)接收數(shù)據(jù)時(shí)會(huì)發(fā)生 DataArrival事件,在DataArrival事件中調(diào)用 GetData方法就可獲取數(shù)據(jù)。一個(gè) TCP連接需要客戶機(jī)和服務(wù)器都要有一個(gè) IP地址和端口,所標(biāo)識(shí)的端口一定不能再讓其它應(yīng)用程序使用。
UDP協(xié)議創(chuàng)建連接,首先要設(shè)置客戶計(jì)算機(jī)的 LocalPort屬性,然后服務(wù)器計(jì)算機(jī)需將 RemoteHost設(shè)置為客戶計(jì)算機(jī)的 Internet地址,將 RemotePort屬性設(shè)置為跟客戶計(jì)算機(jī)的 LocalPort屬性相同的端口,并調(diào)用 SendData方法來(lái)發(fā)送信息,GetData方法來(lái)獲取已發(fā)送的信息。由于UDP協(xié)議沒有建立連接,通信效率高,但可靠性不如 TCP協(xié)議,使用 UDP發(fā)送消息,有時(shí)會(huì)出現(xiàn)收不到消息的情況。
4 Winsock控件的實(shí)例編程
下面實(shí)例介紹WinSock控件采用TCP協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)通信的一種簡(jiǎn)單編程方法。
4.1 服務(wù)器端應(yīng)用程序
1) 新建“標(biāo)準(zhǔn) EXE”工程。
2) 在窗體上放入一個(gè) winsock控件,并將它的名字改為:tcpServer。
3) 在窗體上放兩個(gè) 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
' 使收到對(duì)方連接請(qǐng)求之前保持關(guān)閉狀態(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) 在工程中添加一個(gè)新的窗體,在窗體上添加一個(gè)Winsock控件其命名為tcpClient。
2) 在窗體上添加2個(gè)TextBox控件和2個(gè)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
'設(shè)置遠(yuǎn)程主機(jī)名(或 IP地址)和端口號(hào)
End Sub
Private SubtcpClient_Close()
MsgBox"服務(wù)器已關(guān)閉"
EndSub
PrivateSubtcpClient_Connect()
MsgBox"連接成功"
EndSub
PrivateSubtcpClient_DataArriva(ByValbytesTotalAsLong)
Dim str As String
tcpClient.GetData str
txtoutput.Text=str
EndSub
上面設(shè)計(jì)的基本服務(wù)器只能接收一個(gè)連接請(qǐng)求。一般來(lái)說(shuō),客戶端是不止一個(gè)的,如果每一個(gè)客戶端都使用一個(gè)端口連接時(shí),那么有上百個(gè)或更多的客戶時(shí)就需要許多個(gè)Wnsock控件與之相對(duì)應(yīng)。其實(shí)可以通過(guò)創(chuàng)建控件數(shù)組,使用一個(gè)控件也可以同時(shí)接收多個(gè)連接請(qǐng)求。利用這種方法,不需要關(guān)閉連接,而只需要?jiǎng)?chuàng)建新的控件實(shí)例(通過(guò)設(shè)置其索引屬性),然后在新的實(shí)例上調(diào)用 Accept方法。在這就不再做詳細(xì)的論述。
5 結(jié)束語(yǔ)
以上的實(shí)例是使用VB Winsock編程實(shí)現(xiàn)計(jì)算機(jī)網(wǎng)絡(luò)中點(diǎn)對(duì)點(diǎn)通信。Winsock技術(shù)的出現(xiàn)極好地屏蔽了網(wǎng)絡(luò)低層復(fù)雜的結(jié)構(gòu)和協(xié)議,這使得基于Winsock的網(wǎng)絡(luò)應(yīng)用程序可以在不同類型的網(wǎng)絡(luò)上運(yùn)行,同時(shí)使Winsock成為網(wǎng)絡(luò)編程的最流行技術(shù)。
參考文獻(xiàn):
[1] 王曉平, 鐘軍. VisualBasic網(wǎng)絡(luò)通信協(xié)議分析與應(yīng)用實(shí)現(xiàn)[M].北京:人民郵電出版社,2003.
[2] 高俊光. 基于VB的Winsock控件的原理與應(yīng)用[J]. 應(yīng)用科技,2004;31(3):13-14.
[3] 黃玲玲,楊剴,王穎. 在VB中使用Winsock控件實(shí)現(xiàn)局域網(wǎng)通信[J].信息技術(shù),2005(6):24-26.