版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上現(xiàn)在大多數(shù)語(yǔ)言都支持客戶(hù)服務(wù)器模式編程,其中VB給我們提供了很好的客戶(hù)服務(wù)器編程方式。下面我們用VB來(lái)實(shí)現(xiàn)TCPIP網(wǎng)絡(luò)編程。TCPIP協(xié)議是Internet最重要的協(xié)議。VB提供了WinSock控件,用于在TCPIP的基礎(chǔ)上進(jìn)行網(wǎng)絡(luò)通信。當(dāng)兩個(gè)應(yīng)用程序使用Socket進(jìn)行網(wǎng)絡(luò)通信時(shí),其中一個(gè)必須創(chuàng)建Socket服務(wù)器偵聽(tīng),而另一個(gè)必須創(chuàng)建Socket客戶(hù)去連接服務(wù)器。這樣兩個(gè)程序就可以進(jìn)行通信了。1創(chuàng)建服務(wù)器,首先創(chuàng)建一個(gè)服務(wù)端口號(hào)。并開(kāi)始偵聽(tīng)是否有客戶(hù)請(qǐng)求連接。建立一窗體,并向其增加一個(gè)Winsock控件(可在工程菜單中的部件項(xiàng)來(lái)添加此控件),添加兩文本框Text
2、1,Text2,和一按鈕Command1。Private Sub Form_Load()SockServer.LocalPort = 2000 服務(wù)器端口號(hào),最好大于1000SockServer.Listen 開(kāi)始偵聽(tīng)End SubPrivate Sub Form_Unload(Cancel As Integer)SockServer.CloseEnd SubPrivate Sub SockServer_Close()SockServer.CloseEnd SubPrivate Sub SockServer_ConnectionRequest(ByVal requestID As Long)S
3、ockServer.CloseSockServer.Accept requestID 表示客戶(hù)請(qǐng)求連接的ID號(hào)End Sub當(dāng)客戶(hù)向服務(wù)器發(fā)送數(shù)據(jù)到達(dá)后,產(chǎn)生DataArrival事件,在事件中接收數(shù)據(jù),GetData方法接收數(shù)據(jù)。Private Sub SockServer_DataArrival(ByVal bytesTotal As Long)Dim s As StringSockServer.GetData sText1.Text = sEnd Sub當(dāng)我需要向客戶(hù)發(fā)送數(shù)據(jù)時(shí),只需調(diào)用SendData方法。Private Sub Command1_Click()SockServer .
4、SendData Text2.TextEnd Sub2創(chuàng)建客戶(hù)。要?jiǎng)?chuàng)建客戶(hù)連接服務(wù)器,首先設(shè)置服務(wù)器主機(jī)名,如IP地址、域名或計(jì)算機(jī)名,然后設(shè)置服務(wù)器端口,最后連接服務(wù)器。建立一窗體,并向其增加一個(gè)Winsock控件(可在工程菜單中的部件項(xiàng)來(lái)添加此控件),取名為:SockC1。添加兩文本框Text1,Text2,和一按鈕Command1。Private Sub Form_Load()SockCl.RemoteHost =表示服務(wù)器主機(jī)名SockCl.RemotePort = 2000 表示服務(wù)器端口名SockCl.Connect連接到服務(wù)器End SubPrivate Sub
5、 Form_Unload(Cancel As Integer)SockCl.CloseEnd SubPrivate Sub SockCl_Close()SockCl.CloseEnd SubPrivate Sub SockCl_DataArrival(ByVal bytesTotal As Long)Dim s As StringSockCl.GetData s 接收數(shù)據(jù)到文本框中Text1.Text = sEnd SubPrivate Sub Command1_Click()SockCl.SendData Text2.Text 向服務(wù)器發(fā)送數(shù)據(jù)End Sub3進(jìn)行通信。把這兩個(gè)窗體分別編譯成
6、兩個(gè)EXE文件,服務(wù)器Server.exe和客戶(hù)Client.exe 程序,并把它們分別安裝在服務(wù)器端和客戶(hù)端,這樣就可以實(shí)現(xiàn)兩者通信了。VB Socket編程(Winsock控件創(chuàng)建TCP/IP客戶(hù)機(jī)/服務(wù)器程序)Winsock控件建立在TCP、UDP協(xié)議的基礎(chǔ)上,完成與遠(yuǎn)程計(jì)算機(jī)的通信。即使對(duì)TCP/IP不太熟悉的用戶(hù),使用該控件也可以在十幾分鐘內(nèi)創(chuàng)建一 個(gè)簡(jiǎn)單的客戶(hù)機(jī)/服務(wù)器程序。下面我們對(duì)Winsock控件的事件、方法、屬性按其在程序中出現(xiàn)的順序分別作詳細(xì)的介紹,以便更好地理解程序源代碼。 下面是Winsock控件的相關(guān)屬性,方法和事件。(略去一些暫用不到的) *屬性 - LocalH
7、ostName | 本地機(jī)器名 LocalIP | 本地機(jī)器IP地址 LocalPort | 本地機(jī)器通信程序的端口(0 <端口 <65536) RemoteHost | 遠(yuǎn)程機(jī)器名 RemotePort | 遠(yuǎn)程機(jī)器的通信程序端口 state | 連接的當(dāng)前狀態(tài)(文后有詳細(xì)說(shuō)明) Protocal | 使用TCP或UDP協(xié)議(這里我們選0-sckTCPProtocal) - *方法 - Listen Listen方法用于服務(wù)器程序,等待客戶(hù)訪(fǎng)問(wèn)。 格式:Winsock對(duì)象.listen Connect Connect方法用于向遠(yuǎn)程主機(jī)發(fā)出連接請(qǐng)求 格式:Winsock對(duì)象.con
8、nect 遠(yuǎn)程主機(jī)IP,遠(yuǎn)程端口 Accept Accept方法用于接受一個(gè)連接請(qǐng)求 格式:Winsock對(duì)象.accept Request ID Senddata 此方法用于發(fā)送數(shù)據(jù) 格式:Winsock對(duì)象.senddata 數(shù)據(jù) Getdata 用來(lái)取得接收到的數(shù)據(jù) 格式:Winsock對(duì)象.getdata 變量 ,數(shù)據(jù)類(lèi)型 ,最大長(zhǎng)度 Close 關(guān)閉當(dāng)前連接 格式:Winsock對(duì)象.close *事件 - Close | 遠(yuǎn)程機(jī)器關(guān)閉連接時(shí)觸發(fā) Connect | 連接建立好,可以進(jìn)行通信時(shí)觸發(fā)(客戶(hù)端) ConnectRequest | 有請(qǐng)求連接到達(dá)時(shí)產(chǎn)生(服務(wù)器端) Data
9、Arrival | 有數(shù)據(jù)到達(dá)時(shí)觸發(fā) Error | 發(fā)生錯(cuò)誤時(shí)發(fā)生 SendProgress | 數(shù)據(jù)傳送進(jìn)度 - 服務(wù)器程序的實(shí)現(xiàn)過(guò)程是: (1)服務(wù)器程序必須設(shè)置好LocalPort屬性,作為偵聽(tīng)端口,該值為一個(gè)整數(shù)(只要是一個(gè)其它TCP/IP應(yīng)用程序沒(méi)有使用過(guò)的值即可)。 (2)使用Listen方法進(jìn)入偵聽(tīng)狀態(tài),等待客戶(hù)機(jī)程序的連接請(qǐng)求。 (3)客戶(hù)機(jī)程序發(fā)出連接請(qǐng)求,使服務(wù)器程序產(chǎn)生ConnectionRequest事件,該事件得到一個(gè)參數(shù)requestID。 (4)服務(wù)器程序用Accept方法接受客戶(hù)機(jī)程序的requestID請(qǐng)求。這樣,服務(wù)器程序就可以用SendData方法發(fā)送數(shù)
10、據(jù)了。Accept方法必須用上一步得到的requestID作為其參數(shù)。 (5)當(dāng)服務(wù)器程序接收到數(shù)據(jù)時(shí),產(chǎn)生DataArrival事件,參數(shù)BytesTotal包含接收到的數(shù)據(jù)字節(jié)數(shù)。在該事件中,可以用GetData方法接收數(shù)據(jù)。 (6)如果接受到Close事件,則用Close方法關(guān)閉TCP/IP連接。 客戶(hù)機(jī)程序的實(shí)現(xiàn)過(guò)程是: (1) 客戶(hù)程序設(shè)置Remotehost屬性,以便指定運(yùn)行服務(wù)器程序的主機(jī) 名,該字符串可在“控制面板|網(wǎng)絡(luò)|標(biāo)識(shí)|計(jì)算機(jī)名”中查到。 (2) 設(shè)置RemotePort屬性,以便指定服務(wù)器程序的偵聽(tīng)端口。 (3)使用Connect方法,向服務(wù)器提出連接請(qǐng)求。 (4)服
11、務(wù)器接受客戶(hù)機(jī)程序的請(qǐng)求,客戶(hù)機(jī)程序產(chǎn)生Connect事件,就可以用SendData方法發(fā)送數(shù)據(jù)了。 (5)當(dāng)客戶(hù)機(jī)程序接收到數(shù)據(jù)時(shí),產(chǎn)生DataArrival事件,參數(shù)BytesTotal包含接收到的數(shù)據(jù)字節(jié)數(shù)。在該事件中,可以用GetData方法接收數(shù)據(jù)。 (6)如果接受到Close事件,則用Close方法關(guān)閉連接。 Winsock控件還有兩個(gè)重要的屬性,即Protocol和State。Protocol設(shè)定使用的協(xié)議是TCP還是UDP:取值 sckTCPProtocol表示TCP, 取值sckUDPProtocol則表示UDP。因?yàn)閃insock控件的缺省設(shè)置是sckTCPProtocol
12、,所以程序中并沒(méi)有使用 Protocol屬性。State屬性反映的是當(dāng)前TCP/IP的連接狀態(tài),取值如表1所示。 表1 Winsock控件的State屬性及其描述 常數(shù) 值 描述 SckClosed 0 缺省值,關(guān)閉 SckOpen 1 打開(kāi) SckListening 2 偵聽(tīng) SckConnectionPending 3 連接掛起 SckResolvingHost 4 識(shí)別主機(jī)SckHostResolved 5 已識(shí)別主機(jī) SckConnecting 6 正在連接 SckConnected 7 已連接 SckClosing 8 同級(jí)人員正在關(guān)閉連接 SckError 9 錯(cuò)誤 先在一臺(tái)計(jì)算機(jī)
13、上運(yùn)行服務(wù)器程序,此時(shí)窗口上只有一個(gè)“退出”按鈕。 再在另一臺(tái)計(jì)算機(jī)上運(yùn)行客戶(hù)機(jī)程序,在“連接”按鈕右邊的文本框中輸入服務(wù)器的主機(jī)名后單擊“連接”按鈕。如果連接成功,則服務(wù)器和客戶(hù)機(jī)程序窗口都會(huì)出 現(xiàn)兩個(gè)文本框。這時(shí),兩端都可以在上面的文本框中輸入文字,這些文字會(huì)立即在下面的文本框中出現(xiàn)。 服務(wù)器程序使用的控件如下: (1)Command1:退出按鈕; (2)textsend:發(fā)送數(shù)據(jù)文本框; (3)Winsockserver: 服務(wù)器Winsock; (4)textget :接收數(shù)據(jù)文本框。 服務(wù)器程序的界面如圖所示。 服務(wù)器程序的源代碼如下: Private Sub Command1_Cl
14、ick() End End Sub Private Sub Form_Load() textsend.Visible = False textget.Visible = False Winsockserver.LocalPort = 1001 Winsockserver.Listen End Sub Private Sub textsend_Change() Winsockserver.SendData textsend.Text End Sub Private Sub Winsockserver_Close() Winsockserver.Close End End SubPrivate S
15、ub Winsockserver_ConnectionRequest(ByVal requestID As Long) textsend.Visible = True textget.Visible = True If Winsockserver.State <> sckClosed Then Winsockserver.Close Winsockserver.Accept requestID End Sub Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As StringWin
16、sockserver.GetData tmpstr textget.Text = tmpstr End Sub 客戶(hù)機(jī)程序使用的控件如下: (1)Command1:退出按鈕; (2)Command2:連接按鈕; (3)Winsockclient:客戶(hù)Winsock; (4)Text1:主機(jī)名文本框; (5)Textsend:發(fā)送數(shù)據(jù)文本框; (6)Textget:接收數(shù)據(jù)文本框; 客戶(hù)機(jī)程序的源代碼如下: Private Sub Command1_Click() End End Sub Private Sub Command2_Click() Winsockclient.Connect End
17、 Sub Private Sub Form_Load() textsend.Visible = False textget.Visible = False Winsockclient.RemotePort = 1001 Winsockclient.RemoteHost = "sccdsz" End Sub Private Sub Text1_Change() Winsockclient.RemoteHost = Text1.Text End Sub Private Sub textsend_Change() Winsockclient.SendData textsend.T
18、ext End Sub Private Sub Winsockclient_Close() Winsockclient.Close End End Sub Private Sub winsockclient_Connect() textsend.Visible = True textget.Visible = True Command2.Visible = False End Sub Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As String Winsockclient.GetData
19、 tmpstr textget.Text = tmpstr End Sub1 引言 隨著網(wǎng)絡(luò)通信的興起與迅速發(fā)展,TCP/IP協(xié)議已成為計(jì)算機(jī)網(wǎng)絡(luò)中最主要的傳輸協(xié)議,TCP/IP傳輸協(xié)議也越來(lái)越為人所熟知。目前的Internet 網(wǎng)就是基于TCP/IP協(xié)議的互聯(lián)網(wǎng)絡(luò)。TCP/IP除了用于廣域外,在局域網(wǎng)中也廣泛應(yīng)用。 TCP是傳輸控制協(xié)議,它提供了一種可靠的、面向會(huì)話(huà)連接的數(shù)據(jù)流服務(wù),它可以在一個(gè)分組可能發(fā)生丟失、破壞、重復(fù)、延遲和亂序的不可靠物理網(wǎng)絡(luò)之上通過(guò)確認(rèn)、流控、復(fù)用同步等自動(dòng)糾錯(cuò)技術(shù)提供一種可靠的進(jìn)程間通信機(jī)制,
20、從而充分保證用戶(hù)數(shù)據(jù)傳送的可靠和有序性。使用TCP協(xié)議通信時(shí),TCP建立并控制數(shù)據(jù)發(fā)送方與接收方的會(huì)話(huà)關(guān)系,當(dāng)接收方正確收到數(shù)據(jù)后,必須向發(fā)送方發(fā)送確認(rèn)信息。如果發(fā)送方在指定時(shí)間內(nèi)未能收到確認(rèn)信息,將重發(fā)數(shù)據(jù)包。 IP指分組交換協(xié)議,是聯(lián)網(wǎng)的主機(jī)之間定義數(shù)據(jù)包傳送路由的規(guī)則,它的基本任務(wù)是通過(guò)網(wǎng)絡(luò)傳送數(shù)據(jù)報(bào),各個(gè)IP數(shù)據(jù)報(bào)之間是相互獨(dú)立的。IP本身沒(méi)有連接協(xié)議,在交換數(shù)據(jù)前不會(huì)建立會(huì)話(huà)關(guān)系。IP收到數(shù)據(jù)后也不確認(rèn),發(fā)送方和接收方都不檢測(cè)數(shù)據(jù)傳輸?shù)恼_性。所以?xún)H有IP是不可靠的,不能確保正確傳輸數(shù)據(jù)。TCP與IP的組合則構(gòu)成了功能完整的傳輸協(xié)議。 &
21、#160; 在TCP/IP網(wǎng)絡(luò)應(yīng)用中,多數(shù)網(wǎng)絡(luò)應(yīng)用程序是使用客戶(hù)/服務(wù)器模型方式,客戶(hù)向服務(wù)器發(fā)出服務(wù)請(qǐng)求,服務(wù)器作出應(yīng)答響應(yīng),服務(wù)器通常在一個(gè)眾所周知的地址偵聽(tīng)客戶(hù)向服務(wù)器發(fā)出的請(qǐng)求,服務(wù)進(jìn)程這時(shí)一直是處于休眠狀態(tài),直到有一個(gè)客戶(hù)程序提出連接請(qǐng)求。服務(wù)器作出應(yīng)答,并為客戶(hù)提供相應(yīng)的服務(wù)??蛻?hù)/服務(wù)器模型最重要的特點(diǎn)是非對(duì)等相互作用,客戶(hù)與服務(wù)器處于不平等的地位。服務(wù)器擁有客戶(hù)機(jī)所不具備的各種軟硬件資源和運(yùn)算處理能力,服務(wù)器提供服務(wù),客戶(hù)請(qǐng)求服務(wù),這種模式適應(yīng)了網(wǎng)絡(luò)資源、運(yùn)算能力、信息分布不均等現(xiàn)象,成為IP應(yīng)用的主要模式。Internet中的WWW、FTP、Telnet、E-ma
22、il等許多典型應(yīng)用都是采用客戶(hù)/服務(wù)器模型方式。 Visual Basic是Windows環(huán)境下簡(jiǎn)單、易學(xué)、高效的可視化編程語(yǔ)言開(kāi)發(fā)系統(tǒng),以其所見(jiàn)即所得的可視化界面設(shè)計(jì)風(fēng)格和32位面向?qū)ο蟮某绦蛟O(shè)計(jì)等特點(diǎn),已廣泛地應(yīng)用于各個(gè)領(lǐng)域,是很多計(jì)算機(jī)軟件開(kāi)發(fā)人員采用的開(kāi)發(fā)工具。VB不但提供了良好的界面設(shè)計(jì)能力,而且在網(wǎng)絡(luò)通信方面的功能也很強(qiáng)。采用VB開(kāi)發(fā)網(wǎng)絡(luò)通信應(yīng)用軟件十分方便,尤其軟件界面設(shè)計(jì)非常便捷,編程工作量較小,開(kāi)發(fā)周期短。 Visual Basic6.0中提供了Winsock控件,用于支持網(wǎng)絡(luò)中兩臺(tái)以上計(jì)算機(jī)之間進(jìn)行通信
23、。Winsock控件提供了多樣化的屬性和方法來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)通信。通過(guò)設(shè)置Winsock控件屬性及調(diào)用控件方法就能夠?qū)崿F(xiàn)TCP或UDP方式的網(wǎng)絡(luò)通信。因此,使用Winsock控件編寫(xiě)網(wǎng)絡(luò)通信程序的過(guò)程,實(shí)際上就是設(shè)置Winsock控件屬性和調(diào)用控件方法的過(guò)程。利用這個(gè)控件,編程人員可以輕松地編寫(xiě)出TCP/IP客戶(hù)服務(wù)器程序。 2 Winsock控件 Winsock控件是不可視控件,它提供了訪(fǎng)問(wèn)TCP和UDP網(wǎng)絡(luò)服務(wù)非常簡(jiǎn)便的途徑,使編程人員開(kāi)發(fā)客戶(hù)/服務(wù)器應(yīng)用程序時(shí),不必了解TCP的細(xì)節(jié)或調(diào)用低級(jí)的WinsockAP
24、Is函數(shù),只通過(guò)設(shè)置Winsock控件的屬性并調(diào)用其方法,就可直接連接到一臺(tái)遠(yuǎn)程計(jì)算機(jī)進(jìn)行,并可實(shí)現(xiàn)雙向數(shù)據(jù)交換。Microsoft Access、Visual Baisc、Visual C+或Visual FoxPro都可用其編寫(xiě)客戶(hù)服務(wù)器程序。 如果訪(fǎng)問(wèn)TCP傳輸控制協(xié)議服務(wù)功能,則須建立連接并實(shí)現(xiàn)主機(jī)間點(diǎn)對(duì)點(diǎn)通信。如果訪(fǎng)問(wèn)UDP數(shù)據(jù)文報(bào)協(xié)議功能,則不建立連接,發(fā)送數(shù)據(jù)將以廣播方式上網(wǎng)傳輸。 3 TCP/IP客戶(hù)服務(wù)器程序設(shè)計(jì)方法 使用TCP/IP協(xié)議通訊,首先要指定通信
25、方式為T(mén)CP方式,將Winsock控件的Protocol屬性設(shè)置為sckTCPProtocol.然后,按TCP通信協(xié)議規(guī)定,先要申請(qǐng)建立網(wǎng)絡(luò)連接,然后才能傳輸數(shù)據(jù)。 3.1服務(wù)器程序開(kāi)始偵聽(tīng)網(wǎng)絡(luò) 服務(wù)器程序窗體中有三個(gè)Winsock控件,Name分別為sckServer、sckBusy和sckListen. 其中sckListen是偵聽(tīng)控件;sckBusy是;sckServer連接控件。偵聽(tīng)控件和連接控件不能是同一個(gè)Winsock控件。 服務(wù)器程序必須
26、首先偵聽(tīng)網(wǎng)絡(luò),等待客戶(hù)的連接申請(qǐng),才有可能建立網(wǎng)絡(luò)連接。服務(wù)器程序開(kāi)始偵聽(tīng)網(wǎng)絡(luò)前,需要為偵聽(tīng)用(sckListen)控件的LocalPort屬性設(shè)置通信接口,然后調(diào)用Listen方法。服務(wù)器程序開(kāi)始偵聽(tīng)網(wǎng)絡(luò)的程序代碼如下: sckListen.LocalPort=4477 sckListen.Listen '偵聽(tīng)網(wǎng)絡(luò) 3.2客戶(hù)程序申請(qǐng)連接 當(dāng)服務(wù)器程序已經(jīng)啟動(dòng)運(yùn)行并開(kāi)始偵聽(tīng)網(wǎng)絡(luò)后,在客戶(hù)程序申請(qǐng)連接前,需要為客戶(hù)Winsock控件的RemodeHost屬性設(shè)置遠(yuǎn)程主
27、機(jī),為RemodePort屬性設(shè)置通信接口,然后再調(diào)用Connect方法向服務(wù)器程序申請(qǐng)連接。 設(shè)置遠(yuǎn)程主機(jī)名,可以是計(jì)算機(jī)名也可是IP地址。如果是主機(jī)計(jì)算機(jī)名,則需要系統(tǒng)翻譯為相應(yīng)的IP地址;如果是主機(jī)IP地址,則直接進(jìn)行連接。 申請(qǐng)連接的程序代碼如下: sckClient.Protocol = sckTCPProtocol '設(shè)置協(xié)議為T(mén)CP方式'IP地址""代表本機(jī),與本機(jī)的實(shí)際地址無(wú)關(guān)sckClient.RemoteHost = "127.0
28、.0.1"""'設(shè)置遠(yuǎn)程主機(jī)接口號(hào),該值必須與設(shè)置遠(yuǎn)程主機(jī)服務(wù)器程序的接口號(hào)一致sckClient.RemotePort = 4477sckClient.Connect '申請(qǐng)連接 3.3服務(wù)器程序應(yīng)答連接請(qǐng)求 服務(wù)器程序啟動(dòng)偵聽(tīng)網(wǎng)絡(luò)后,當(dāng)客戶(hù)程序執(zhí)行Connect方法申請(qǐng)連接時(shí),服務(wù)器程序的偵聽(tīng)控件(sckListen)觸發(fā)ConnectionRequest事件,并傳遞連接請(qǐng)求句柄。編程人員需要在該當(dāng)事件程序中調(diào)用連接控件(sckServer
29、)的Accept方法實(shí)現(xiàn)連接。 服務(wù)器程序應(yīng)答連接的程序代碼如下: Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)sckServer.Accept requestID '應(yīng)答連接請(qǐng)求End Sub 當(dāng)服務(wù)器程序執(zhí)行Accept方法建立連接后,客戶(hù)程序中的接連控件將觸發(fā)Connect事件通報(bào)連接完成,否則觸發(fā)Error事件通報(bào)連接失敗??梢栽谠撌录绦蛑屑尤脒B接后的處理程序。 如
30、果要求服務(wù)器程序支持多用戶(hù)連接,則需要?jiǎng)?chuàng)建Winsock控件數(shù)組,在連接時(shí)動(dòng)態(tài)生成Winsock控件與客戶(hù)程序建立連接。程序代碼應(yīng)修改如下: Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)Dim i As LongIf CurNumber<MaxNumber Then 'MaxNumber為最大連接數(shù),CurNumber為當(dāng)前連接數(shù)For i = 1 To CurNumberIf sckServer(i).State = 0 Then '判斷是否有空閑Winsock控件Exit F
31、orEnd IfNext iIf i = CurNumber ThenCurNumber = CurNumber + 1i = CurNumberEnd IfLoad sckServer(i) '動(dòng)態(tài)加載Winsock控件sckServer(i).Accept requestIDExit SubEnd IfsckBusy.ClosesckBusy.Accept requestIDEnd Sub 3.4傳送數(shù)據(jù) 當(dāng)服務(wù)器程序和客戶(hù)程序連接成功后,可以開(kāi)始傳送數(shù)據(jù)。建立連接后的服務(wù)器程序和客戶(hù)程序都可以發(fā)送
32、或接收數(shù)據(jù)。當(dāng)一方要發(fā)送數(shù)據(jù)時(shí),調(diào)用SendData方法。Dim SendStr As StringSendStr = "連接成功!"Winsock1.SendData SendStr '傳送數(shù)據(jù) 如果一方發(fā)送了數(shù)據(jù),在連接的另一方控件將產(chǎn)生DataArrival事件,在DataArrival事件處理程序中需要調(diào)用GetData方法接收數(shù)據(jù)。接收數(shù)據(jù)類(lèi)型必須與發(fā)送數(shù)據(jù)的類(lèi)型一致方可正確接收數(shù)據(jù)。接收數(shù)據(jù)的程序代碼如下: Dim RecStr As StringsckClient.GetData RecStrPrint R
33、ecStr 3.5關(guān)閉連接 當(dāng)應(yīng)用程序結(jié)束數(shù)據(jù)傳送后,必須關(guān)閉連接,釋放系統(tǒng)資源。當(dāng)連接的一方關(guān)閉連接時(shí),可以調(diào)用Close方法。關(guān)閉連接程序代碼如下: sckClient.Close '關(guān)閉連接 一方執(zhí)行關(guān)閉連接后,在連接的另一方控件將產(chǎn)生Close事件。程序需要處理事件,完成關(guān)閉連接的最后工作。該事件的處理代碼如下: Private Sub sckServer_Close()sckServer(Index)
34、.Close '釋放接連Unload sckServer(Index) '刪除控件End Sub 4 使用UDP通信方式程序設(shè)計(jì)方法 UDP用戶(hù)報(bào)文協(xié)議是一個(gè)無(wú)連接協(xié)議,與TCP協(xié)議操作不同,UDP協(xié)議不使用報(bào)文確認(rèn)機(jī)制,不對(duì)報(bào)文排序,不進(jìn)行流控,因而UDP報(bào)文可能出現(xiàn)丟失、重復(fù)、亂序等現(xiàn)象,但由于它的前期工作比TCP少,計(jì)算機(jī)不建立連接,因而可以迅速地展開(kāi)通信,一般用于傳輸少量不重要的數(shù)據(jù)和信息。Winsock控件的UDP通信方式是一種廣播方式,當(dāng)UDP主機(jī)發(fā)送數(shù)據(jù)時(shí),網(wǎng)絡(luò)上所有其
35、它主機(jī)都能收到數(shù)據(jù),UDP通信比TCP方式簡(jiǎn)單,由于UDP不需要連接,所以沒(méi)有申請(qǐng)連接和關(guān)閉連接的過(guò)程。UDP發(fā)送者忽略接收者是否實(shí)際收到數(shù)據(jù),而接收者也忽略發(fā)送者是否已發(fā)送了數(shù)據(jù)。這使編寫(xiě)UDP通信方式的網(wǎng)絡(luò)程序非常簡(jiǎn)單。 4.1 設(shè)置服務(wù)器程序中Winsock控件的屬性 在服務(wù)器程序中,需要為Winsock控件的LocalPort屬性設(shè)置通信接口:sckserver.LocalPort=4477 4.2 客戶(hù)程序發(fā)送數(shù)據(jù) 當(dāng)UDP主機(jī)要發(fā)送數(shù)據(jù)時(shí),
36、可調(diào)用SendData方法。發(fā)送數(shù)據(jù)程序的代碼如下: Dim SendStr As StringSendStr = "發(fā)送信息!"sckClient.SendData SendStr '傳送數(shù)據(jù)vb映射已知服務(wù)器的方法VB 設(shè)定/取消 網(wǎng)絡(luò)磁盤(pán)使用方法: 建立連線(xiàn) Function AddConnection(ByVal RemoteLocation As String, _ ByVal LocalDriver As String, _ ByVal Passwd As String, _ ByVal UserName As String) As Boole
37、an RemoteLocation : 為網(wǎng)絡(luò)磁盤(pán)原始來(lái)源,格式為 RemoteComputerShareDirectory LocalDriver : 對(duì)應(yīng)本機(jī)的磁盤(pán)代號(hào),如: "H:" Passwd : 存取網(wǎng)絡(luò)磁盤(pán)的Password,傳Null表示不用密碼 UserName : 存取網(wǎng)絡(luò)磁盤(pán)的使用者代號(hào) 成功時(shí)傳回True,否則為False 例: Call AddConnection("Shihcmias", "x:", vbNullString, "cww") 取消連線(xiàn) Function CancelCon
38、nection(ByVal LocalDriver As String, _ ByVal ForceClose As Boolean) As Boolean LocalDriver : 對(duì)應(yīng)本機(jī)的磁盤(pán)代號(hào),如: "H:" ForceClose : True表示強(qiáng)迫結(jié)束連線(xiàn),而不管有沒(méi)有程式正與之連線(xiàn) 成功時(shí)傳回True,否則為False 例: Call CancelConnection("x:", True) 以下在.bas Option Explicit Type NETRESOURCE dwScope As Long dwType As Long d
39、wDisplayType As Long dwUsage As Long lpLocalName As String lpRemoteName As String lpComment As String lpProvider As String End Type Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUse
40、rName As String, ByVal dwFlags As Long) As Long Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long Declare Function WNetGetLastError Lib "mpr.dll" Alias "
41、WNetGetLastErrorA" (lpError As Long, ByVal lpErrorBuf As String, ByVal nErrorBufSize As Long, ByVal lpNameBuf As String, ByVal nNameBufSize As Long) As Long Public Const RESOURCE_PUBLICNET = &H2 Public Const RESOURCETYPE_ANY = &H0 Public Const RESOURCEDISPLAYTYPE_GENERIC = &H0 Public Const RESOURCEUSAGE_CONNECTABLE = &H1 Pu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴陽(yáng)幼兒師范高等專(zhuān)科學(xué)?!秳?dòng)畫(huà)場(chǎng)景設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025山西省安全員C證(專(zhuān)職安全員)考試題庫(kù)
- 硅湖職業(yè)技術(shù)學(xué)院《面向?qū)ο蠹夹g(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025甘肅省建筑安全員考試題庫(kù)
- 廣州幼兒師范高等專(zhuān)科學(xué)校《綠色建筑與綠色施工》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年四川建筑安全員-B證(項(xiàng)目經(jīng)理)考試題庫(kù)
- 廣州衛(wèi)生職業(yè)技術(shù)學(xué)院《溫病學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025貴州建筑安全員B證(項(xiàng)目經(jīng)理)考試題庫(kù)
- 2025黑龍江省安全員-C證(專(zhuān)職安全員)考試題庫(kù)
- 《ESD知識(shí)和控制》課件
- 最全的官能團(tuán)化合物的紅外吸收峰特征
- 世界氣候類(lèi)型(圖很清晰)
- 新版【處置卡匯編】重點(diǎn)崗位人員應(yīng)急處置卡(全套25頁(yè))
- EE系列磁芯參數(shù)
- 工程勘察現(xiàn)場(chǎng)見(jiàn)證報(bào)告
- GB 6944-2012 危險(xiǎn)貨物分類(lèi)和品名編號(hào)(高清版)
- AP1000核電站常規(guī)島簡(jiǎn)介
- 建筑制圖學(xué)習(xí)基礎(chǔ)實(shí)訓(xùn)報(bào)告
- 懷化職業(yè)技術(shù)學(xué)院就業(yè)工作管理制度匯編 (一)
- 上海牛津英語(yǔ)三年級(jí)句型轉(zhuǎn)換
- 2021年總工會(huì)招聘考試工會(huì)知識(shí)模擬試卷及答案(共五套)
評(píng)論
0/150
提交評(píng)論