

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 畢業(yè)論文</b></p><p> 題 目: 局域網(wǎng)即時(shí)通信軟件 </p><p> 姓 名: </p><p> 系 別: 軟件學(xué)院 </p><p> 年 級(jí): 09級(jí)
2、 </p><p> 專業(yè)班級(jí): </p><p> 指導(dǎo)教師: </p><p><b> 摘 要</b></p><p> 語(yǔ)言交流本身是方便快捷的,所以人們已經(jīng)習(xí)慣于用電話進(jìn)行溝通。但是,電話通信需要建立雙方共同應(yīng)約的條件之下,而即時(shí)通
3、信,則解決了這個(gè)問(wèn)題。即時(shí)通信在互聯(lián)網(wǎng)領(lǐng)域的應(yīng)用取得了巨大的成功,但是在企業(yè)內(nèi)部的應(yīng)用仍遠(yuǎn)未普及。局域網(wǎng)即時(shí)通信軟件,就是基于企業(yè)內(nèi)部局域網(wǎng)使用的即時(shí)通信。</p><p> 本軟件采用了較普遍的MFC對(duì)話框類,使用Visual C++ 6.0進(jìn)行開發(fā)。以UDP作為網(wǎng)絡(luò)通信協(xié)議,使用WinSock網(wǎng)絡(luò)編程接口。本軟件基本實(shí)現(xiàn)了用戶名及頭像的自定義修改、用戶的上下線實(shí)時(shí)顯示、即時(shí)通信聊天、聊天記錄的存取等功能,本
4、文主要介紹的是局域網(wǎng)即時(shí)通信軟件的設(shè)計(jì)與實(shí)現(xiàn)。</p><p> 關(guān)鍵詞: C++、MFC、UDP、WinSock、局域網(wǎng)、通信</p><p><b> Abstract</b></p><p> Verbal communication itself is convenient, so people have become accu
5、stomed to communicate by telephone. However, the telephone communication needs of both sides should be about establishing the conditions under which instant communication, is to solve this problem. The field of instant m
6、essaging applications on the Internet has achieved great success, but the application within the enterprise still far from universal. LAN instant messaging software, is based on the internal LAN to use instant m</p>
7、;<p> The software uses the more common MFC dialog class, using Visual C + + 6.0 for development. The UDP as the network communication protocol, using the WinSock network programming interface. The software is ba
8、sically a user name and picture of the custom modifications, the user's real-time display on the assembly line, instant messaging chat, chat records access and other functions, this article focuses on the LAN instant
9、 messaging software design and implementation.</p><p> Keywords: C + +, MFC, UDP, WinSock, LAN, communications. 目錄</p><p> 第1章課題背景與開發(fā)意義6</p><p> 1.1 課題背景6</p><p>
10、 1.2 開發(fā)現(xiàn)狀分析6</p><p> 1.3 現(xiàn)行系統(tǒng)問(wèn)題分析6</p><p> 1.4 解決方案7</p><p> 1.5課題開發(fā)意義7</p><p> 第2章理論基礎(chǔ)8</p><p> 2.1 MFC開發(fā)類庫(kù)8</p><p> 2.2 類封裝技術(shù)
11、8</p><p> 2.3 多線程技術(shù)8</p><p> 2.4 WinSock技術(shù)9</p><p> 2.5 CImageList圖像列表技術(shù)9</p><p> 2.6 CStdioFile文件存儲(chǔ)技術(shù)10</p><p> 第3章系統(tǒng)需求分析11</p><p>
12、; 3.1業(yè)務(wù)系統(tǒng)描述11</p><p> 3.2 系統(tǒng)存在的主要問(wèn)題的分析11</p><p> 3.3解決方案11</p><p> 3.4 功能分析11</p><p> 第4章系統(tǒng)總體設(shè)計(jì)13</p><p> 4.1 系統(tǒng)功能結(jié)構(gòu)13</p><p> 4
13、.2 系統(tǒng)框架圖與流程圖13</p><p> 4.3 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)15</p><p> 第5章詳細(xì)設(shè)計(jì)與功能實(shí)現(xiàn)18</p><p> 5.1通信功能模塊介紹18</p><p> 5.1.1系統(tǒng)監(jiān)聽模塊18</p><p> 5.1.2聊天通信模塊18</p><
14、p> 5.2通信功能模塊詳解18</p><p> 5.2.1上下線監(jiān)聽18</p><p> 5.2.2聊天請(qǐng)求監(jiān)聽21</p><p> 5.2.3聊天通信24</p><p> 5.3聊天功能模塊介紹27</p><p> 5.3.1聊天記錄模塊27</p>
15、<p> 5.4聊天功能模塊詳解27</p><p> 5.4.1聊天記錄存儲(chǔ)27</p><p> 5.4.2聊天記錄讀取28</p><p> 5.4.3清空聊天記錄29</p><p> 5.4.4用戶登錄模塊29</p><p> 5.4.5資料修改模塊30<
16、;/p><p> 5.4.6用戶注銷模塊30</p><p> 5.5用戶功能模塊詳解31</p><p> 5.5.1用戶登錄31</p><p> 5.5.2資料讀取36</p><p> 5.5.3資料修改37</p><p> 5.5.4用戶注銷38<
17、;/p><p> 5.6頭像功能模塊介紹39</p><p> 5.6.1頭像更改模塊39</p><p> 5.6.2頭像讀取顯示模塊40</p><p> 5.7頭像功能模塊詳解41</p><p> 5.7.1頭像更改41</p><p> 5.7.2頭像讀取
18、顯示43</p><p> 第6章系統(tǒng)總結(jié)45</p><p><b> 參考文獻(xiàn)46</b></p><p><b> 課題背景與開發(fā)意義</b></p><p><b> 1.1 課題背景</b></p><p> 隨著互聯(lián)網(wǎng)應(yīng)用越
19、來(lái)越豐富,以快速、交互、簡(jiǎn)便為代表的即時(shí)通訊工具,已經(jīng)成為當(dāng)前網(wǎng)絡(luò)用戶最喜愛的網(wǎng)絡(luò)溝通工具。聊天軟件作為當(dāng)今使用最為廣泛的即時(shí)性通 信工具之一,給互聯(lián)網(wǎng)上的用戶提供了諸多的服務(wù),如文字聊天、文件傳輸、語(yǔ)音聊天、視頻聊天等功能。作為即時(shí)通訊工具最具增長(zhǎng)潛力之一的聊天軟件,不僅在基礎(chǔ)應(yīng)用方面,還是產(chǎn)品擴(kuò)展應(yīng)用方面都將有質(zhì)的飛躍,它為滿足人們的需要,將其功能不斷的完善。隨著聊天軟件功能的不斷完善,用戶通過(guò)聊天軟件在互聯(lián)網(wǎng)上 盡情的交談,不但可
20、以文字聊天和文件傳輸,還可以通過(guò)語(yǔ)音、視頻來(lái)聊天。在今后隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,聊天軟件也在以前所未有的速度改變著人們的生活方 式,它必定會(huì)成為人們網(wǎng)絡(luò)生活不可缺少的一部分。</p><p> 1.2 開發(fā)現(xiàn)狀分析</p><p> 1996年11月ICQ在全球發(fā)布,拉開了互聯(lián)網(wǎng)IM(Instant Messenger,即時(shí)通訊)應(yīng)用的序幕。就是這樣一款小軟件在短短數(shù)年時(shí)間里發(fā)展出一個(gè)巨
21、大的IM產(chǎn)業(yè)。</p><p> 當(dāng)ICQ風(fēng)行全球的時(shí)候,在國(guó)內(nèi)各種仿ICQ的中文IM軟件也紛紛推出,時(shí)至今日,占據(jù)國(guó)內(nèi)的市場(chǎng)的主要是騰訊公司的QQ、微軟的MSN、雅虎的雅虎通等。其中騰訊公司的QQ以占據(jù)了國(guó)內(nèi)70%以上的市場(chǎng)。</p><p> 隨著IM應(yīng)用的深入,其功能早已超越了初期的即時(shí)文字聊天。表情圖標(biāo)早已成為各個(gè)IM軟件的標(biāo)準(zhǔn)功能,文件傳輸、語(yǔ)音/視頻聊天、游戲、網(wǎng)上交友等高
22、級(jí)功能也正越來(lái)越多地被集成進(jìn)入IM應(yīng)用。事實(shí)表明,現(xiàn)在的IM已不再是一個(gè)簡(jiǎn)單的溝通工具,而是一個(gè)信息資訊、交流互動(dòng)、休閑娛樂(lè)中心,IM平臺(tái)上的語(yǔ)音、視頻、音樂(lè)點(diǎn)播、信息共享等新應(yīng)用層出不窮。發(fā)展到現(xiàn)在,IM軟件越來(lái)越成熟,IM產(chǎn)業(yè)鏈也已經(jīng)形成,已經(jīng)成為現(xiàn)代人和現(xiàn)代經(jīng)濟(jì)中不可或缺的一部份,相信未來(lái)IM軟件的道路會(huì)更加寬廣和精彩。</p><p> 1.3 現(xiàn)行系統(tǒng)問(wèn)題分析</p><p>
23、 即時(shí)通信軟件首要問(wèn)題在于對(duì)信息的精準(zhǔn)傳輸?,F(xiàn)行許多IM軟件(如:騰訊QQ),大都需要一個(gè)服務(wù)端做信息的轉(zhuǎn)接,這種C-S架構(gòu)并不適于公司內(nèi)部的這種小型局域網(wǎng)通信的需要,不僅搭建環(huán)境復(fù)雜,成本高,難以維護(hù),而且在信息的轉(zhuǎn)接的過(guò)程容易發(fā)生錯(cuò)誤造成信息的丟失,錯(cuò)發(fā)等信息安全問(wèn)題。此外,使用C-S架構(gòu)還需要一個(gè)高端的服務(wù)器和數(shù)據(jù)庫(kù)做支持。</p><p><b> 1.4 解決方案</b><
24、;/p><p> 為了解決以上所提到的問(wèn)題,本軟件拋棄了C-S架構(gòu)的IM搭建方式,才用多端口接發(fā)數(shù)據(jù),實(shí)現(xiàn)獨(dú)立用戶-專一端口,防止了信息的丟失和錯(cuò)發(fā)。同時(shí),省略了服務(wù)器的搭建,節(jié)約了軟件運(yùn)行成本。</p><p> 而在數(shù)據(jù)方面,無(wú)論是用戶信息,還是聊天記錄,全部才用本地加密存儲(chǔ)于文件中,節(jié)省了數(shù)據(jù)庫(kù)的搭建成本。</p><p> 整個(gè)軟件僅一個(gè)客戶端,將所有功能
25、封裝于各式類文件中,后期維護(hù)簡(jiǎn)單。</p><p><b> 1.5課題開發(fā)意義</b></p><p> 21世紀(jì)是信息的時(shí)代,隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,信息在傳遞方面也有了嶄新的一面。現(xiàn)今聊天軟件成為信息傳遞最為廣泛的應(yīng)用工具,它發(fā)揮了即時(shí)性通信的特點(diǎn),可以 讓用戶在第一時(shí)間內(nèi)得到信息的交流,它不僅可以讓用戶進(jìn)行文字聊天,而且還增添語(yǔ)音、視頻功能。這樣可以讓網(wǎng)上的
26、好友身臨其境的面對(duì)面的聊天,讓彼此之間 更為深入的了解。人性化的設(shè)計(jì)讓每個(gè)用戶都可以得心應(yīng)手的使用,從而獲得更多人的青睞。Internet的 出現(xiàn)連通了整個(gè)世界,而聊天軟件的出現(xiàn)則連通了每一位網(wǎng)上的用戶。相比較同類產(chǎn)品,局域網(wǎng)即時(shí)通訊軟件具有以下優(yōu)勢(shì):</p><p> 界面友好,操作簡(jiǎn)單,易于上手。</p><p> 采用WinSock網(wǎng)絡(luò)編程的規(guī)范,更加安全穩(wěn)定;</p>
27、;<p> 采用加密文件存儲(chǔ)信息,安全有保證,且成本低;</p><p> 采用UDP通信協(xié)議,通信即時(shí)性強(qiáng),無(wú)需等待對(duì)方應(yīng)答;</p><p> 無(wú)需搭建服務(wù)器,后期維護(hù)成本低,前期搭建使用簡(jiǎn)單;</p><p><b> 理論基礎(chǔ)</b></p><p> 2.1 MFC開發(fā)類庫(kù)</p&
28、gt;<p> MFC(Microsoft Foundation Classes,又稱微軟基礎(chǔ)類庫(kù))是一個(gè)微軟公司提供的類庫(kù)(class libraries),以C++類的形式封裝了Windows API,并且包含一個(gè)應(yīng)用程序框架,以減少應(yīng)用程序開發(fā)人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內(nèi)建控件和組件的封裝類。</p><p> 而Visual C++中
29、包含MFC應(yīng)用程序向?qū)?,可用于兼容MFC的應(yīng)用程序。在向?qū)е杏懈鞣N選項(xiàng)以定制生成的程序的功能,例如界面風(fēng)格、語(yǔ)種、數(shù)據(jù)庫(kù)開發(fā)支持、打印支持、自動(dòng)化支持、ActiveX支持、網(wǎng)絡(luò)支持、基于HTML的幫助文檔支持等等。</p><p> MFC的主要優(yōu)點(diǎn)是可以用面向?qū)ο蟮姆椒▉?lái)調(diào)用Windows API,以及應(yīng)用程序開發(fā)的便捷。MFC將很多應(yīng)用程序開發(fā)中常用的功能自動(dòng)化,并且提供了文檔框架視圖結(jié)構(gòu)和活動(dòng)文檔這樣的便
30、于自定義的應(yīng)用程序框架。同時(shí),在Visual C++內(nèi)部也內(nèi)建了很多對(duì)MFC的例如類向?qū)н@樣的支持以減少軟件開發(fā)的時(shí)間。MFC的消息映射機(jī)制也避免了使用性能較低的龐大虛函數(shù)表。</p><p><b> 2.2 類封裝技術(shù)</b></p><p> 類(class),是一種面向?qū)ο笥?jì)算機(jī)編程語(yǔ)言的構(gòu)造,是創(chuàng)建對(duì)象的藍(lán)圖,描述了所創(chuàng)建的對(duì)象共同的屬性和方法。<
31、/p><p> C++是一種面向?qū)ο蟮木幊陶Z(yǔ)言,因此在局域網(wǎng)即時(shí)通信軟件中,我們采用面向?qū)ο蟮木幊谭椒?,將一些?duì)象封裝成為類。如Socket通信類,User用戶類等。</p><p> 通過(guò)使用類封裝技術(shù),可以提供模型化和信息隱藏的好處,同時(shí)還提供了可重用性的好處。使得代碼的利用率增強(qiáng),編程過(guò)程簡(jiǎn)化,后期更加易于維護(hù)。</p><p><b> 2.3
32、多線程技術(shù)</b></p><p> 多線程,是指從軟件或者硬件上實(shí)現(xiàn)多個(gè)線程迸發(fā)執(zhí)行的技術(shù)。具有多線程能力的計(jì)算機(jī)因有硬件支持而能夠在同一時(shí)間執(zhí)行多于一個(gè)線程,進(jìn)而提升整體處理性能。</p><p> 軟件多線程。即便處理器只能運(yùn)行一個(gè)線程,操作系統(tǒng)也可以通過(guò)快速的在不同線程之間進(jìn)行切換,由于時(shí)間間隔很小,來(lái)給用戶造成一種多個(gè)線程同時(shí)運(yùn)行的假象。這樣的程序運(yùn)行機(jī)制被稱為軟
33、件多線程。</p><p> 在局域網(wǎng)即時(shí)通信軟件中,我們需要同時(shí)監(jiān)聽用戶上下線,即時(shí)通信這兩方面的信息,因此需要通過(guò)多線程來(lái)實(shí)現(xiàn)。而我們采用的多線程技術(shù)就是軟件多線程技術(shù)。</p><p> 采用多線程技術(shù),可以更好地利用系統(tǒng)資源。其主要優(yōu)勢(shì)在于充分利用了CPU的空閑時(shí)間片,可以用盡可能少的時(shí)間來(lái)對(duì)用戶的要求做出響應(yīng),使得進(jìn)程的整體運(yùn)行效率得到較大提高,同時(shí)增強(qiáng)了應(yīng)用程序的靈活性。更
34、為重要的是,由于同一進(jìn)程的所有線程是共享同一內(nèi)存,所以不需要特殊的數(shù)據(jù)傳送機(jī)制,不需要建立共享存儲(chǔ)區(qū)或共享文件,從而使得不同任務(wù)之間的協(xié)調(diào)操作與運(yùn)行、數(shù)據(jù)的交互、資源的分配等問(wèn)題更加易于解決。</p><p> 2.4 WinSock技術(shù)</p><p> WinSock,即Windows Sockets API,是Windows下得到廣泛應(yīng)用的、開放的、支持多種協(xié)議的網(wǎng)絡(luò)編程接口。是
35、Windows 網(wǎng)絡(luò)軟件訪問(wèn)網(wǎng)絡(luò)服務(wù)的一種技術(shù)規(guī)范定義,特別是對(duì)TCP/IP的協(xié)議發(fā)訪問(wèn)。它定義TCP/IP窗口之間的標(biāo)準(zhǔn)接口 (如FTP 客戶端或web 瀏覽器) 的客戶端應(yīng)用程序和基礎(chǔ)的 TCP/IP協(xié)議棧。</p><p> 通信的基礎(chǔ)是套接口(Socket),一個(gè)套接口是通訊的一端。在這一端上你可以找到與其對(duì)應(yīng)的一個(gè)名字。一個(gè)正在被使用的套接口都有它的類型和與其相關(guān)的進(jìn)程。套接口存在于通訊域中。通訊域是
36、為了處理一般的線程通過(guò)套接口通訊而引進(jìn)的一種抽象概念。套接口通常和同一個(gè)域中的套接口交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時(shí)一定要執(zhí)行某種解釋程序)。Windows Sockets規(guī)范支持單一的通訊域,即Internet域。各種進(jìn)程使用這個(gè)域互相之間用Internet協(xié)議族來(lái)進(jìn)行通訊(Windows Sockets 1.1以上的版本支持其他的域,例如Windows Sockets 2)。套接口可以根據(jù)通訊性質(zhì)分類;這種性質(zhì)對(duì)于用戶是
37、可見的。應(yīng)用程序一般僅在同一類的套接口間通訊。不過(guò)只要底層的通訊協(xié)議允許,不同類型的套接口間也照樣可以通訊。用戶目前可以使用兩種套接口,即流套接口和數(shù)據(jù)報(bào)套接口。流套接口提供了雙向的,有序的,無(wú)重復(fù)并且無(wú)記錄邊界的數(shù)據(jù)流服務(wù)。數(shù)據(jù)報(bào)套接口支持雙向的數(shù)據(jù)流,但并不保證是可靠,有序,無(wú)重復(fù)的。也就是說(shuō),一個(gè)從數(shù)據(jù)報(bào)套接口接收信息的進(jìn)程有可能發(fā)現(xiàn)信息重復(fù)了,或者和發(fā)出時(shí)的順序不同。</p><p> Windows
38、Socket API 規(guī)范定義了兩個(gè)接口: API用于應(yīng)用程序開發(fā)人員和SPI,是提供給網(wǎng)絡(luò)軟件開發(fā)者向系統(tǒng)添加新協(xié)議模塊的一種手段。每個(gè)接口表示一個(gè)協(xié)議。API可以保證一個(gè)應(yīng)用程序?qū)κ褂谜f(xié)議執(zhí)行的任何網(wǎng)絡(luò)軟件供應(yīng)商保持一致性。</p><p> 本軟件采用UDP協(xié)議,結(jié)合WinSock網(wǎng)絡(luò)編程接口,實(shí)現(xiàn)通信及用戶上下線通知功能。</p><p> 2.5 CImageList圖像
39、列表技術(shù)</p><p> 有兩種類型的圖像列表(CImageList):非屏蔽的和屏蔽的。非屏蔽的圖像列表由包含一個(gè)或多個(gè)圖像的色位圖構(gòu)成。屏蔽的圖像列表由相同大小的兩個(gè)位圖構(gòu)成。第一個(gè)是包含圖像的色位圖,第二個(gè)是包含一系列屏蔽的單色位圖(一個(gè)屏蔽對(duì)應(yīng)第一個(gè)位圖中的一個(gè)圖像)。 </p><p> Create成員函數(shù)的一個(gè)重載創(chuàng)建一個(gè)標(biāo)志指示圖像列表是否是屏蔽的。(其他重載創(chuàng)建屏蔽
40、的圖像列表)。 </p><p> 繪制非屏蔽圖像時(shí),只是簡(jiǎn)單地將其復(fù)制到目標(biāo)DC。繪制屏蔽圖像時(shí),圖像位和屏蔽位組合,一般在位圖中產(chǎn)生顯露目標(biāo)DC背景色的透明區(qū)域。繪制屏蔽圖像時(shí)可以指定幾種繪圖樣式。例如,可以指定圖像進(jìn)行抖色處理以指示選定的對(duì)象。</p><p> 2.6 CStdioFile文件存儲(chǔ)技術(shù)</p><p> CFile的派生類CStdioF
41、ile提供了對(duì)文件進(jìn)行流式的操作功能。其中函數(shù)void CStdioFile::WriteString( LPCTSTR lpsz )寫入一個(gè)字符串,需要給字符串lpsz的末尾加上換行標(biāo)志”\r\n”;函數(shù)bool CStdioFile::ReadString(CString &rString )從文件中讀取一行,如果文件未讀完返回true,否則返回false
42、。</p><p><b> 系統(tǒng)需求分析</b></p><p><b> 3.1業(yè)務(wù)系統(tǒng)描述</b></p><p> 隨著個(gè)人電腦的普及,許多公司甚至家庭都擁有不止一臺(tái)電腦。而與此同時(shí),網(wǎng)絡(luò)用戶也日益增多。許多公司及家庭的局域網(wǎng)應(yīng)運(yùn)而生。在這樣的社會(huì)背景下,局域網(wǎng)即時(shí)通訊軟件的出現(xiàn),正解決了在局域網(wǎng)內(nèi)即時(shí)通信的
43、問(wèn)題。</p><p> 局域網(wǎng)即時(shí)通訊軟件可以實(shí)現(xiàn)即時(shí)顯示在線用戶的狀態(tài),且區(qū)別于國(guó)內(nèi)某知名IM軟件,占用內(nèi)存小,完全不影響系統(tǒng)的正常操作。在內(nèi)存控制方面極為苛刻,絕不會(huì)出現(xiàn)內(nèi)存泄漏等嚴(yán)重問(wèn)題。此外,無(wú)需搭建服務(wù)器,即可實(shí)現(xiàn)即時(shí)通信,信息準(zhǔn)確傳遞,絕無(wú)延時(shí)丟失。軟件搭建成本低,后期維護(hù)簡(jiǎn)單。還具備用戶信息及聊天記錄的存儲(chǔ)功能,保證了信息的持久性。</p><p> 3.2 系統(tǒng)存在的
44、主要問(wèn)題的分析</p><p> 局域網(wǎng)即時(shí)通訊軟件伴隨網(wǎng)絡(luò)技術(shù)的發(fā)展已經(jīng)得到了長(zhǎng)足的進(jìn)步,功能設(shè)計(jì)及實(shí)現(xiàn)上已經(jīng)比較完善。但是現(xiàn)行的一些系統(tǒng)仍舊存在一些問(wèn)題,歸納如下:</p><p> 功能過(guò)于單一,僅限于消息發(fā)送;</p><p> 系統(tǒng)設(shè)計(jì)仍不是最優(yōu)化,存在大量?jī)?nèi)存冗余;</p><p> 信息存儲(chǔ)加密方式過(guò)于簡(jiǎn)單,容易被破解,
45、造成信息泄漏。</p><p><b> 3.3解決方案</b></p><p> 根據(jù)對(duì)目前已有的局域網(wǎng)即時(shí)通訊軟件的了解,結(jié)合對(duì)此類應(yīng)用系統(tǒng)的研究和分析,新系統(tǒng)的設(shè)計(jì)應(yīng)具備以下幾方面的要求:</p><p> 1、新增語(yǔ)音通信及文件傳輸?shù)墓δ埽?lt;/p><p> 2、優(yōu)化內(nèi)存管理,清除空置無(wú)用內(nèi)存空間;<
46、;/p><p> 3、采用新的更復(fù)雜的加密算法,并采用dll文件存儲(chǔ)數(shù)據(jù),提升信息的安全性。</p><p><b> 3.4 功能分析</b></p><p> 局域網(wǎng)即時(shí)通信軟件主要完成對(duì)局域網(wǎng)即時(shí)通信的功能。</p><p> 本軟件的其他功能為:</p><p> 對(duì)首次登錄用戶,錄
47、入基本信息,包含用戶名及頭像,存儲(chǔ)于文件之中;</p><p> 點(diǎn)擊主窗口用戶頭像,即可彈出用戶信息設(shè)置對(duì)話框;</p><p> 點(diǎn)擊用戶信息設(shè)置對(duì)話框中的頭像,即可彈出更改頭像對(duì)話框,點(diǎn)擊相應(yīng)頭像,即可預(yù)覽顯示;</p><p> 軟件成功啟動(dòng),即時(shí)通知局域網(wǎng)用戶上線信息;</p><p> 軟件正常關(guān)閉,即時(shí)通知局域網(wǎng)用戶下線
48、信息;</p><p> 雙擊用戶頭像,彈出聊天窗口;</p><p> 接到聊天信息,若無(wú)顯示窗口,則自動(dòng)彈出新窗口,并將接收到的信息顯示在窗口上;</p><p> 聊天窗口點(diǎn)擊發(fā)送,即可發(fā)送消息,若內(nèi)容為空,則不可發(fā)送;</p><p> 每個(gè)用戶的所有聊天信息存儲(chǔ)于文件中,點(diǎn)擊右上角按鈕,展開擴(kuò)展窗口,顯示聊天記錄;</
49、p><p><b> 系統(tǒng)總體設(shè)計(jì)</b></p><p> 4.1 系統(tǒng)功能結(jié)構(gòu)</p><p> 針對(duì)軟件的功能設(shè)計(jì),系統(tǒng)將分成:</p><p> 1、視圖層,主導(dǎo)用戶各項(xiàng)可視化操作,主要體現(xiàn)在UI設(shè)計(jì),空間布局上;</p><p> 2、業(yè)務(wù)層,主導(dǎo)系統(tǒng)WinSock通信的各項(xiàng)監(jiān)聽及
50、發(fā)送工作,主要通過(guò)消息映射與線程函數(shù)實(shí)現(xiàn);</p><p> 3、持久層,主導(dǎo)系統(tǒng)數(shù)據(jù)存儲(chǔ),其中包括存儲(chǔ)聊天記錄,用戶資料等。</p><p> 4.2 系統(tǒng)框架圖與流程圖</p><p> 局域網(wǎng)即時(shí)通信軟件在系統(tǒng)框架設(shè)計(jì)方面,主要分為了三個(gè)主框架,一是用戶信息模塊,包含用戶上下線通知,資料的讀取修改存儲(chǔ)等;二是系統(tǒng)監(jiān)聽模塊,包含對(duì)用戶上下線消息與聊天請(qǐng)求消
51、息的監(jiān)聽;三是聊天通信模塊,其中包含用戶聊天信息的接收、發(fā)送及存儲(chǔ)三大功能。</p><p> 系統(tǒng)框架圖與流程圖如圖所示:</p><p><b> 框架圖</b></p><p><b> 流程圖</b></p><p> 4.3 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)</p><p>&
52、lt;b> 用戶資料設(shè)置對(duì)話框</b></p><p><b> 工程主類</b></p><p><b> 主對(duì)話框</b></p><p><b> 頭像設(shè)置對(duì)話框</b></p><p><b> 聊天窗口對(duì)話框</b>&
53、lt;/p><p><b> Socket通信類</b></p><p><b> 用戶信息類</b></p><p><b> 詳細(xì)設(shè)計(jì)與功能實(shí)現(xiàn)</b></p><p><b> 通信功能模塊介紹</b></p><p>&
54、lt;b> 系統(tǒng)監(jiān)聽模塊</b></p><p> 系統(tǒng)監(jiān)聽模塊包含了兩部分,一是用戶上下線監(jiān)聽功能,二是聊天請(qǐng)求的監(jiān)聽工作。</p><p> 上下線監(jiān)聽功能既是當(dāng)用戶上線時(shí),客戶端接收到用戶上線信息,即將其添加到用戶上線列表之中,同時(shí)想對(duì)方報(bào)告自己上線的消息。而當(dāng)用戶下線時(shí),客戶端接收到下線消息,即將其從在線列表中刪除。</p><p>
55、 聊天請(qǐng)求監(jiān)聽功能則是接收對(duì)方所發(fā)來(lái)的聊天請(qǐng)求,然后可以自動(dòng)彈出聊天窗體,以之開始聊天。</p><p><b> 聊天通信模塊</b></p><p> 聊天通信模塊包含了聊天信息的發(fā)送,接收,與記錄。其中聊天信息的記錄是由組內(nèi)另一成員完成的,這里就不贅言。</p><p> 聊天信息發(fā)送指的是點(diǎn)擊聊天窗口的發(fā)送按鈕,即將編輯框的內(nèi)容
56、發(fā)送至對(duì)方。</p><p> 而聊天信息的接收指的是但對(duì)方發(fā)來(lái)消息時(shí),他們需要將對(duì)方發(fā)送來(lái)的信息接收并顯示到窗體之中。</p><p><b> 通信功能模塊詳解</b></p><p> 系統(tǒng)監(jiān)聽模塊與聊天通信模塊是這個(gè)軟件最重要的部分,它保證了軟件聊天的即時(shí)性。應(yīng)該算是軟件的核心功能之一。接下來(lái),我將為大家講解其具體實(shí)現(xiàn)方式:<
57、;/p><p><b> 上下線監(jiān)聽</b></p><p> 做上下線功能,首先需要理清上下線通知需要包含什么信息。</p><p> 對(duì)于一個(gè)剛上線的用戶,他需要通知局域網(wǎng)內(nèi)的所有在線用戶我“上線了”,通知信息中包含本機(jī)的一些信息(包含頭像,用戶名,IP等)。而局域網(wǎng)的其他用戶在接收到該信息后,就需要將其用戶加入自己的在線用戶列表中,同時(shí)
58、反饋一條信息告知,我“早已上線”。</p><p> 這時(shí)問(wèn)題出現(xiàn)了,這兩條信息是通過(guò)同一端口通信的,那么我們?cè)撊绾螀^(qū)分這兩條信息呢?</p><p> 在這里,我們采用了一種很技巧的方法,我們給每條信息都加上一個(gè)加上一個(gè)標(biāo)識(shí)符flag,0表示上線,1表示反饋信息,2表示下線,如此就可以將其一一區(qū)分開了。</p><p> 因此,在上下線通知上需要包含標(biāo)識(shí)符、
59、頭像,用戶名,IP這幾個(gè)信息。我們采用一個(gè)結(jié)構(gòu)體來(lái)存儲(chǔ)這些信息:</p><p> struct Online</p><p><b> {</b></p><p> char IP[15];</p><p> char user[20];</p><p><b> int f
60、lag;</b></p><p> int bitmapID;</p><p> }All_user[255];</p><p> 在這里,我們還同時(shí)聲明了一個(gè)結(jié)構(gòu)體數(shù)組,用來(lái)存儲(chǔ)接收到的用戶信息。</p><p> 而上下線的監(jiān)聽線程,相關(guān)代碼如下:</p><p> /************
61、****************************************************/</p><p> /* 監(jiān)聽上下線線程 */</p><p> /*************************************************************
62、***/</p><p> UINT CIMDlg::LinOnlineThread(LPVOID p)</p><p><b> {</b></p><p> CIMDlg *pDlg=(CIMDlg *)p;</p><p> Online onlineMeg;</p><p> R
63、ecvOnline.InitWSAData();</p><p> RecvOnline.SetSock(6666,"0.0.0.0");</p><p> RecvOnline.InitRecvSock();</p><p> CString RecvIP,RecvUser,scmp;</p><p> int
64、flag,RecvBitID,i,UserNum;</p><p> while(TRUE)</p><p><b> {</b></p><p> RecvOnline.RecvMeg((char*)&onlineMeg,sizeof(onlineMeg));</p><p> flag=onlineM
65、eg.flag;</p><p> RecvIP=onlineMeg.IP;</p><p> RecvBitID=onlineMeg.bitmapID;</p><p> RecvUser=onlineMeg.user;</p><p> if (!strcmp(RecvIP,pDlg->m_strIP))</p>
66、<p><b> continue;</b></p><p> if (flag==2)</p><p><b> {</b></p><p> for(i=0;i<pDlg->m_ctrlOnlineList.GetItemCount();i++)</p><p>
67、;<b> {</b></p><p> scmp=pDlg->m_ctrlOnlineList.GetItemText(i,1);</p><p> if(!strcmp(RecvIP,scmp))</p><p><b> {</b></p><p> pDlg->m_c
68、trlOnlineList.DeleteItem(i);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }else{</b></p>
69、<p> if(flag==0)</p><p><b> { </b></p><p> Online SendOnlineMeg;</p><p> SendOnlineMeg.flag=1;</p><p> strcpy(SendOnlineMeg.user,pDlg->m_
70、strUser);</p><p> strcpy(SendOnlineMeg.IP,pDlg->m_strIP);</p><p> SendOnlineMeg.bitmapID=pDlg->m_iBitmapID;</p><p> SocketApp OnlineSock;</p><p> OnlineSock.I
71、nitWSAData();</p><p> OnlineSock.InitSendSock();</p><p> OnlineSock.SetSock(6666,RecvIP);</p><p> OnlineSock.SendMeg((char*)&SendOnlineMeg,sizeof(SendOnlineMeg));</p>
72、<p> OnlineSock.ClosSock();</p><p><b> }</b></p><p> m_bit.LoadBitmap(IDB_BITMAP01+RecvBitID);</p><p> img->Add(&m_bit,RGB(0,0,0));</p><p>
73、 m_bit.DeleteObject();</p><p> pDlg->m_ctrlOnlineList.SetItemText(pDlg->m_ctrlOnlineList.InsertItem(0,RecvUser),1,RecvIP);</p><p> pDlg->m_ctrlOnlineList.SetImageList(img,LVSIL_SMALL)
74、;</p><p> UserNum=atoi(RecvIP.Right(RecvIP.GetLength()-RecvIP.ReverseFind('.')-1))-1;</p><p> strcpy(All_user[UserNum].IP,RecvIP);</p><p> strcpy(All_user[UserNum].user,R
75、ecvUser);</p><p> All_user[UserNum].bitmapID=onlineMeg.bitmapID;</p><p> All_user[UserNum].flag=0;</p><p><b> }</b></p><p><b> }</b></p&g
76、t;<p> RecvOnline.ClosSock();</p><p><b> return 0;</b></p><p><b> }</b></p><p> 監(jiān)聽線程需要使用,一些對(duì)話框的資源,因此我們聲明了一個(gè)對(duì)話框的指針:</p><p> CIMDlg *p
77、Dlg=(CIMDlg *)p;</p><p> 然后我們聲明了一個(gè) Online類型的結(jié)構(gòu)體變量用于接收信息,和一個(gè)SocketApp類,啟動(dòng)監(jiān)聽端口6666。</p><p> 當(dāng)接收到信息后,則將結(jié)構(gòu)體的flag值提取出來(lái),做一個(gè)判斷。如果等于2的話,說(shuō)明所接收到的信息是下線信息,那么我們歷遍整個(gè)列表,找出所接收到的IP,然后將該行刪除。</p><p>
78、; 如果接收到的flag為0,那么則需要發(fā)送反饋信息,然后將接收到的IP加入列表控件之中:</p><p> Online SendOnlineMeg;</p><p> SendOnlineMeg.flag=1;</p><p> strcpy(SendOnlineMeg.user,pDlg->m_strUser);</p><p
79、> strcpy(SendOnlineMeg.IP,pDlg->m_strIP);</p><p> SendOnlineMeg.bitmapID=pDlg->m_iBitmapID;</p><p> SocketApp OnlineSock;</p><p> OnlineSock.InitWSAData();</p>&
80、lt;p> OnlineSock.InitSendSock();</p><p> OnlineSock.SetSock(6666,RecvIP);</p><p> OnlineSock.SendMeg((char*)&SendOnlineMeg,sizeof(SendOnlineMeg));</p><p> OnlineSock.Clos
81、Sock();</p><p> 如果接收到的flag為1,那么則直接跳過(guò)發(fā)送反饋信息,只做添加IP到列表控件的功能。</p><p><b> 聊天請(qǐng)求監(jiān)聽</b></p><p> 由于在功能設(shè)計(jì)上,我們?cè)O(shè)計(jì)其為當(dāng)用戶來(lái)消息時(shí),即彈出聊天窗口,因此,我們?cè)O(shè)計(jì)了這個(gè)聊天請(qǐng)求監(jiān)聽模塊。我們?cè)O(shè)計(jì)之中的聊天請(qǐng)求監(jiān)聽端口為8888。那么當(dāng)我們?cè)?/p>
82、線程中接收到用戶信息時(shí),我們需要彈出一個(gè)非模態(tài)對(duì)話框。但是,在線程中直接彈出非模態(tài)對(duì)話框會(huì)出現(xiàn)內(nèi)存錯(cuò)誤,最后導(dǎo)致程序意外關(guān)閉。</p><p> 因此,我們需要為程序創(chuàng)建一個(gè)新的消息映射,然后通過(guò)SendMessage來(lái)實(shí)現(xiàn)彈出非模態(tài)對(duì)話框的功能。</p><p> 首先,我們到對(duì)話框的頭文件IMDlg.h里,在//{{AFX_MSG(CIMDlg) 后加上:</p>
83、<p> afx_msg void OnCreateDlg(WPARAM,LPARAM);//消息函數(shù)聲明</p><p> afx_msg void OnDeleteDlg(WPARAM,LPARAM);</p><p> afx_msg void OnInitDlg(WPARAM,LPARAM);</p><p> 其中第一個(gè)為創(chuàng)建非模態(tài)對(duì)話框
84、消息映射聲明,第二個(gè)為銷毀非模態(tài)對(duì)話框消息映射聲明,第三個(gè)為初始化及顯示非模態(tài)對(duì)話框消息映射聲明。</p><p> 然后,我們進(jìn)入IMDlg.cpp文件中,找到</p><p> BEGIN_MESSAGE_MAP(CIMDlg, CDialog)</p><p><b> 在其后面加上:</b></p><p>
85、; ON_MESSAGE(UM_CREATE_DLG,OnCreateDlg)//消息映射</p><p> ON_MESSAGE(UM_DELETE_DLG,OnDeleteDlg)</p><p> ON_MESSAGE(UM_INIT_DLG,OnInitDlg)</p><p> 接著,定義消息函數(shù):</p><p> /*
86、***************************************************************/</p><p> /* 創(chuàng)建非模態(tài)對(duì)話框 */</p><p> /***************************************************
87、*************/</p><p> void CIMDlg::OnCreateDlg(WPARAM wParam,LPARAM lParam )</p><p><b> {</b></p><p> CMessageDlg* p=(CMessageDlg*)wParam; //CTransportInfoDlg為非模態(tài)對(duì)話
88、框類</p><p> p->Create(IDD_DIALOG_MESSAGE,this); //IDD_TRANSPORTINFO_DLG為非模態(tài)對(duì)話框資源ID</p><p><b> }</b></p><p> /******************************************************
89、**********/</p><p> /* 刪除非模態(tài)對(duì)話框 */</p><p> /****************************************************************/</p><p> void CIMDlg::OnD
90、eleteDlg(WPARAM wParam,LPARAM lParam )</p><p><b> {</b></p><p> CMessageDlg* p=(CMessageDlg*)wParam;</p><p> p->DestroyWindow();</p><p><b> p=N
91、ULL;</b></p><p><b> }</b></p><p> /****************************************************************/</p><p> /* 彈出非模態(tài)對(duì)話框
92、 */</p><p> /****************************************************************/</p><p> void CIMDlg::OnInitDlg(WPARAM wParam,LPARAM lParam) </p><p><b> {</b></p&
93、gt;<p> CMessageDlg* p=(CMessageDlg*)wParam; </p><p> p->ShowWindow(SW_SHOW); </p><p> p->MyInitDlg();</p><p><b> }</b></p><p> 如此,即可成功創(chuàng)建消
94、息映射。</p><p> 接著,我們創(chuàng)建線程函數(shù)LinDialogThread 用于監(jiān)聽聊天請(qǐng)求:</p><p> UINT CIMDlg::LinDialogThread(LPVOID p)</p><p><b> {</b></p><p> struct RecvMeg</p><
95、p><b> {</b></p><p> char IP[15];</p><p> char Meg[1024];</p><p><b> }RMeg;</b></p><p> CIMDlg *pParent=(CIMDlg *)p;</p><p>
96、 RecvDialog.InitWSAData();</p><p> RecvDialog.SetSock(8888,"0.0.0.0");</p><p> RecvDialog.InitRecvSock();</p><p> CString RMIP;</p><p> int UserNum,DlgNu
97、m=0;</p><p> CMessageDlg* theMegDlg[255];</p><p> while(TRUE)</p><p><b> {</b></p><p> RecvDialog.RecvMeg((char*)&RMeg,sizeof(RMeg));</p><
98、;p> RMIP=RMeg.IP;</p><p> UserNum=atoi(RMIP.Right(RMIP.GetLength()</p><p> -RMIP.ReverseFind('.')-1))-1;</p><p> if (theApp.b_DlgOpen[UserNum]!=true)</p><p
99、><b> {</b></p><p> CMessageDlg **MegDlg=&theMegDlg[UserNum];</p><p> *MegDlg=new CMessageDlg();</p><p> pParent->SendMessage(UM_CREATE_DLG,</p><
100、p> (WPARAM)*MegDlg);</p><p> RecvDialog.SaveChats(RMeg.IP,RMeg.Meg);</p><p> (*MegDlg)->m_strUser=All_user[UserNum].user;</p><p> (*MegDlg)->iBitmapID=All_user[UserNum]
101、.bitmapID;</p><p> (*MegDlg)->m_strUserIP=RMeg.IP;</p><p> (*MegDlg)->MyPro.bitmapID=pParent->m_iBitmapID;</p><p> (*MegDlg)->m_strTalk="";</p><p
102、> (*MegDlg)->m_strTalk=RMeg.Meg;</p><p> (*MegDlg)->m_iPort=atoi(pParent->m_strIP.Right(pParent-></p><p> m_strIP.GetLength()-pParent->m_strIP.ReverseFind('.')-1))+U
103、serNum+10000;</p><p> strcpy((*MegDlg)->MyPro.user,pParent->m_strUser);</p><p> strcpy((*MegDlg)->MyPro.IP,pParent->m_strIP);</p><p> pParent->SendMessage(UM_INIT_
104、DLG,(WPARAM)(*MegDlg));</p><p> theApp.b_DlgOpen[UserNum]=true;</p><p><b> }</b></p><p><b> }</b></p><p> RecvDialog.ClosSock();</p>
105、<p><b> return 0;</b></p><p><b> }</b></p><p> 為了防止非模態(tài)對(duì)話框被重用,我們定義了一個(gè)對(duì)話框指針數(shù)組,使用用戶IP尾進(jìn)行管理。另外,為了防止同個(gè)IP彈出多個(gè)對(duì)話框,我們創(chuàng)建了一個(gè)全局變量 bool b_DlgOpen[255]; 用于記錄對(duì)話框是否彈出。那么當(dāng)我們接收到消息
106、時(shí),首先將其IP尾提取出來(lái):</p><p> UserNum=atoi(RMIP.Right(RMIP.GetLength()-RMIP.ReverseFind('.')-1))-1;</p><p> 然后經(jīng)判斷后,對(duì)話框沒(méi)有彈出,即繼續(xù)執(zhí)行下面的語(yǔ)句:</p><p> CMessageDlg **MegDlg=&theMegDl
107、g[UserNum];</p><p> *MegDlg=new CMessageDlg();</p><p> pParent->SendMessage(UM_CREATE_DLG,(WPARAM)*MegDlg);</p><p> 創(chuàng)建一個(gè)CMessageDlg的對(duì)話框指針,然后SendMessage創(chuàng)建非模態(tài)對(duì)話框,接著把所有的用戶信息傳遞進(jìn)入C
108、MessageDlg對(duì)話框:</p><p> RecvDialog.SaveChats(RMeg.IP,RMeg.Meg);</p><p> (*MegDlg)->m_strUser=All_user[UserNum].user;</p><p> (*MegDlg)->iBitmapID=All_user[UserNum].bitmapID;
109、</p><p> (*MegDlg)->m_strUserIP=RMeg.IP;</p><p> (*MegDlg)->MyPro.bitmapID=pParent->m_iBitmapID;</p><p> (*MegDlg)->m_strTalk="";</p><p> (*Me
110、gDlg)->m_strTalk=RMeg.Meg;</p><p> (*MegDlg)->m_iPort=atoi(pParent->m_strIP.Right(pParent->m_strIP.GetLength()-pParent->m_strIP.ReverseFind('.')-1))+UserNum+10000;</p><p>
111、; strcpy((*MegDlg)->MyPro.user,pParent->m_strUser);</p><p> strcpy((*MegDlg)->MyPro.IP,pParent->m_strIP);</p><p> 然后,再初始化及顯示對(duì)話框即可:</p><p> pParent->SendMessage(UM
112、_INIT_DLG,(WPARAM)(*MegDlg));</p><p> 此外,還應(yīng)當(dāng)將對(duì)話框狀態(tài)設(shè)為彈出:</p><p> theApp.b_DlgOpen[UserNum]=true;</p><p><b> 聊天通信</b></p><p> 聊天通信模塊包含三個(gè)部分,聊天信息的記錄,聊天信息的接收
113、,聊天信息發(fā)送。其中聊天信息的記錄是由組內(nèi)其他成員完成的,這里便不再贅言。</p><p> 首先說(shuō)一下聊天信息的接收,在這里,我們會(huì)在聊天窗口啟動(dòng)時(shí)創(chuàng)建一個(gè)用于接收聊天信息的線程:</p><p> UINT CMessageDlg::LinMegThread(LPVOID p)</p><p><b> {</b></p>
114、<p> // TODO: 監(jiān)測(cè)接受聊天消息線程</p><p> CMessageDlg *pDlg=(CMessageDlg *)p;</p><p> struct RecvMeg</p><p><b> {</b></p><p> char IP[15];</p><
115、;p> char Meg[1024];</p><p><b> }RMeg;</b></p><p> RMegSock.InitWSAData();</p><p> RMegSock.SetSock(pDlg->m_iPort,"0.0.0.0");</p><p> RM
116、egSock.InitRecvSock();</p><p> CString R_Meg(""),H_Meg;</p><p> while(TRUE)</p><p><b> {</b></p><p> RMegSock.RecvMeg((char*)&RMeg,sizeof(
117、RMeg));</p><p> pDlg->m_ctrlTalk.GetWindowText(R_Meg);</p><p> pDlg->m_ctrlHistory.GetWindowText(H_Meg);</p><p> R_Meg=R_Meg+RMeg.Meg;</p><p> H_Meg=H_Meg+RMe
118、g.Meg;</p><p> RMegSock.SaveChats(pDlg->m_strUserIP,RMeg.Meg);</p><p> pDlg->m_ctrlTalk.SetWindowText(R_Meg);</p><p> pDlg->m_ctrlHistory.SetWindowText(H_Meg);</p>
119、<p><b> }</b></p><p> RMegSock.ClosSock();</p><p><b> return 0;</b></p><p><b> }</b></p><p> 聊天信息的接收線程并無(wú)什么特別之處,創(chuàng)建了一個(gè)用于接受
120、信息的SocketApp類對(duì)象即可。當(dāng)接收到信息時(shí),我們就將接收到的信息添加到聊天窗口和聊天記錄窗口上。</p><p> 但是,因?yàn)槊總€(gè)彈出的窗口都會(huì)創(chuàng)建一個(gè)接收線程,因此我們需要為每一個(gè)線程分配一個(gè)不同的端口號(hào),并且該端口號(hào)必須為對(duì)方聊天用戶所知。</p><p> 因此,我們約定了一個(gè)計(jì)算端口的規(guī)則:</p><p> 本機(jī)IP尾+對(duì)方IP尾+10000
121、=端口號(hào);</p><p><b> 具體代碼如下:</b></p><p> UserNum=atoi(RMIP.Right(RMIP.GetLength()-RMIP.ReverseFind('.')-1))-1;</p><p> (*MegDlg)->m_iPort=atoi(pParent->m_st
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于qt的局域網(wǎng)跨平臺(tái)即時(shí)通信軟件 畢業(yè)論文
- 畢業(yè)設(shè)計(jì)---局域網(wǎng)即時(shí)通信軟件設(shè)計(jì)
- 局域網(wǎng)即時(shí)通訊軟件設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 局域網(wǎng)即時(shí)通訊系統(tǒng)的實(shí)現(xiàn)畢業(yè)論文
- 局域網(wǎng)畢業(yè)論文---局域網(wǎng)聊天軟件
- 即時(shí)通信工具畢業(yè)論文
- 局域網(wǎng)小型局域網(wǎng)組建畢業(yè)論文
- 畢業(yè)論文--局域網(wǎng)(小型局域網(wǎng))組建
- 局域網(wǎng)畢業(yè)論文
- 局域網(wǎng)畢業(yè)論文
- 畢業(yè)設(shè)計(jì)---基于tcpudp協(xié)議的局域網(wǎng)即時(shí)通信工具的設(shè)計(jì)與實(shí)現(xiàn)
- 局域網(wǎng)組建畢業(yè)論文
- 無(wú)線局域網(wǎng)畢業(yè)論文
- 局域網(wǎng)安全畢業(yè)論文
- 校園局域網(wǎng)畢業(yè)論文
- bjdwoua局域網(wǎng)畢業(yè)論文
- 局域網(wǎng)即時(shí)聊天軟件設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文(附詳細(xì)源代碼)
- 無(wú)線局域網(wǎng)畢業(yè)論文
- 局域網(wǎng)組建畢業(yè)論文
- 基于Android平臺(tái)的局域網(wǎng)即時(shí)通信系統(tǒng)研究與實(shí)現(xiàn).pdf
評(píng)論
0/150
提交評(píng)論