版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> TCP與UDP網(wǎng)絡(luò)通訊的應(yīng)用開發(fā)</p><p> 摘 要:在網(wǎng)絡(luò)越來越發(fā)達(dá)的今天,人們對(duì)網(wǎng)絡(luò)的依賴越來越多,越來越離不開網(wǎng)絡(luò),由此而產(chǎn)生的網(wǎng)絡(luò)通訊手段越來越多。本文主要以最常見的TCP和UDP通訊協(xié)議來實(shí)現(xiàn)網(wǎng)絡(luò)通訊,讓一臺(tái)計(jì)算機(jī)實(shí)現(xiàn)客戶機(jī)/服務(wù)機(jī)的功能。</p><p> 關(guān)鍵詞:網(wǎng)絡(luò);通訊;TCP;UDP。</p><p><b&
2、gt; VC++語言綜述</b></p><p> 1.1C++的發(fā)展歷史</p><p> 當(dāng)C語言發(fā)展到頂峰的時(shí)刻,出現(xiàn)了一個(gè)版本叫C with Class,那就是C++最早的版本,在C語言中增加class關(guān)鍵字和類,那個(gè)時(shí)候有很多版本的C都希望在C語言中增加類的概念;后來C標(biāo)準(zhǔn)委員會(huì)決定為這個(gè)版本的C起個(gè)新的名字,那個(gè)時(shí)候征集了很多種名字,最后采納了其中一個(gè)人的意見
3、,以C語言中的++運(yùn)算符來體現(xiàn)它是C語言的進(jìn)步,故而叫C++,成立了C++標(biāo)準(zhǔn)委員會(huì)。為了解決此類問題,Gosling決定開發(fā)一種新的語言,并取名為Oak。它采用了大部分與C++類似的語法對(duì)可能具備危險(xiǎn)性的功能加以改進(jìn),例如將內(nèi)存管理改為由語言自己進(jìn)行管理,以減少程序員的負(fù)擔(dān)及可能發(fā)生的錯(cuò)誤。Oak是一種可移置的語言,它是一種平臺(tái)獨(dú)立的語言,能夠在各種芯片上執(zhí)行,可以降低設(shè)備的研發(fā)成本。</p><p> 1.
4、2 C++的特點(diǎn)</p><p> C++這個(gè)詞在中國大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。 它是一種使用非常廣泛的計(jì)算機(jī)編程語言。C++是一種靜態(tài)數(shù)據(jù)類型檢查的,支持多重編程范式的通用程序設(shè)計(jì)語言。它支持過程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計(jì)、制作圖標(biāo)等等泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。 </p><p> 1、C
5、++支持?jǐn)?shù)據(jù)封裝,支持?jǐn)?shù)據(jù)封裝就是支持?jǐn)?shù)據(jù)抽象。</p><p> 2、C++類中包含私有、公有和保護(hù)成員C++類中可定義三種不同訪控制權(quán)限的成員。 </p><p> 3、C++語言中通過發(fā)關(guān)消息來處理對(duì)象C++中是通過向?qū)ο蟀l(fā)關(guān)消息來處理對(duì)象的,每個(gè)對(duì)象根據(jù)所接收到的消息的性質(zhì)來決定需要采取的行動(dòng),以響應(yīng)這個(gè)消息。</p><p> 4、C++中允許友元破
6、壞封裝性類中的私有成員一般是不允許該類外面的任何函數(shù)訪問的,但是友元便可打破這條禁令。</p><p> 5、C++允許函數(shù)名和運(yùn)算符重載C++支持多態(tài)性。</p><p> 6、C++支持繼承性C++中可以允許單繼承和多繼承。</p><p> 7、C++語言支持動(dòng)態(tài)聯(lián)編C++中可以定義虛函數(shù),通過定義虛函數(shù)來支持動(dòng)態(tài)聯(lián)編。</p><p
7、> TCP與UDP 網(wǎng)絡(luò)通訊 VC++編程的實(shí)現(xiàn)原理</p><p> 2.1.1關(guān)于UDP/IP協(xié)議</p><p> 這里我們針對(duì)UDP協(xié)議的結(jié)構(gòu)進(jìn)行一下詳述。對(duì)于UDP(UDP:User Datagram Protocol)來說,用戶數(shù)據(jù)報(bào)協(xié)議(UDP)是 ISO 參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)。 UDP協(xié)議基本上是 IP 協(xié)議與
8、上層協(xié)議的接口。 UDP協(xié)議適用端口分辨運(yùn)行在同一臺(tái)設(shè)備上的多個(gè)應(yīng)用程序。</p><p> 由于大多數(shù)網(wǎng)絡(luò)應(yīng)用程序都在同一臺(tái)機(jī)器上運(yùn)行,計(jì)算機(jī)上必須能夠確保目的地機(jī)器上的軟件程序能從源地址機(jī)器處獲得數(shù)據(jù)包,以及源計(jì)算機(jī)能收到正確的回復(fù)。這是通過使用 UDP的“端口號(hào)”完成的。例如,如果一個(gè)工作站希望在工作站 128.1.123.1 上使用域名服務(wù)系統(tǒng),它就會(huì)給數(shù)據(jù)包一個(gè)目的地址 128.1.123.1 ,并在
9、 UDP頭插入目標(biāo)端口號(hào) 53 。源端口號(hào)標(biāo)識(shí)了請(qǐng)求域名服務(wù)的本地機(jī)的應(yīng)用程序,同時(shí)需要將所有由目的站生成的響應(yīng)包都指定到源主機(jī)的這個(gè)端口上。 UDP端口的詳細(xì)介紹可以參照相關(guān)文章。</p><p> 與 TCP不同, UDP協(xié)議并不提供對(duì) IP 協(xié)議的可靠機(jī)制、流控制以及錯(cuò)誤恢復(fù)功能等。由于 UDP比較簡(jiǎn)單, UDP頭包含很少的字節(jié),比 TCP負(fù)載消耗少。</p><p> UDP適
10、用于不需要 TCP可靠機(jī)制的情形,比如,當(dāng)高層協(xié)議或應(yīng)用程序提供錯(cuò)誤和流控制功能的時(shí)候。 UDP協(xié)議是傳輸層協(xié)議,服務(wù)于很多知名應(yīng)用層協(xié)議,包括網(wǎng)絡(luò)文件系統(tǒng)(NFS)、簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)、域名系統(tǒng)(DNS)以及簡(jiǎn)單文件傳輸系統(tǒng)(TFTP)。</p><p><b> UDP協(xié)議結(jié)構(gòu)</b></p><p> Source Port — 16位。源端口是可
11、選字段。當(dāng)使用時(shí),它表示發(fā)送程序的端口,同時(shí)它還被認(rèn)為是沒有其它信息的情況下需要被尋址的答復(fù)端口。如果不使用,設(shè)置值為0。</p><p> Destination Port — 16位。目標(biāo)端口在特殊因特網(wǎng)目標(biāo)地址的情況下具有意義。</p><p> Length — 16位。該用戶數(shù)據(jù)報(bào)的八位長(zhǎng)度,包括協(xié)議頭和數(shù)據(jù)。長(zhǎng)度最小值為8。</p><p> Ch
12、ecksum — 16位。IP 協(xié)議頭、UDP協(xié)議頭和數(shù)據(jù)位,最后用0填補(bǔ)的信息假協(xié)議頭總和。如果必要的話,可以由兩個(gè)八位復(fù)合而成。</p><p> Data — 包含上層數(shù)據(jù)信息。</p><p> 2.1.2MFC集成開發(fā)環(huán)境</p><p> 在比較低級(jí)的編程方法中,如用Win32直接編寫WindowsAPI應(yīng)用程序,代碼量是非常大的,因?yàn)槟闼疹?/p>
13、的細(xì)節(jié)太多了。例如,你用某種類型的結(jié)構(gòu)來接收單擊鼠標(biāo)事件。你的事件循環(huán)中的代碼會(huì)查看結(jié)構(gòu)中不同域,以確定哪個(gè)用戶界面對(duì)象受到了影響,然后會(huì)完成相應(yīng)的操作。當(dāng)屏幕上有很多對(duì)象時(shí),應(yīng)用程序會(huì)變得很大。只是簡(jiǎn)單地處?哪個(gè)對(duì)象被單擊和對(duì)它需要做些什么要花費(fèi)大量的代碼。幸運(yùn)的是,你可以在比較高級(jí)的方法來進(jìn)行編程,這就是使用MFC。在MFC中,幾乎所有的低級(jí)的細(xì)節(jié)處理都為你代辦了。如果你把某一用戶界面對(duì)象放在屏幕上,你只需要兩行代碼來 建立它。如果
14、用戶單擊一個(gè)按鈕,則按鈕自己會(huì)完成一切必要的操作,從更新屏幕上的外觀到調(diào)用你程序中的預(yù)處理函數(shù)。該函數(shù)包含有對(duì)該按鈕作出相應(yīng)操作的代碼。MFC 為你處理所有的細(xì)節(jié):你建立按鈕并告知它特定的處理函數(shù),則當(dāng)它被按下時(shí),它就會(huì)調(diào)用相應(yīng)的函數(shù)。 </p><p> Visual C++ 不僅僅是一個(gè)編譯器。它是一個(gè)全面的應(yīng)用程序開發(fā)環(huán)境,使用它你充分 利用具有面向?qū)ο筇匦缘?C++ 來
15、開發(fā)出專業(yè)級(jí)的 Windows 應(yīng)用程序。為了能充分利用這些 特性,你必須理解 C++ 程序設(shè)計(jì)語言。掌握了C++,你就必須掌握 Microsoft 基本類庫 (MFC) 的層次結(jié)構(gòu)。該層次 結(jié)構(gòu)包容了 Windows API 中的用戶界面部分,并使你能夠很容易地以 面向?qū)ο蟮姆绞浇?Windows 應(yīng)用程序。這種層次結(jié)構(gòu)適用于所有版本的 Windows 并彼此兼容。你用 MFC 所建立的代碼是完全可移植的。</p>&
16、lt;p> 2.1.3 多線程技術(shù)</p><p> 傳統(tǒng)操作系統(tǒng)中的單線程進(jìn)程由進(jìn)程控制塊和用戶地址空間、以及管理進(jìn)程執(zhí)行的調(diào)用/返回行為的系統(tǒng)堆?;蛴脩舳褩?gòu)成。如果把進(jìn)程的管理和執(zhí)行相分離,進(jìn)程作為操作系統(tǒng)中進(jìn)行保護(hù)和資沮分配的單位,允許一個(gè)進(jìn)程中包含有多個(gè)可并發(fā)執(zhí)行的控制流,這些控制流切扒時(shí)不必通過進(jìn)程調(diào)度,通信時(shí)可以直接借助于共享的內(nèi)存區(qū),這就形成了多線積進(jìn)程。</p><
17、;p> 目前,大多數(shù)操作系統(tǒng)都采用多線內(nèi)核模型,支持多線程(結(jié)構(gòu))進(jìn)程。因而,對(duì)于應(yīng)用軟件的開發(fā)來說,出現(xiàn)了另外一種設(shè)計(jì)思路,即并發(fā)多線程程序設(shè)計(jì)的方法。合理的多線程軟件結(jié)構(gòu),可以使得系統(tǒng)性能獲得較大提高,具體表現(xiàn)在:</p><p> 1.改進(jìn)程序結(jié)構(gòu)。對(duì)許多程序來說,如果把程序分成多個(gè)獨(dú)立或半獨(dú)立的執(zhí)行單元,而不是把程序設(shè)計(jì)成一個(gè)單一的復(fù)雜流程,將使程序有更高效的結(jié)構(gòu)。</p><
18、;p> 2.快速線程切換,改進(jìn)程序的實(shí)時(shí)響應(yīng)能力。多個(gè)服務(wù)器程序的任務(wù)能夠單獨(dú)以線程的方式執(zhí)行,而線程的切換可以在同一個(gè)進(jìn)程內(nèi)進(jìn)行,不需要在應(yīng)用程序中維護(hù)人為的切換界面。客戶程序也不用擔(dān)心它們的請(qǐng)求會(huì)由于其他客戶程序的請(qǐng)求所要時(shí)間太長(zhǎng)而別拒絕。</p><p> 3.減少(系統(tǒng))管理開銷,(線程)通信易于實(shí)現(xiàn),節(jié)省內(nèi)存空間。</p><p> 4.并行程度提高。在單個(gè)處理器上運(yùn)
19、行一個(gè)多線程進(jìn)程,系統(tǒng)將在多個(gè)線程之間切換處理器資源,即輪流為這些線程分配時(shí)間片,也就是并發(fā)執(zhí)行。</p><p> TCP與UDP的領(lǐng)域簡(jiǎn)介</p><p> TCP發(fā)送的包有序號(hào),對(duì)方收到包后要給一個(gè)反饋,如果超過一定時(shí)間還沒收到反饋就自動(dòng)執(zhí)行超時(shí)重發(fā),因此TCP最大的優(yōu)點(diǎn)是可靠。一般網(wǎng)頁(http)、郵件(SMTP)、遠(yuǎn)程連接(Telnet)、文件(FTP)傳送就用TCP<
20、/p><p> UDP是面向消息的協(xié)議,通信時(shí)不需要建立連接,數(shù)據(jù)的傳輸自然是不可靠的,一般用于多點(diǎn)通信和實(shí)時(shí)的數(shù)據(jù)業(yè)務(wù),比如語音廣播、視頻、QQ、TFTP(簡(jiǎn)單文件傳送)、SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)、RTP(實(shí)時(shí)傳送協(xié)議)RIP(路由信息協(xié)議,如報(bào)告股票市場(chǎng),航空信息)、DNS(域名解釋)。注重速度流暢。</p><p><b> 應(yīng)用實(shí)例</b></p&g
21、t;<p> UDP實(shí)例--網(wǎng)絡(luò)對(duì)戰(zhàn)五子棋</p><p><b> UDP的主要流程圖</b></p><p><b> 應(yīng)用實(shí)例簡(jiǎn)介:</b></p><p><b> ?、殴δ苄枨?lt;/b></p><p> ①能通過網(wǎng)絡(luò)進(jìn)行下棋</p>
22、<p> ?、诜衔遄悠宓幕疽?guī)則</p><p> ③提供“認(rèn)輸”、“和棋”、“悔棋”等功能</p><p> ?、芴峁╇p方的倒計(jì)時(shí)功能</p><p> ?、萏峁┧阶鴺?biāo)和垂直坐標(biāo)功能</p><p> ?、弈茉谄遄由巷@示的落子的順序數(shù)</p><p><b> ?、咛峁┒喾N背景</b
23、></p><p> ⑧提供玩家之間的聊天功能</p><p><b> ?、嵊斜尘耙魳?lt;/b></p><p> ?、饪勺孕休斎胗脩裘Q</p><p><b> ?、骗h(huán)境需求</b></p><p> ?、?0/10Mbps共享式HUB一臺(tái)</p>
24、<p> ?、谘b有Windows95/98/NT/XP操作系統(tǒng)的計(jì)算機(jī)兩臺(tái)</p><p> ?、塾?jì)算機(jī)的CPU不低于PII450,內(nèi)存不小于64M</p><p> ?、?0/10Mbps自適應(yīng)網(wǎng)卡每臺(tái)計(jì)算機(jī)各一塊,SB兼容聲卡各一塊,5類雙絞線若干米</p><p> ?、菝颗_(tái)計(jì)算機(jī)都應(yīng)配置有TCP/IP協(xié)議</p><p>&
25、lt;b> ⑶用戶界面需求</b></p><p><b> ?、俳缑嬗押?、親切</b></p><p><b> ②界面簡(jiǎn)潔、不花哨</b></p><p> ?、鄄僮鹘缑嬷庇^、不繁瑣</p><p><b> ?、犬惓L幚硇枨?lt;/b></p>
26、;<p> ①當(dāng)端口號(hào)沖突時(shí),錯(cuò)誤提示并可重新輸入</p><p> ?、诋?dāng)出現(xiàn)錯(cuò)誤行列時(shí),此次操作無效</p><p> ③如果網(wǎng)絡(luò)非正常斷開,則終止此局</p><p> 用戶可自行輸入本文信息作為自己的用戶名稱,并顯示在窗體Form1的Label1或Label3上(主機(jī)為L(zhǎng)abel1,客戶機(jī)為L(zhǎng)abel3)。如果用戶不輸入任何字符,則程序?qū)?/p>
27、以默認(rèn)的“玩家一”或“玩家二”作為用戶名稱(主機(jī)默認(rèn)為“玩家一”,客戶機(jī)默認(rèn)為“玩家二”)。命令如下:</p><p> If Text1.Text <> "" Then Form1.Label1.Caption = Form2.Text1.Text</p><p> 或 If Text1.Text <> "" Then
28、Form1.Label3.Caption = Form2.Text1.Text</p><p> 當(dāng)雙方連接成功以后,作為客戶機(jī)一方將主動(dòng)把自己的用戶名稱發(fā)送給主機(jī)。主機(jī)收到后將其顯示在Label3上,然后再將自己的用戶名稱發(fā)送給客戶機(jī)??蛻魴C(jī)收到后將其顯示在Label1上。自此,雙方的用戶名稱傳送結(jié)束,并顯示在了各自的位置上。</p><p><b> ?、嬗螒蛟O(shè)置</
29、b></p><p> 游戲中雙方用戶的電腦,一臺(tái)作為主機(jī),另一臺(tái)則作為客戶機(jī)。</p><p> ?、湃绻x擇“我要當(dāng)主機(jī)”,則用戶電腦將作為主機(jī)使用。</p><p> 在Text2文本框中將自動(dòng)顯示出主機(jī)的IP地址。這里是利用Form2.Text2.Text = Form1.Winsock1.LocalIP語句來獲取主機(jī)的IP地址的。但是,在某些情況
30、下,Winsock1.LocalIP所獲取的IP地址并不全面,例如:用戶如果通過ADSL上網(wǎng),Winsock1.LocalIP所獲取的IP地址并不是電腦在Internet上的IP地址,而是在局域網(wǎng)中的IP地址。</p><p> 本軟件默認(rèn)的連接端口號(hào)為7626。當(dāng)執(zhí)行Form1.Winsock1.Listen監(jiān)聽語句后,主機(jī)監(jiān)聽本地的7626端口。但是,如果7626端口已經(jīng)被其他的應(yīng)用程序所使用,那么,當(dāng)程序
31、執(zhí)行到監(jiān)聽語句時(shí)將出現(xiàn)錯(cuò)誤,并被系統(tǒng)所終止執(zhí)行。</p><p> 為避免這種情況,必須在相關(guān)的Sub過程中增加相應(yīng)的錯(cuò)誤處理語句,命令如下:</p><p> On Error GoTo CheckError</p><p> 當(dāng)錯(cuò)誤發(fā)生時(shí),通知程序在分支點(diǎn)(執(zhí)行錯(cuò)誤處理的地方)設(shè)置或激活錯(cuò)誤捕獲。然后,On Error 語句激活捕獲并指引應(yīng)用程序到標(biāo)記著錯(cuò)
32、誤處理開始的標(biāo)號(hào)處,本程序?yàn)镃heckError。</p><p> CheckError:</p><p> MsgBox Str(Err.Number) + vbCrLf + Err.Description, 0, "出錯(cuò)"</p><p> 彈出對(duì)話框,顯示錯(cuò)誤號(hào)和錯(cuò)誤描述</p><p> 自此,錯(cuò)誤被成功
33、捕獲。程序?qū)⒉粫?huì)被系統(tǒng)終止執(zhí)行。用戶可以重新輸入一個(gè)新的端口號(hào),以避免發(fā)生沖突。</p><p> ?、迫绻x擇“我要加入一個(gè)棋局”,則用戶的電腦將作為客戶機(jī)使用。</p><p> Text2文本框中的IP地址為將要連接的遠(yuǎn)程主機(jī)的IP地址或主機(jī)名。Text3文本框中的端口號(hào)為將要連接的遠(yuǎn)程主機(jī)的端口號(hào)。</p><p> 對(duì)于客戶機(jī)來說,無須指定發(fā)送數(shù)據(jù)的本
34、地端口。Form1.Winsock1.LocalPort = 0語句將隨機(jī)選擇一個(gè)端口。在建立起連接以后,它就是用于TCP連接的本地端口。</p><p><b> 規(guī)則</b></p><p><b> ?、逑缕逡?guī)則:</b></p><p> 黑方先行,雙方輪流依次落子。在一方落子之前,另一方必須等待。</p
35、><p> 為實(shí)現(xiàn)這個(gè)功能,必須使雙方的棋盤交替處于激活(True)狀態(tài)。</p><p> 在雙方網(wǎng)絡(luò)未連接成功以前,雙方的棋盤均處于禁止(False)狀態(tài),不接受落子操作。一旦,網(wǎng)絡(luò)連接成功,持黑子的一方率先使用Form1.Picture1.Enabled = True語句來激活本方棋盤。此時(shí),黑方棋盤可以接受落子操作。用戶用鼠標(biāo)在棋盤的相應(yīng)位置上點(diǎn)擊左鍵,程序捕獲鼠標(biāo)在棋盤上的點(diǎn)擊位
36、置,并計(jì)算出所處行列,在相應(yīng)位置上顯示一枚黑色棋子。自此,黑方操作結(jié)束,棋盤再次被Picture1.Enabled = False語句所禁止。然后,將落子的行列信息傳送給白方。</p><p> 白方接收到黑方的落子信息后,先在本方棋盤的相應(yīng)位置上顯示一枚黑色棋子。然后,使用Form1.Picture1.Enabled = True語句來激活本方棋盤進(jìn)行落子操作。落子后,禁止本方棋盤,再發(fā)送棋子信息給黑方。&l
37、t;/p><p> 雙方重復(fù)上述操作直到此局結(jié)束為止。</p><p><b> ?、鎰儇?fù)規(guī)則:</b></p><p> ⑴率先在棋盤上形成橫向、豎向或斜向上連續(xù)的相同顏色的五個(gè)棋子(含五個(gè)以上)的一方為勝。在15*15的棋盤上,共有八種獲勝可能。如圖4.5所示: </p><p><b> 圖4.5<
38、;/b></p><p> 其中,1、5為反斜向五子連珠,3、7為正斜向五子連珠,2、6為豎向五子連珠,4、8為橫向五子連珠。</p><p> 根據(jù)每一種不同方向上的獲勝情況,它們的判別程序也有所不同:</p><p><b> 反斜向五子連珠:</b></p><p><b> 正斜向五子連珠
39、:</b></p><p><b> 豎向五子連珠:</b></p><p><b> 橫向五子連珠:</b></p><p> ?、埔环秸J(rèn)輸,則另一方獲勝</p><p> 在游戲運(yùn)行過程中,如果一方點(diǎn)擊Form1.Command5按鈕,則被判負(fù),并向?qū)Ψ桨l(fā)送“認(rèn)輸”信息。為了避
40、免用戶在游戲過程中誤點(diǎn)Command5按鈕,在此設(shè)計(jì)了一個(gè)確認(rèn)對(duì)話框,以確認(rèn)用戶是否“認(rèn)輸”。確認(rèn)操作必須在10秒內(nèi)完成,否則被將視為否認(rèn)操作。</p><p><b> ?、绾推逡?guī)則: </b></p><p><b> ?、牌灞P滿</b></p><p> 當(dāng)棋盤上的225個(gè)交叉位置上均有棋子,但雙方均未五子連珠,則
41、判為雙方和棋。在此設(shè)計(jì)了一個(gè)計(jì)數(shù)器C,每下一步棋或則接收到一步棋時(shí),計(jì)數(shù)器均C均加1。當(dāng)計(jì)數(shù)器達(dá)到225時(shí),則表示棋盤已滿,雙方和棋。</p><p><b> ?、齐p方協(xié)商:</b></p><p> 在游戲運(yùn)行過程中,如果一方點(diǎn)擊Form1.Command6按鈕,則向?qū)Ψ綄?duì)方提出“和棋”請(qǐng)求。對(duì)方在收到和棋請(qǐng)求后,彈出確認(rèn)對(duì)話框,對(duì)方可以點(diǎn)擊“是”來接受“和棋”
42、請(qǐng)求,也可以點(diǎn)擊“否”來拒絕“和棋”請(qǐng)求。一旦對(duì)方接受“和棋”請(qǐng)求,則本局結(jié)束,雙方和棋。</p><p> 為避免用戶在游戲過程中誤點(diǎn)Command6按鈕,在這也同樣設(shè)計(jì)了一個(gè)確認(rèn)對(duì)話框。</p><p> 另外,為防止用戶在游戲過程中無限制的連續(xù)的點(diǎn)擊此按鈕,破壞游戲的可玩性。在此還設(shè)計(jì)了一個(gè)防止連續(xù)點(diǎn)擊的程序。一旦,用戶確認(rèn)自己的“和棋”的操作,Command6按鈕就被禁止,用戶
43、無法再次點(diǎn)擊。只有等到下一次該用戶下棋為止,Command6按鈕才被再次激活。</p><p><b> ?、鐖?zhí)黑規(guī)則:</b></p><p> 對(duì)弈雙方連接成功以后,由選擇“我要當(dāng)主機(jī)”的主機(jī)方率先執(zhí)黑,以后各盤雙方輪流執(zhí)黑。</p><p><b> 代碼摘要 </b></p><p
44、><b> 服務(wù)器端</b></p><p><b> 服務(wù)器發(fā)送消息:</b></p><p> void CServer::SendMsg(CClientSocket *pClientSocket, CString Msg)</p><p><b> {</b></p>
45、<p> if(pClientSocket!=NULL)</p><p> pClientSocket->Send(Msg,Msg.GetLength());</p><p><b> }</b></p><p><b> 啟動(dòng)服務(wù)器:</b></p><p> void
46、 CServer::StartServer()</p><p><b> {</b></p><p> if(m_Port==0)</p><p><b> {</b></p><p> MessageBox(_T("請(qǐng)輸入服務(wù)器端口"));</p><
47、;p><b> return;</b></p><p><b> }</b></p><p> if(m_pListenSocket!=NULL)</p><p><b> {</b></p><p> MessageBox(_T("服務(wù)器已經(jīng)開啟&q
48、uot;));</p><p><b> return;</b></p><p><b> }</b></p><p> m_pListenSocket=new CListenSocket(this);</p><p> if(m_pListenSocket->Create(m_Por
49、t))</p><p><b> {</b></p><p> if(!m_pListenSocket->Listen())</p><p> MessageBox(_T("服務(wù)器開啟失敗"));</p><p><b> else</b></p>&
50、lt;p><b> {</b></p><p> if(LoadPlayer())</p><p> MessageBox(_T("服務(wù)器開啟成功"));</p><p><b> else</b></p><p> MessageBox(_T("服務(wù)器
51、數(shù)據(jù)出錯(cuò)"));</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 關(guān)閉服務(wù)器:</b></p><p> void CS
52、erver::ShutDownServer()</p><p><b> {</b></p><p> if(m_pListenSocket!=NULL)</p><p><b> {</b></p><p> CString Msg=_T("_SHUTDOWN_ ")
53、;</p><p> POSITION p=m_LogInList.GetHeadPosition();</p><p> int n=m_LogInList.GetCount();</p><p> CClientSocket* TempClient;</p><p> for(int i=0;i<n;i++)</p&g
54、t;<p><b> {</b></p><p> TempClient=(CClientSocket*)m_LogInList.GetNext(p);</p><p> SendMsg(TempClient,Msg);</p><p> delete TempClient;</p><p><
55、;b> }</b></p><p> delete m_pListenSocket;</p><p> m_pListenSocket=NULL;</p><p> m_NumOfClient=0;</p><p> m_NumOfGame=0;</p><p> m_pDlg->m
56、_ClientNum=0;</p><p> m_pDlg->m_PlayerList.ResetContent();</p><p> m_pDlg->m_GameNum=0;</p><p> m_pDlg->m_GameList.ResetContent();</p><p> SavePlayer();<
57、;/p><p> m_ConnectionList.RemoveAll();</p><p> m_LogInList.RemoveAll();</p><p> m_PlayerList.RemoveAll();</p><p> m_GameList.RemoveAll();</p><p> m_Top10
58、List.RemoveAll();</p><p> MessageBox(_T("服務(wù)器關(guān)閉成功"));</p><p> m_pDlg->UpdateData(FALSE);</p><p><b> }</b></p><p><b> }</b></p
59、><p><b> 客戶端</b></p><p><b> 客戶端發(fā)送消息:</b></p><p> void CClient::SendMsg(CString Msg)</p><p><b> {</b></p><p> if(m_pSo
60、cket!=NULL)</p><p> m_pSocket->Send(Msg,Msg.GetLength());</p><p><b> }</b></p><p><b> 客戶端登錄:</b></p><p> void CClient::LogInMsg(PTSTR pMs
61、g)</p><p><b> {</b></p><p> m_Player.SetScore((UINT)atoi(pMsg+12));</p><p> m_pLogInDlg->EndDialog(IDOK);</p><p><b> }</b></p><
62、;p><b> 創(chuàng)建會(huì)話:</b></p><p> void CClient::CreateMsg(PTSTR pMsg)</p><p><b> {</b></p><p> m_InGame=TRUE;</p><p> m_pView->m_GameNameText=
63、pMsg+12;</p><p> m_pWeiQi->m_Color=BLACK;</p><p> m_pView->UpdateData(FALSE);</p><p><b> }</b></p><p><b> 客戶端加入游戲:</b></p><
64、p> void CClient::JoinGameMsg(PTSTR pMsg)</p><p><b> {</b></p><p> int i=12,j,k;</p><p> while(pMsg[i]!=_T(' ')) i++;</p><p> pMsg[i]=0;</
65、p><p><b> j=i+1;</b></p><p> while(pMsg[j]!=_T(' ')) j++;</p><p> pMsg[j]=0;</p><p><b> k=j+1;</b></p><p> while(pMsg[k]!
66、=_T(' ')) k++;</p><p> pMsg[k]=0;</p><p> m_GameName=pMsg+12;</p><p> m_InGame=TRUE;</p><p> m_GameStart=TRUE;</p><p> m_pView->m_GameNameT
67、ext=m_GameName;</p><p> m_pView->m_Player2Info=pMsg+i+1;</p><p> m_pView->m_Player2Info+=_T("\r\n等級(jí):");</p><p> m_pView->m_Player2Info+=pMsg+j+1;</p>&l
68、t;p> m_pView->m_Player2Info+="\r\n積分:";</p><p> m_pView->m_Player2Info+=pMsg+k+1;</p><p> m_pWeiQi->m_Color=WHITE;</p><p> m_pView->m_Color=BLACK;</p
69、><p> m_pView->UpdateData(FALSE);</p><p><b> }</b></p><p> void CClient::OneJoinMsg(PTSTR pMsg)</p><p><b> {</b></p><p> Messa
70、geBox(_T("有人加入你的游戲"));</p><p> int i=12,j;</p><p> while(pMsg[i]!=_T(' ')) i++;</p><p> pMsg[i]=0;</p><p><b> j=i+1;</b></p>&l
71、t;p> while(pMsg[j]!=_T(' ')) j++;</p><p> pMsg[j]=0;</p><p> m_InGame=TRUE;</p><p> m_GameStart=TRUE;</p><p> m_pView->m_Player2Info=pMsg+12;</p&g
72、t;<p> m_pView->m_Player2Info+="\r\n等級(jí):";</p><p> m_pView->m_Player2Info+=pMsg+i+1;</p><p> m_pView->m_Player2Info+="\r\n積分:";</p><p> m_pVie
73、w->m_Player2Info+=pMsg+j+1;</p><p> m_pWeiQi->m_Color=BLACK;</p><p> m_pView->m_Color=BLACK;</p><p> m_pView->UpdateData(FALSE);</p><p><b> }</
74、b></p><p><b> 若主機(jī)不存在:</b></p><p> void CClient::HostExitMsg(PTSTR pMsg)</p><p><b> {</b></p><p> m_InGame=FALSE;</p><p> m_
75、GameStart=FALSE;</p><p> MessageBox(_T("主機(jī)已退出"));</p><p> m_pView->m_GameNameText=_T("");</p><p> m_pView->m_Player2Info=_T("");</p>&l
76、t;p> m_pView->UpdateData(FALSE);</p><p><b> }</b></p><p><b> 客戶端退出:</b></p><p> void CClient::ClientExitMsg(PTSTR pMsg)</p><p><b&g
77、t; {</b></p><p> m_GameStart=FALSE;</p><p> MessageBox(_T("對(duì)方已退出"));</p><p> m_pView->m_Player2Info=_T("");</p><p> m_pView->Update
78、Data(FALSE);</p><p><b> }</b></p><p><b> 心得體會(huì):</b></p><p> 在做實(shí)驗(yàn)之前首先要了解端對(duì)端聊天的詳細(xì)流程以及工作原理,然后選取適當(dāng)?shù)目丶约翱丶膶傩詫?duì)其進(jìn)行編碼,盡可能的實(shí)現(xiàn)所需要的功能。</p><p> 1首先要設(shè)置服務(wù)
79、端,并檢測(cè)服務(wù)端所開放的端口,并對(duì)網(wǎng)絡(luò)進(jìn)行監(jiān)聽(ServerSocket)。</p><p> 2打開客戶端再選擇設(shè)置自身開放的端口號(hào)和服務(wù)端開放的端口號(hào),并向服務(wù)端發(fā)出連接請(qǐng)求。</p><p> 3服務(wù)端監(jiān)聽到客戶端的連接請(qǐng)求,并同意連接,連接成功后即可發(fā)送信息進(jìn)行聊天。</p><p> TCP實(shí)例--網(wǎng)絡(luò)聊天室</p><p>
80、<b> TCP的主要流程圖</b></p><p><b> 應(yīng)用實(shí)例簡(jiǎn)介</b></p><p> 局域網(wǎng)聊天系統(tǒng)使該系統(tǒng)的用戶能夠通過客戶端登入到該系統(tǒng),然后直接與系統(tǒng)交互。首先,需啟動(dòng)服務(wù)器,進(jìn)行服務(wù)器的配置,進(jìn)行正確的服務(wù)器配置和數(shù)據(jù)庫連接并測(cè)試成功后,開啟服務(wù)器。接下來,在客戶端,該系統(tǒng)的用戶能夠通過登陸界面進(jìn)入,然后直接與系統(tǒng)
81、交互,進(jìn)行文字傳送。本系統(tǒng)支持的活動(dòng)列表如下:</p><p> 配置服務(wù)器,設(shè)置IP及端;</p><p><b> 開啟服務(wù)器;</b></p><p> 對(duì)離線用戶進(jìn)行刪除管理;</p><p><b> 用戶登陸系統(tǒng);</b></p><p> 用戶與系統(tǒng)交
82、互,進(jìn)行文字傳送;</p><p> 用戶好友登陸后,自動(dòng)刷新列表;</p><p> 傳送文字,當(dāng)好友不在線時(shí),發(fā)送離線消息;</p><p><b> 上線接收離線消息;</b></p><p> 該聊天程序分為服務(wù)器端和課戶端兩個(gè)部分。</p><p><b> 客戶端實(shí)
83、現(xiàn)功能:</b></p><p> 向在線成員發(fā)送消息并接收消息。</p><p> 更新成員狀態(tài)。當(dāng)其他成員上線或下線時(shí),客戶端及時(shí)更新成員狀態(tài)。</p><p> 更新成員列表,當(dāng)其他成員加入或者偶成員被刪除時(shí),客戶端及時(shí)更新成員列表。</p><p> 當(dāng)對(duì)方不在線時(shí),可以向該成員發(fā)送離線消息。</p>
84、<p> 當(dāng)用戶上線時(shí),接受其他用戶的離線消息。</p><p><b> 保存聊天記錄。</b></p><p><b> 服務(wù)器端實(shí)現(xiàn)功能:</b></p><p> 維護(hù)聊天室成員列表:包括接受新成員,刪除已有成員。</p><p> 通知客戶端更新成員狀態(tài)。</p
85、><p> 通知客戶端更新成員列表。</p><p> 為離線用戶保存離線消息。</p><p><b> 驗(yàn)證密碼。</b></p><p> 禁止已登陸用戶再次登陸。</p><p><b> 保存用戶信息。</b></p><p> 為用
86、戶保存離線消息。</p><p><b> 關(guān)系圖如圖所示:</b></p><p><b> 關(guān)系功能圖</b></p><p><b> 系統(tǒng)設(shè)計(jì)</b></p><p><b> 設(shè)計(jì)原則</b></p><p>
87、考慮到系統(tǒng)的可重用性和伸縮性,需要將本系統(tǒng)的網(wǎng)絡(luò)通信底層和應(yīng)用系統(tǒng)分離開。這樣,基于可重用的網(wǎng)絡(luò)通信層,可以實(shí)現(xiàn)其他各種實(shí)時(shí)性較高的應(yīng)用系統(tǒng)。</p><p> 本系統(tǒng)在架構(gòu)設(shè)計(jì)上將分4個(gè)層次,如圖3.2所示。</p><p><b> 圖3.2架構(gòu)層次</b></p><p> 本系統(tǒng)最底層是Socket通信層,將負(fù)責(zé)客戶端和服務(wù)器之間
88、快速的數(shù)據(jù)交換,它通過接口層和最上面應(yīng)用層保持實(shí)時(shí)數(shù)據(jù)聯(lián)系。用戶從客戶端進(jìn)入到本系統(tǒng)前,將實(shí)現(xiàn)統(tǒng)一的用戶登錄驗(yàn)證機(jī)制。Socket底層設(shè)計(jì)分兩大部分:協(xié)議設(shè)計(jì)和連接處理設(shè)計(jì):協(xié)議設(shè)計(jì)和連接處理設(shè)計(jì);CSocket層的目的是提供底層和應(yīng)用蹭一個(gè)中介媒體的作用,但是不能設(shè)計(jì)得太復(fù)雜,以免延誤數(shù)據(jù)傳送時(shí)間。</p><p><b> 代碼摘要</b></p><p>&l
89、t;b> 服務(wù)器端</b></p><p><b> 主函數(shù):</b></p><p> void main()</p><p><b> {</b></p><p> //T:1、初始化:初始化Winsock32庫-------------------------<
90、;/p><p> //定義WINSOCK32結(jié)構(gòu)體</p><p> WSADATA wsaData;</p><p> //MAKEWORD宏(socket庫主版本,次版本)</p><p> WORD wVersionRequested = MAKEWORD( 1, 1 );</p><p> //初始化Wi
91、nsock32庫WSAStartup(版本W(wǎng)ORD,[out]WINSOCK32結(jié)構(gòu)體) 計(jì)數(shù)++</p><p> int err = WSAStartup( wVersionRequested, &wsaData );</p><p> if ( err != 0 ) </p><p><b> {</b></p&g
92、t;<p><b> return;</b></p><p><b> }</b></p><p> //請(qǐng)求的socket庫版本 失敗。1 || 1 對(duì)應(yīng) MAKEWORD( 1, 1 )</p><p> if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYT
93、E( wsaData.wVersion ) != 1 ) </p><p><b> {</b></p><p> WSACleanup( );</p><p><b> return; </b></p><p><b> }</b></p><p&
94、gt; //T:2、建立:建立socket對(duì)象</p><p> //建立socket對(duì)象socket(AF_INET,SOCK_STREAM數(shù)據(jù)流或SOCK_DGRAM數(shù)據(jù)報(bào),IPPROTO_IP);</p><p> SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);</p><p> //T:
95、3、綁定:設(shè)定本機(jī) 綁定監(jiān)聽 的 地址、端口</p><p> //為socket分配要監(jiān)聽的:地址、端口</p><p> sockaddr_in addrSrv;</p><p> addrSrv.sin_family=AF_INET;</p><p> addrSrv.sin_addr.S_un.S_addr=htonl(INA
96、DDR_ANY);//監(jiān)聽端口:INADDR_ANY或指定inet_addr("127.0.0.1")</p><p> addrSrv.sin_port=htons(6000);//監(jiān)聽端口</p><p> //綁定本機(jī) sockaddr_in</p><p> err=bind(sockSrv,(SOCKADDR*)&addr
97、Srv,sizeof(sockaddr_in));</p><p> if(err==SOCKET_ERROR)</p><p><b> {</b></p><p> int nSockErr = WSAGetLastError();</p><p> printf("綁定錯(cuò)誤:%d!\n"
98、, nSockErr);</p><p><b> return;</b></p><p><b> }</b></p><p> //T:4、監(jiān)聽:監(jiān)聽客戶連接請(qǐng)求</p><p> //監(jiān)聽listen(sockSrv,請(qǐng)求連接的隊(duì)列中允許的Max數(shù)目)</p><p
99、> err=listen(sockSrv,5);</p><p> if(err==SOCKET_ERROR)</p><p><b> {</b></p><p> int nSockErr =WSAGetLastError();</p><p> printf("監(jiān)聽錯(cuò)誤:%d\n"
100、;, nSockErr);</p><p><b> return;</b></p><p><b> }</b></p><p><b> //提示狀態(tài)</b></p><p> printf("服務(wù)器啟動(dòng)成功!\n");</p>&
101、lt;p> printf("服務(wù)器正在監(jiān)聽\n");</p><p> sockaddr_in addrClient;</p><p> int len=sizeof(SOCKADDR);</p><p> //T:5、接受連接:</p><p> //T:5.1、接受連接:若有客戶連接,則接受連接 acc
102、ept(sockSrv,[out]客戶信息指針,&len);</p><p> SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);</p><p> if(sockConn == INVALID_SOCKET)</p><p><b> {</b>
103、;</p><p> int nSockErr = WSAGetLastError();</p><p> printf("接受錯(cuò)誤:%d\n",nSockErr);</p><p><b> //break;</b></p><p><b> }</b></p&g
104、t;<p><b> //獲得IP、端口</b></p><p> char* pIP=inet_ntoa(addrClient.sin_addr);</p><p> u_short pPort=ntohs(addrClient.sin_port);</p><p> char ss[100];</p>&
105、lt;p> sprintf(ss,"IP=%s PORT=%d",pIP,pPort);</p><p> printf("%s\n",ss);</p><p> //T:6.1、接收數(shù)據(jù)</p><p> char recvBuf2[100];</p><p> recv(sockC
106、onn,recvBuf2,100,0);</p><p> printf("%s\n",recvBuf2);</p><p> //T:6。2、發(fā)送:數(shù)據(jù)</p><p> char sendBuf[100];</p><p> sprintf(sendBuf,"%s","hello&
107、quot;);</p><p> send(sockConn,sendBuf,strlen(sendBuf)+1,0);</p><p> //T:7、關(guān)閉連接</p><p> closesocket(sockConn);</p><p> //T:8、清除套接字庫引用。 計(jì)數(shù)--</p><p> WSA
108、Cleanup();</p><p><b> }</b></p><p><b> 客戶端</b></p><p> void main()</p><p><b> {</b></p><p> //T:1、初始化:初始化Winsock32
109、庫-------------------------</p><p> //定義WINSOCK32結(jié)構(gòu)體</p><p> WSADATA wsaData;</p><p> //MAKEWORD宏(socket庫主版本,次版本)</p><p> WORD wVersionRequested = MAKEWORD( 1, 1 );&
110、lt;/p><p> //初始化Winsock32庫WSAStartup(版本W(wǎng)ORD,[out]WINSOCK32結(jié)構(gòu)體) 計(jì)數(shù)++</p><p> int err = WSAStartup( wVersionRequested, &wsaData );</p><p> if ( err != 0 ) </p><p>&
111、lt;b> {</b></p><p><b> return;</b></p><p><b> }</b></p><p> //請(qǐng)求的socket庫版本 失敗。1 || 1 對(duì)應(yīng) MAKEWORD( 1, 1 )</p><p> if ( LOBYTE( wsa
112、Data.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) </p><p><b> {</b></p><p> WSACleanup( );</p><p><b> return; </b></p><p><b>
113、}</b></p><p> //T:2、建立:建立socket對(duì)象</p><p> //建立socket對(duì)象socket(AF_INET,SOCK_STREAM數(shù)據(jù)流或SOCK_DGRAM數(shù)據(jù)報(bào),IPPROTO_IP);</p><p> SOCKET sockClient=socket(AF_INET,SOCK_STREAM,IPPROTO
114、_IP);</p><p> //T:3、連接:設(shè)定本機(jī) 要連接的server 地址、端口</p><p> //為socket分配要要連接:地址、端口</p><p> sockaddr_in addrSrv;</p><p> addrSrv.sin_family=AF_INET;</p><p> ad
115、drSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//監(jiān)聽端口:INADDR_ANY或指定inet_addr("127.0.0.1")</p><p> addrSrv.sin_port=htons(6000);//監(jiān)聽端口</p><p> //連接 addrSrv</p>&l
116、t;p> err=connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));</p><p> if(err==SOCKET_ERROR)</p><p><b> {</b></p><p> int nSockErr = WSAGetLastError();&l
117、t;/p><p> printf("連接錯(cuò)誤:%d!\n", nSockErr);</p><p><b> return;</b></p><p><b> }</b></p><p><b> //T:4、發(fā)送:</b></p><
118、;p> char recvBuf[100];</p><p> send(sockClient,"我上線了",strlen("我上線了")+1,0);</p><p><b> //T:4、接收:</b></p><p> recv(sockClient,recvBuf,100,0);<
119、;/p><p> printf("%s\n",recvBuf);</p><p> //T:5、關(guān)閉連接</p><p> closesocket(sockClient);</p><p> //T:6、清除套接字庫引用。 計(jì)數(shù)--</p><p> WSACleanup();</p&g
120、t;<p><b> }</b></p><p><b> 總 結(jié)</b></p><p> 實(shí)現(xiàn)局域網(wǎng)即時(shí)通信,讓一臺(tái)計(jì)算機(jī)實(shí)現(xiàn)客戶機(jī)/服務(wù)機(jī)的功能,深入了解UDP協(xié)議和TCP協(xié)議的聯(lián)系與區(qū)別,根據(jù)對(duì)傳輸質(zhì)量和效率的要求等各種考慮因數(shù),選擇是采用TCP,還是采用UDP;采用多線程技術(shù),保證應(yīng)用正常的工作,而不至于出現(xiàn)“假死
121、”現(xiàn)象。</p><p><b> 參考文獻(xiàn):</b></p><p> [1] Stanley B.Lippman等. C++Primer(英文版). 人民郵電出版社2006-11 </p><p> [2] 陳堅(jiān),陳偉. Visual C++ 網(wǎng)絡(luò)高級(jí)編程. 人民郵電出版社 2001-08</p><p>
122、[3] JoeyGeorge[等]著. 世界著名計(jì)算機(jī)教材精選?面向?qū)ο笙到y(tǒng)分析與設(shè)計(jì)(第2版) 清華大學(xué)出版社 2008-01 </p><p> [4] 孫鑫、 余安萍等. VC++深入詳解 電子工業(yè)出版社 2006-06</p><p> [5] Kruglinski.D.J.,潘愛民, 王國印. VisualC++技術(shù)內(nèi)幕(第4版)(修訂版) 清華大學(xué)出版社2009-04 &l
123、t;/p><p> [6] 王艷平,張?jiān)? WINDOWS網(wǎng)絡(luò)與通信程序設(shè)計(jì)(第二版).人民郵電出版社 2009-01</p><p> [7] Jeffrey Richter,Christophe Nasarre,葛子昂,周靖. Windows核心編程(第5版) 清華大學(xué)出版社. 2008-09</p><p> [8] 帕羅賽斯. MFC Windows程序設(shè)
124、計(jì)(第2版)(修訂版) 清華大學(xué)出版社 2007-05 </p><p> [9] 侯俊杰. 深入淺出MFC 華中科技大學(xué)出版社 2001-01</p><p> [10] 英特爾亞太研發(fā)有限公司、 英特爾軟件學(xué)院教材編寫組. 多核多線程技術(shù). 上海交通大學(xué)出版社 2011-01 </p><p> [11] Jim Beveridge , Robert W
125、iener、 侯捷. Win32多線程序設(shè)計(jì). 華中科技大學(xué)出</p><p> 版社 2002-01 </p><p> TCP and UDP network communication application development</p><p> design research</p><p> Abstract: In
126、the network more and more developed, the reliance on the network more and more, and become increasingly dependent on the network, the resulting network more and more means of communication. In this paper, the most common
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設(shè)計(jì)(論文)-基于modbus協(xié)議的聯(lián)控系統(tǒng)網(wǎng)絡(luò)通訊開發(fā)
- 網(wǎng)絡(luò)通訊技術(shù)的家庭應(yīng)用
- 基于java的網(wǎng)絡(luò)通訊系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(論文+系統(tǒng))
- 淺談光纖傳輸在網(wǎng)絡(luò)通訊中的應(yīng)用
- 創(chuàng)造網(wǎng)絡(luò)通訊新時(shí)代
- 基于QT的UDP網(wǎng)絡(luò)廣播程序畢業(yè)論文.doc
- [學(xué)習(xí)]網(wǎng)絡(luò)通訊工具-即時(shí)通訊
- 畢業(yè)論文——淺析計(jì)算機(jī)網(wǎng)絡(luò)通訊存在的問題及其改進(jìn)策略new
- 畢業(yè)設(shè)計(jì)---基于cs即時(shí)網(wǎng)絡(luò)通訊軟件的設(shè)計(jì)與實(shí)現(xiàn)
- 【zs精品】【畢業(yè)論文】丁滋汛(千里馬公司網(wǎng)絡(luò)通訊系統(tǒng))(全套)
- abplc及網(wǎng)絡(luò)通訊培訓(xùn)教程
- abplc及網(wǎng)絡(luò)通訊培訓(xùn)教程
- gsm通訊網(wǎng)絡(luò)干擾與優(yōu)化畢業(yè)論文
- gsm通訊網(wǎng)絡(luò)干擾與優(yōu)化畢業(yè)論文
- 基于JAVA的網(wǎng)絡(luò)通訊系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn).doc
- FPSO多級(jí)自動(dòng)監(jiān)控與網(wǎng)絡(luò)通訊研究.pdf
- 最新 網(wǎng)絡(luò)通訊協(xié)議圖 2016版
- 基于WinCC的控制網(wǎng)絡(luò)通訊設(shè)計(jì).pdf
- 基于VoIP網(wǎng)絡(luò)通訊計(jì)費(fèi)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 網(wǎng)絡(luò)通訊數(shù)據(jù)包截獲與解析研究.pdf
評(píng)論
0/150
提交評(píng)論