




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、利用 Winsock 控件實(shí)現(xiàn)局域網(wǎng)通信對于局域網(wǎng)用戶中的編程愛好者來說, 如果能自己編一個(gè)局域網(wǎng)通信程序, 那么這一切將是 多么美妙! 可是, 如果要從頭開始完全由自己來編寫一段用于通信的程序, 必須對相關(guān)的網(wǎng) 絡(luò)協(xié)議及其他的一些較底層的技術(shù)有較深入的了解,這可不是一件容易的事。而現(xiàn)在有了 Winsock 控件,一切就不同了,它已經(jīng)替你封裝了所有煩瑣的技術(shù)細(xì)節(jié),并提供了訪問 TCP 和 UDP 網(wǎng)絡(luò)服務(wù)的方便途徑。你只需通過設(shè)置控件的屬性并調(diào)用其方法就可輕易連接到一 臺遠(yuǎn)程計(jì)算機(jī)中,并且還可以雙向交換數(shù)據(jù),而這一切都不需你了解 TCP 的細(xì)節(jié)或調(diào)用低 級的 Winsock APIs。Wins
2、ock控件可以供 Microsoft Acess、 Visual Basic, Visual C 或 Visual Foxpro的開發(fā) 人員使用。本文以 Visual Basic 6企業(yè)版為開發(fā)環(huán)境來向大家介紹一下 Winsock 控件的初步 應(yīng)用。Winsock控件可以使用兩種協(xié)議:TCP 協(xié)議和 UDP 協(xié)議,下面來分別介紹。TCP協(xié)議即數(shù)據(jù)傳輸協(xié)議,它允許創(chuàng)建和維護(hù)與遠(yuǎn)程計(jì)算機(jī)的連接,使其彼此可以進(jìn) 行數(shù)據(jù)傳輸。利用 TCP 協(xié)議通訊必須分別建立客戶應(yīng)用程序和服務(wù)器應(yīng)用程序。在創(chuàng)建客戶應(yīng)用程序時(shí),必須知道服務(wù)器計(jì)算機(jī)名或其 IP 地址 (存于 RemoteHost 屬 性 、及服務(wù)器計(jì)算
3、機(jī)進(jìn)行偵聽的端口 (存于 RemotePort 屬性,然后調(diào)用 Connect 方法。創(chuàng)建服務(wù)器應(yīng)用程序時(shí),就應(yīng)相應(yīng)設(shè)置一個(gè)偵聽端口 (LocalPort屬性 并調(diào)用 listen 方 法。當(dāng)客戶機(jī)需要連接時(shí) (connect,就會(huì)發(fā)生 ConnectionRequest 事件。為了完成連接,你 可以在 ConnectionRequest 事件中調(diào)用 Accept 方法。建立連接后,任何一方計(jì)算機(jī)都可以發(fā) 送、接收對方數(shù)據(jù)。如果你要發(fā)送數(shù)據(jù),需調(diào)用 SendData 方法。當(dāng)接收到數(shù)據(jù)時(shí),會(huì)發(fā)生 DataArrival 事件,調(diào)用 DataArrival 事件中的 GetData 方法就可以獲
4、得對方傳送的數(shù)據(jù)。說了這么多,大家可能還是不太了解,讓我用程序來詳細(xì)說明。如果只有兩臺計(jì)算機(jī),那十分容易。假設(shè)甲機(jī)為客戶機(jī),乙機(jī)為服務(wù)器,且其 IP 為 192.192.192.1,接收端口為 1200(任意選一個(gè)未被使用的端口即可 。首先在甲機(jī)客戶端程序 中加入一個(gè) Winsock 控件, 起名為 sckconnect , 并設(shè)置其屬性:RemoteHost=“192.192.192.1” , (即甲機(jī) IP 地址, RemotePort=1200(即甲機(jī)偵聽端口;再在乙機(jī)服務(wù)器程序中假如 一個(gè)名為 sckserver(0的 Winsock 控件, 其 LocalPort=1200, 在乙機(jī)
5、服務(wù)器程序中 Form_Load(加入sckserver(0.bind sckserver(0.LocalPort '與本地端口綁定sckserver(0.listern ' 偵聽如果要傳輸數(shù)據(jù),兩機(jī)必須先建立連接。建立連接的程序如下:甲機(jī)客戶機(jī)要先請求連接sckconnect.connect sckconnect.RemoteHost, sckconnect.RemotePort此句執(zhí)行時(shí)會(huì)觸發(fā)服務(wù)器程序中的 ConnectRequest 事件,在此過程中決定是否建立連 接,其代碼如下:Private sub sckserver_connectionrequest(index
6、 as Integer,Byval requestid as longif sckserver.count=1 thenload sckserver(1sckserver(1.accept requestIdend ifend sub連接建立好以后,甲機(jī)或乙機(jī)都可以應(yīng)用 SendData 方法來傳送數(shù)據(jù)。例如,如果是甲 機(jī)要傳送一個(gè)叫 string 的字符串,只需在代碼中加入:sckconnect.SendData string甲機(jī)傳送數(shù)據(jù)后,會(huì)觸發(fā)乙機(jī)的 DataArrival 事件,在其過程中用 GetData 方法可以收 到傳送的數(shù)據(jù):Private sub sckserver_Data
7、Arrival(Index as integer,Byval BytesTotal as longdim sdata as stringsckserver(1.GetData sdata,vbstringend sub最后別忘了在關(guān)閉程序前要先關(guān)閉 Winsock 控件privat sub form_unload(cancel as integerif sckconnect.state <>sckclosed thensckconnect.closeend ifend sub這只是最簡單的情況,如果有多臺計(jì)算機(jī),那就稍微復(fù)雜一些,客戶端程序可以不做 改動(dòng),而服務(wù)器端程序需要略做改動(dòng)
8、:Private sub sckserver_connectrequest(Index as Integer,Byval requestid as longdim sip as stringdim I as integersip=sckserver(0.RemoteHostIP '獲得登錄者的 IP 地址I=1Do while I<=sckserver.ubound '檢查是否已經(jīng)有該地址的記錄If sckserver(I.RemoteHostIP=sip then '如有,不必加載新的控件Sckserver(I.Accept requestidExit subE
9、nd ifI=I 1LoopLoad sckserver(I '否則,加載新的控件Scksrver(I.accept requestIDEnd sub注意到:以上的信息交談實(shí)際上都發(fā)生在客戶機(jī)與服務(wù)器之間,如果要做成聊天室那 樣,每個(gè)人的話都可以被別人 “ 聽到 ” ,那就要在服務(wù)器端的 DataArrival 事件中,把接收到 的客戶機(jī)傳來的數(shù)據(jù),轉(zhuǎn)發(fā)給所有客戶機(jī)即可。其循環(huán)轉(zhuǎn)發(fā)信息的代碼如下:For I=1 to sckserver.countif sckserver(I.state<>sckclosed thensckserver(I.SendData sdataen
10、d ifnext I怎么樣,這樣我們就作好了自己的通信軟件!不過,不知大家注意到?jīng)]有,上述程序都需要有一臺計(jì)算機(jī)做為服務(wù)器,但如果我們 的局域網(wǎng)中沒有哪臺計(jì)算機(jī)是可以常開的, 也就是說, 如果服務(wù)器端程序沒有運(yùn)行的話, 其 他客戶端程序也沒有辦法通信。而這種情況卻可能是經(jīng)常出現(xiàn)的 ! 至少,我所用的局域網(wǎng)那 就是這樣的。難道這樣我們就無法享受局域網(wǎng)通信的樂趣了嗎?不要急,記得嗎,我們的 Winsock 控件還有另一個(gè)主角:UDP 協(xié)議。UDP協(xié)議也稱為用戶數(shù)據(jù)報(bào)文協(xié)議,是一個(gè)無連接協(xié)議。何謂無連接協(xié)議?就是說利 用此協(xié)議連接時(shí),不必象 TCP 協(xié)議那樣:需要服務(wù)器端偵聽,客戶機(jī)端請求連接,服務(wù)
11、器 端建立連接后雙方才能通信。另外, UDP 應(yīng)用程序可以是客戶機(jī),也可以是服務(wù)器程序, 而不必向 TCP 應(yīng)用程序那樣必須分別建立客戶機(jī)程序和服務(wù)器程序。下面,來簡述一下 UDP 協(xié)議通信的過程:UDP 協(xié)議中,為了在甲乙兩機(jī)中傳輸數(shù)據(jù), 必須先分別設(shè)置兩機(jī)的 LocalPort 屬性; 再將甲機(jī)的 RemoteHost 屬性設(shè)置為乙機(jī)的 IP 地址, RemotePort 屬性設(shè)置為乙機(jī)的 LocalPort 屬性值, 此時(shí)甲機(jī)調(diào)用 SendData 方法就可以傳送數(shù) 據(jù)了,乙機(jī)同樣使用 DataArrival 事件中的 GetData 方法來獲取甲機(jī)發(fā)送給乙機(jī)的信息。如 想乙機(jī)向甲機(jī)傳送
12、數(shù)據(jù),只需仿照上面的過程設(shè)置即可。用 UDP 協(xié)議來傳輸信息較 TCP 協(xié)議來說簡單的多,它無須偵聽(LISTEN ,也無須 請求連接(CONNECT ,就象我們平時(shí)發(fā)信一樣,只要寫好地址及收信人姓名并發(fā)送出去 即可。 我們可以借此來編寫一個(gè)局域網(wǎng)中的信息傳送程序, 下面來簡單介紹以下程序中想實(shí) 現(xiàn)的功能及其基本思想:首先,我們一定想讓程序的圖標(biāo)顯示在 system tray中而不顯示在任務(wù)欄中吧!這要是 自己編程實(shí)現(xiàn)可不是太容易, 幸好 VB 光盤中在 commontoolsvbunsupportsystemTray 中有 一個(gè)現(xiàn)成的程序,我們只要把它編譯成 systray.ocx 控件,然
13、后在編寫自己的程序時(shí)添加此 控件即可。其使用方法十分簡單,它已經(jīng)定義好了鼠標(biāo)單擊、雙擊等事件,你只需編寫相應(yīng) 的鼠標(biāo)事件即可,這里不再多說。程序的關(guān)鍵是:UDP 協(xié)議在通訊時(shí)要知道對方的 IP 和 Port ,這要如何實(shí)現(xiàn)呢?最簡 單的方法是建立一個(gè)配置文件,里面放置了局域網(wǎng)上每臺計(jì)算機(jī)的名字、 IP 和 Port ,在程 序初始化時(shí)讀出所有信息,在程序中只要知道向誰通信,讀出其對應(yīng)的 IP 和 Port 即可。我們知道了每臺計(jì)算機(jī)的 IP 和 Port , 但我們怎樣才能知道其它計(jì)算機(jī)是否在線呢, 否 則發(fā)出信息別人收不到怎么辦?我們可以把此程序放在啟動(dòng)菜單中,讓其一開機(jī)就自動(dòng)啟 動(dòng),并最小
14、化,放于窗口右下角的 system tray中。在程序剛開始運(yùn)行時(shí),它會(huì)自動(dòng)向它從 配置文件中所知道的所有 IP 發(fā)一條信息:“ 我來了! ” ,如果有計(jì)算機(jī)在線,它會(huì)自動(dòng)返回 一條信息:“ 歡迎! ” ,如此則兩機(jī)通信成功,它們會(huì)分別把對方的名字加入到自己的可通信 人名單中去;如果有計(jì)算機(jī)關(guān)機(jī),程序在退出之前會(huì)自動(dòng)向所有人告別:“ 再見! ” ,接收到 此信息的計(jì)算機(jī)會(huì)自動(dòng)把發(fā)送信息的計(jì)算機(jī)的名稱從自己的可通信人名單中去除。 這樣, 如 果某人不在線,你將無法發(fā)送信息給它;如果除了你以外,其他人都沒有開機(jī),那你的可發(fā) 送人名單中將沒有任何人。而其它人只要一上線,會(huì)自動(dòng)去你那里 “ 登記 ”
15、,其他人只要一離 線,會(huì)自動(dòng)去你那里 “ 告別 ” ,你可以據(jù)此知道他人是否正在使用計(jì)算機(jī),你甚至可以以此程 序來統(tǒng)計(jì)他人的每天上機(jī)時(shí)間,不錯(cuò)吧!好了,一個(gè)局域網(wǎng)通信的程序的基本模型已經(jīng)有了,并不復(fù)雜吧!大家趕快動(dòng)手吧, 來享受用自己的程序來聊天的樂趣!不過,要想編寫一個(gè)出色的程序,不光是要有良好的創(chuàng)意與功能,更重要的是程序的 兼容性與容錯(cuò)性。 本例中, 對錯(cuò)誤處理沒有做詳細(xì)的解釋, 關(guān)于這一點(diǎn), 大家可以在 Winsock 控件的 error 事件及其幫助中找到滿意的答案。另外,還可以從以下幾方面來考慮功能的擴(kuò)充:如傳送圖形、聲音等多媒體信息、局 域網(wǎng)互傳文件(主動(dòng)傳送、歷史通話記錄、系統(tǒng)日
16、志、個(gè)人上機(jī)時(shí)間統(tǒng)計(jì)等等,而所有的 這一切僅僅取決于你的想象力與你的聰明才智! 下面, 筆者以傳送文件為例來講一講其功能 實(shí)現(xiàn)的代碼。你可以把本地的文件(圖形、聲音等可以先存成臨時(shí)文件以二進(jìn)制文件的方式來打 開它,將其內(nèi)容全部讀入一個(gè) byte 類型的數(shù)組中,本地機(jī)代碼如下:dim myfile ( as bytedim position as longopen "filename" for binary as #1position=0do while not eof(1position=positon 1redim preserve myfile (1 to positionget #1,myfile(positionloopclose #1再向遠(yuǎn)程機(jī)傳送這個(gè)字節(jié)數(shù)組sckserver.SendData myfile遠(yuǎn)程機(jī)收到這個(gè)數(shù)組之后,再以二進(jìn)制文件的方式打開一個(gè)新目標(biāo)文件,將數(shù)組內(nèi)容 寫入這個(gè)新打開的文件,如果是 bmp 圖片就將其放入 picture 圖片框中,如果是 wav 文件, 就播放。這樣,局域網(wǎng)中的兩個(gè)人就可以通過語言、圖片、文字來交流了。遠(yuǎn)程機(jī)代碼如下:Private sub sckc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《會(huì)計(jì)信息系統(tǒng)應(yīng)用》課件 學(xué)習(xí)情境4 報(bào)表系統(tǒng)應(yīng)用
- 《電子商務(wù)基礎(chǔ)》課件-話題1 電子商務(wù)概述
- 軟件開發(fā)項(xiàng)目居間協(xié)議模板
- 商業(yè)零售實(shí)體店數(shù)字化轉(zhuǎn)型與升級策略設(shè)計(jì)
- 洗衣店垃圾清運(yùn)協(xié)議
- 中醫(yī)護(hù)理學(xué)(第5版)課件 望診2+聞診
- 能源行業(yè)智能電網(wǎng)故障診斷與修復(fù)技術(shù)研究方案
- 股份轉(zhuǎn)讓協(xié)議及法律事務(wù)指南
- 餐飲業(yè)食品安全管理與后廚設(shè)備升級方案
- 項(xiàng)目可行性研究報(bào)告-范文
- 【上市公司的財(cái)務(wù)風(fēng)險(xiǎn)的分析和防范:以三只松鼠為例10000字(論文)】
- 部編版小學(xué)語文四年級下冊教師教學(xué)用書(教學(xué)參考)完整版
- 小學(xué)教師專業(yè)發(fā)展與教學(xué)質(zhì)量提升
- 大跨度空間網(wǎng)架結(jié)構(gòu)分階段整體提升安裝技術(shù)研究與應(yīng)用
- 注射用頭孢比羅酯鈉-臨床藥品應(yīng)用解讀
- 農(nóng)業(yè)領(lǐng)域的服務(wù)禮儀
- 大學(xué)生心理健康教育教程 課件 第二章 大學(xué)生自我意識
- 公證知識宣傳材料
- 聚酯生產(chǎn)技術(shù) 聚酯主要設(shè)備介紹
- 鈑金結(jié)構(gòu)件點(diǎn)檢表
- 醫(yī)療安全(不良)事件匯總登記表(科室)
評論
0/150
提交評論