




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、延邊大學(xué)本科畢業(yè)論文局域網(wǎng)信息發(fā)布程序的設(shè)計(jì)與實(shí)現(xiàn)作 者 院 系 理工學(xué)院 計(jì)算機(jī)系 專 業(yè) 科學(xué)與技術(shù)專業(yè) 年 級(jí) 2001級(jí) 學(xué) 號(hào) 指導(dǎo)教師 職 稱 講師 答辯日期 2005年6月11日 目 錄摘要.3英文摘要.4一、緒論.5(一)背景介紹.5(二)相關(guān)知識(shí).5二、需求分析.9(一) 可行性分析:.9(二) 系統(tǒng)綜合要求: .9(三) 系統(tǒng)數(shù)據(jù)要求: .10三、總體設(shè)計(jì).12(一) 層次圖.12(二) 系統(tǒng)構(gòu)架圖.13(三) ipo圖.14四、詳細(xì)設(shè)計(jì).16(一) 服務(wù)器端設(shè)計(jì)方案 .16(二) 模塊流程圖.17(三) 數(shù)據(jù)庫設(shè)計(jì).20(四) 共享數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì).20五、關(guān)鍵代碼分析.22
2、(一) 編碼規(guī)則.22(二) 多進(jìn)程編程 .22(三) 多線程技術(shù).23(四) 主要設(shè)計(jì)源代碼介紹.23六、測(cè)試.31(一) 測(cè)試的目標(biāo)和方法.31(二) 軟件測(cè)試情況.31(三) 界面與功能測(cè)試情況.32七、總結(jié).35參考文獻(xiàn).36摘 要本次畢業(yè)設(shè)計(jì)的題目是局域網(wǎng)信息發(fā)布程序的實(shí)現(xiàn),是采用redhat linux 作為開發(fā)平臺(tái),以mysql為數(shù)據(jù)載體,以vc語言為主要開發(fā)語言的一套包括發(fā)送消息及附件為主,并提供及時(shí)聊天功能的一個(gè)綜合性軟件。主要的功能是基于tcp/ip網(wǎng)絡(luò)通信技術(shù)實(shí)現(xiàn)了面向連接的用戶與服務(wù)器間點(diǎn)對(duì)點(diǎn)的通信傳輸功能,并且應(yīng)用了多線程以及共享數(shù)據(jù)結(jié)構(gòu)技術(shù),使網(wǎng)絡(luò)服務(wù)器具有了多用戶
3、數(shù)據(jù)轉(zhuǎn)發(fā)的功能,進(jìn)而解決了局域網(wǎng)多用戶間的信息發(fā)送的問題。在客戶端,用戶通過注冊(cè)/登陸機(jī)制進(jìn)行身份驗(yàn)證并通過通信服務(wù)器轉(zhuǎn)發(fā)信息以及附件。對(duì)于一般采用tcp/ip協(xié)議的應(yīng)用程序只實(shí)現(xiàn)了單用戶與服務(wù)器間點(diǎn)對(duì)點(diǎn)的連接,而本文在vc6.0的環(huán)境下,運(yùn)用了多線程以及共享數(shù)據(jù)結(jié)構(gòu)技術(shù),不僅實(shí)現(xiàn)了多用戶與服務(wù)器間的連接,而且解決了多用戶間信息交換問題。關(guān)鍵詞: linux mysql socket 多線程 共享數(shù)據(jù)結(jié)構(gòu) 信息發(fā)送abstractthis graduate design is called ”information of lan transmissions achieve” it i
4、s a compositive software including chat and file transfers which takes redhat linux 9.0 as the develop platform, mysql as a data carrier and use vc as the main programme language. the function includes: according to the tcp/ip network communicated technique achieve face to connect user and server po
5、int to point data transfer. and it apply multi-thread and data share technique. it use network server have more users data transmit function. resolve communication of more users of lan. on client, the users use login server enter the personnal interface, make use of communication server transfer dat
6、a and file. about commonly tcp/ip protocols application only achieve connect toone user and server . but in this article we use vc6.0, use multi-thread and share data technique not only achieve connect to more users and server but also more userss communication. key words: linux mysql socket multi-t
7、hread share data structure send message一、 緒 論(一)背景介紹由于因特網(wǎng)的迅速流行,越來越多的應(yīng)用程序具備了在網(wǎng)上與其它程序通信的能力。從win95開始微軟把網(wǎng)絡(luò)功能融進(jìn)了它的操作系統(tǒng),使得應(yīng)用程序網(wǎng)絡(luò)通信能力更為普及。因此,微軟的tcp/ip協(xié)議也就成為網(wǎng)絡(luò)應(yīng)用程序基于的首選協(xié)議。一般采用tcp/ip協(xié)議的應(yīng)用程序只實(shí)現(xiàn)了單用戶與服務(wù)器間點(diǎn)對(duì)點(diǎn)的連接,而我所選擇的題目則是應(yīng)用多線程及共享數(shù)據(jù)結(jié)構(gòu)技術(shù),不僅實(shí)現(xiàn)了多用戶與服務(wù)器間的連接,而且解決了多用戶間信息交換問題。所以說開發(fā)的這個(gè)軟件應(yīng)該是一個(gè)比較實(shí)用的,功能比較強(qiáng)大的軟件。它的主要功能是基于tcp
8、/ip網(wǎng)絡(luò)通信技術(shù)實(shí)現(xiàn)了面向連接的用戶與服務(wù)器間點(diǎn)對(duì)點(diǎn)的通信傳輸功能,一套包括發(fā)送消息及附件為主,并提供及時(shí)聊天功能的一個(gè)綜合性軟件。它的開發(fā)環(huán)境是以redhat linux作為開發(fā)平臺(tái),以mysql為數(shù)據(jù)載體,以vc語言為主要開發(fā)語言的一個(gè)軟件。在這次代碼的編寫中我們主要研究的是網(wǎng)絡(luò)通信方面的知識(shí)1。(二)相關(guān)知識(shí)1、linux的特性及其優(yōu)點(diǎn)linux操作系統(tǒng)核心最早源于芬蘭赫爾辛基大學(xué)一名學(xué)生linus torvalds的天才想法,后來經(jīng)過眾多世界頂尖的軟件工程師的不斷修改和完善,linux得以在全球普及開來,在服務(wù)器及個(gè)人桌面領(lǐng)域得到越來越多的應(yīng)用,在嵌入式開發(fā)方面更是具有其它操作系統(tǒng)無
9、可比擬的優(yōu)勢(shì),并以每年100%的用戶遞增數(shù)量顯示了linux強(qiáng)大的力量,成為unix世界的一朵奇葩。linux是一套免費(fèi)的32位多用戶多任務(wù)的操作系統(tǒng),其穩(wěn)定性、多任務(wù)能力與網(wǎng)絡(luò)功能已是許多商業(yè)操作系統(tǒng)無法比擬的,linux還有一項(xiàng)最大的特色在于源代碼完全公開,在符合gnu gpl(general public license)的原則下,任何人皆可自由取得、散布、甚至修改源代碼。 linux還具有以下特點(diǎn):1)采用階層式目錄結(jié)構(gòu),文件歸類清楚、容易管理;2)支持多種文件系統(tǒng);3)具備高度移植性;4)可與其它的操作系統(tǒng)并存于同一臺(tái)計(jì)算機(jī)上。linux的優(yōu)點(diǎn)也有很多,如下:1)低廉的附加費(fèi)用;2)
10、根據(jù)您的需求靈活定制;3)從許可證的限制中解脫;4)穩(wěn)定性;5)高性能;6)標(biāo)準(zhǔn)兼容性。2 、 數(shù)據(jù)庫(mysql)及其特點(diǎn)隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,計(jì)算機(jī)用于管理的規(guī)模越來越大,應(yīng)用越來越廣泛,數(shù)據(jù)量急劇增長,傳統(tǒng)的數(shù)據(jù)管理方式(人工管理、文件系統(tǒng)方式)已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足人們的要求,數(shù)據(jù)庫技術(shù)便應(yīng)運(yùn)而生,出現(xiàn)了統(tǒng)一管理數(shù)據(jù)的專門軟件系統(tǒng)數(shù)據(jù)庫管理系統(tǒng)。數(shù)據(jù)庫系統(tǒng)由于其數(shù)據(jù)結(jié)構(gòu)化、共享性高、冗余度低、易擴(kuò)充,數(shù)據(jù)獨(dú)立性高等優(yōu)點(diǎn),在各個(gè)領(lǐng)域得到了廣泛的應(yīng)用4。mysql是一個(gè)真正的多用戶、多線程的sql數(shù)據(jù)庫,是一個(gè)客戶機(jī)/服務(wù)器結(jié)構(gòu)的應(yīng)用,它由一個(gè)服務(wù)器守護(hù)程序mysql同的客戶程序和庫組成。m
11、ysql的主要目標(biāo)是快速、健壯和易用。mysql具有以下功能特點(diǎn):l 可以同時(shí)處理幾乎不限數(shù)量的用戶;l 處理多達(dá)50,000,000以上的記錄;l 命令執(zhí)行速度快,也許是現(xiàn)今最快的;l 用戶名和口令獨(dú)立于/etc/passwd。這便于cgi的使用;l 使用核心線程的完全多線程支持,這意味著它能利用多cpu;l 支持多種語言開發(fā),例如c c+ java php;l 支持多字節(jié)類型,包括1 2 3 4 8字節(jié)長度的有符號(hào)、無符號(hào)整數(shù);l 全面支持sql。3、 vc簡介3.1、 vc的特性雖然vc比較難學(xué),盡管也是visual的,但很多地方需要手工編寫代碼,但其開發(fā)后生成的程序質(zhì)量比較高。vc編譯
12、后的速度較快,不需要龐大的運(yùn)行時(shí)間庫支持,軟件發(fā)行也不是困難;而且底層調(diào)用手段較多,適合開發(fā)硬件操作多、速度要求高的場(chǎng)合,比如編寫硬件驅(qū)動(dòng)程序等等。3.2、 vc+與網(wǎng)絡(luò)編程vc+對(duì)網(wǎng)絡(luò)編程的支持有socket支持,wininet支持,mapi和isapi支持等。其中,windows sockets api是tcp/ip網(wǎng)絡(luò)環(huán)境里,也是internet上進(jìn)行開發(fā)最為通用的api。在tcp/ip網(wǎng)絡(luò)通信環(huán)境下,socket數(shù)據(jù)傳輸是一種特殊的i/o,它也相當(dāng)于一種文件描述符,具有一個(gè)類似于打開文件的函數(shù)調(diào)用-socket()。可以這樣理解:socket實(shí)際上是一個(gè)通信端點(diǎn),通過它,用戶的sock
13、et程序可以通過網(wǎng)絡(luò)和其他的socket應(yīng)用程序通信。socket存在于一個(gè)"通信域"里,并且與另一個(gè)域的socket交換數(shù)據(jù)。socket有三類。第一種是sock_stream(流式),提供面向連接的可靠的通信服務(wù),比如telnet,http。第二種是sock_dgram(數(shù)據(jù)報(bào)),提供無連接不可靠的通信,比如udp。第三種是sock_raw(原始),主要用于協(xié)議的開發(fā)和測(cè)試,支持通信底層操作3。4、數(shù)據(jù)通信的種類4.1、tcp/ip(傳輸控制協(xié)議)它是由socket類實(shí)現(xiàn),并且它提供的是一種可靠的、面向連接的數(shù)據(jù)傳輸方式,不管是對(duì)單個(gè)的數(shù)據(jù)報(bào)還是對(duì)數(shù)據(jù)包,流式套接字都提
14、供了一種流式數(shù)據(jù)傳輸。tcp接收傳輸協(xié)議數(shù)據(jù)包并把它們傳遞到表示層。并把信息分解成數(shù)據(jù)包(datagrams) 并在接收端重新組裝起來。它還對(duì)丟失的數(shù)據(jù)包進(jìn)行重新傳輸?shù)恼?qǐng)求5。4.2、udp(用戶數(shù)據(jù)報(bào)協(xié)議)由datagramsocket類實(shí)現(xiàn)數(shù)據(jù)報(bào)套接字,它提供的是一種不可靠的非連接的數(shù)據(jù)包通信方式,不可靠的意思是發(fā)送一個(gè)數(shù)據(jù)包不能保證被接收方接收,也不保證數(shù)據(jù)包按照發(fā)送順序到達(dá)接收方,雖然它使你的應(yīng)用程序更有效率,但只有在你的應(yīng)用程序并不是立即交流大量數(shù)據(jù)并且不需要組裝大量的數(shù)據(jù)報(bào)而完成一條消息的時(shí)候才使用5?;谏厦鎯煞N方法的比較,我選擇的是tcp/ip協(xié)議作為這次開發(fā)的協(xié)議,用他來控制
15、傳輸數(shù)據(jù)。5、 小組分工在局域網(wǎng)信息發(fā)布程序的設(shè)計(jì)與實(shí)現(xiàn)中本人負(fù)責(zé)服務(wù)器部分的代碼設(shè)計(jì)與編寫。二、需求分析(一) 可行性分析可行性分析的目的是為了用最小代價(jià)在最短時(shí)間內(nèi)確定問題是否能夠解決??尚行苑治龅膶?shí)質(zhì)就是要進(jìn)行一次壓縮簡化系統(tǒng)分析和設(shè)計(jì)的過程,也就是在較高層次上以較抽象的方式進(jìn)行的系統(tǒng)分析和設(shè)計(jì)的過程1。(1)技術(shù)可行性:這個(gè)軟件通用,可行。(2)經(jīng)濟(jì)可行性:這個(gè)軟件的經(jīng)濟(jì)效益會(huì)遠(yuǎn)大于開發(fā)成本,可行。(3)操作可行性:linux系統(tǒng)/windows系統(tǒng)和mysql為大家所熟知,比較易于操作,這個(gè)軟件也易于使用,可行。(二) 系統(tǒng)綜合要求需求分析的基本任務(wù)是準(zhǔn)確的回答“系統(tǒng)必須做什么?”1
16、這個(gè)問題。這一階段是對(duì)系統(tǒng)認(rèn)識(shí)最為全面、準(zhǔn)確、清晰、得體的一個(gè)比較關(guān)鍵的時(shí)期。需求分析的結(jié)果是系統(tǒng)開發(fā)的基礎(chǔ),關(guān)系到工程的成敗和軟件產(chǎn)品的質(zhì)量。因此,必須用行之有效的方法對(duì)軟件需求進(jìn)行嚴(yán)格的審查驗(yàn)證,為下一步的總體設(shè)計(jì)打好基礎(chǔ)。2.1 、系統(tǒng)功能要求需求分析的基本任務(wù)是準(zhǔn)確的回答“系統(tǒng)必須做什么?” 功能:1) 注冊(cè)會(huì)員于登錄服務(wù)器,并把相關(guān)會(huì)員信息寫入數(shù)據(jù)庫中,在登陸時(shí)要進(jìn)行身份驗(yàn)證。2) 建立多用戶間的通信連接。3) 用戶間消息和文件的傳送和接收。4) 附件與文字同時(shí)發(fā)送。2.2、 系統(tǒng)性能要求時(shí)間性能要求:在實(shí)際應(yīng)用中可能需要多用戶間信息互發(fā)的問題,客戶端的大量頻繁的訪問,服務(wù)器響應(yīng)時(shí)間
17、應(yīng)該盡可能縮短,對(duì)于有特殊需求的應(yīng)用,還要求達(dá)到實(shí)時(shí)響應(yīng)。存儲(chǔ)性能要求:根據(jù)應(yīng)用中的實(shí)際情況配置適當(dāng)容量的存儲(chǔ)設(shè)備。穩(wěn)定性安全性要求:要求軟件盡可能的穩(wěn)定,對(duì)于一般的應(yīng)用系統(tǒng),對(duì)安全性要求不高,對(duì)于特殊的應(yīng)用,還需要在安全性方面加以保證,所以要相應(yīng)提高服務(wù)器端的配置。2.3、 系統(tǒng)運(yùn)行要求服務(wù)器端: linux系統(tǒng)和mysql服務(wù)器。server:用于接收/轉(zhuǎn)發(fā)數(shù)據(jù),連接數(shù)據(jù)庫及應(yīng)用程序??蛻舳? 多個(gè)pc機(jī),通信用,作為數(shù)據(jù)發(fā)生器。2.4、 將來可能提出的要求在實(shí)際應(yīng)用中,用戶的要求隨時(shí)可能發(fā)生變化,如需要更改數(shù)據(jù)庫信息,改變通信參數(shù),增加訪問量以及需要提高系統(tǒng)的性能要求等等。為了減少軟件改
18、寫的難度,提高軟件的可維護(hù)性,在設(shè)計(jì)時(shí)要考慮到以上的種種可能性,提高程序的可讀性和易擴(kuò)充性。(三) 系統(tǒng)數(shù)據(jù)要求數(shù)據(jù)流圖是描繪系統(tǒng)的邏輯模型,描繪信息在系統(tǒng)中流動(dòng)和處理的情況。數(shù)據(jù)流圖是邏輯系統(tǒng)的圖形表示,非常容易理解,所以是極好的通信工具,同時(shí),設(shè)計(jì)數(shù)據(jù)流圖只需要考慮系統(tǒng)必須完成的基本邏輯功能,完全不需要考慮如何具體地實(shí)現(xiàn)這些功能,所以它也是軟件設(shè)計(jì)的很好的出發(fā)點(diǎn)1。下面是我們?cè)O(shè)計(jì)的數(shù)據(jù)流圖: 圖2-1數(shù)據(jù)流圖因?yàn)閿?shù)據(jù)流圖是描繪信息在系統(tǒng)中流動(dòng)和處理的情況,所以首先說明一下這個(gè)數(shù)據(jù)流圖的作用:局域網(wǎng)信息發(fā)布的起點(diǎn)與終點(diǎn)都是用戶自己本身,也就是發(fā)起者與接收者都是用戶自己。進(jìn)入我們的程序后,首先
19、用戶要自己判斷是這冊(cè)用戶還是登錄用戶,想成為會(huì)員首先就要注冊(cè)成為會(huì)員,這樣就進(jìn)入了注冊(cè)信息這個(gè)階段,填寫注冊(cè)用戶的基本信息,詳細(xì)信息。判斷該信息是否有人注冊(cè),如果注冊(cè)信息成功,則把用戶的注冊(cè)信息寫入在數(shù)據(jù)庫中,也就是更新我們的數(shù)據(jù)庫信息并保存數(shù)據(jù),反饋給用戶注冊(cè)成功的信息,用戶就進(jìn)入登錄界面進(jìn)行登錄,進(jìn)入到客戶端后,用戶可根據(jù)相應(yīng)的要求發(fā)送信息、附件等給用戶。并且這些信息與附件相應(yīng)的通過通信服務(wù)器轉(zhuǎn)發(fā),并保存2。上面就是這個(gè)數(shù)據(jù)流圖的過程,用戶與用戶之間的聯(lián)系,用戶與服務(wù)器的聯(lián)系,都表現(xiàn)了出來。三、 總體設(shè)計(jì)經(jīng)過了需求分析階段的工作,系統(tǒng)必須“做什么”的問題已經(jīng)清楚了,現(xiàn)在是決定“怎么做”的時(shí)
20、候了??傮w設(shè)計(jì)的基本目的就是回答“概括得說,系統(tǒng)應(yīng)該如何實(shí)現(xiàn)?”這個(gè)問題,因此,總體設(shè)計(jì)又稱為概要設(shè)計(jì)或初步設(shè)計(jì)。通過這個(gè)階段的工作,將劃分出組成系統(tǒng)的各個(gè)物理要素程序、文件、數(shù)據(jù)庫、人工過程和文檔等等,但是每個(gè)物理元素仍然處于黑盒子級(jí),這些黑盒子里的具體內(nèi)容將在以后進(jìn)行詳細(xì)設(shè)計(jì)。總體設(shè)計(jì)階段的另一項(xiàng)重要任務(wù)是設(shè)計(jì)軟件的結(jié)構(gòu),也就是要確定系統(tǒng)中每個(gè)程序是由哪些模塊組成的,以及這些模塊相互間的關(guān)系1。(一)層次圖層次圖用來描繪軟件的層次結(jié)構(gòu),通過它我們可以更清晰的看到軟件的模塊組成情況。根據(jù)我們這個(gè)題目的設(shè)計(jì),我們相應(yīng)的把設(shè)計(jì)劃分成下面幾個(gè)大的模塊5。一個(gè)模塊是注冊(cè)登錄服務(wù)器,它包括用戶注冊(cè)、登
21、錄以及數(shù)據(jù)庫管理這三個(gè)功能,啟動(dòng)注冊(cè)登錄服務(wù)器,判斷用戶是注冊(cè)還是登錄,注冊(cè)則進(jìn)入注冊(cè)部分,并保存數(shù)據(jù)于數(shù)據(jù)庫中,登錄則直接從數(shù)據(jù)庫調(diào)出數(shù)據(jù),登錄進(jìn)入客戶端通信。另一個(gè)模塊是通信服務(wù)器模塊,它負(fù)責(zé)完成數(shù)據(jù)轉(zhuǎn)發(fā)以及共享數(shù)據(jù)結(jié)構(gòu)的管理;主要是用戶之間信息發(fā)送的轉(zhuǎn)發(fā)問題,服務(wù)器接收到用戶端發(fā)來的消息后,提取消息的一部分與共享數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的內(nèi)容進(jìn)行比較,確定所要轉(zhuǎn)發(fā)的對(duì)象,最后通過多線程及其通信機(jī)制完成數(shù)據(jù)轉(zhuǎn)發(fā)??蛻舳诉@個(gè)模塊,它的主要功能就是用戶的注冊(cè),登陸,信息發(fā)送與附件的發(fā)送。數(shù)據(jù)庫模塊,它記錄了用戶注冊(cè)的基本信息,詳細(xì)信息,并通過它來反饋給注冊(cè)登陸服務(wù)器,驗(yàn)證用戶是否已經(jīng)注冊(cè),以及提取正確的信
22、息;還有就是保存了用戶間發(fā)送的信息與附件。局域網(wǎng)信息發(fā)布系統(tǒng) 注冊(cè)/登陸服務(wù)器模塊模塊客戶端通信服務(wù)器模塊數(shù)據(jù)庫模塊登陸用戶注冊(cè)數(shù)據(jù)庫管理登陸注冊(cè)發(fā)送信息數(shù)據(jù)轉(zhuǎn)發(fā)用戶信息共享數(shù)據(jù)圖3-1層次圖(二) 系統(tǒng)構(gòu)架圖系統(tǒng)構(gòu)架圖是整個(gè)程序的關(guān)鍵所在,也是整個(gè)程序的靈魂,我們的設(shè)計(jì)就是按照這個(gè)整個(gè)的系統(tǒng)構(gòu)架圖所做的,它有著很重要的作用6。下面這個(gè)就是我們?cè)O(shè)計(jì)的系統(tǒng)構(gòu)架圖:圖3-2系統(tǒng)構(gòu)架圖用戶進(jìn)入程序后,啟動(dòng)注冊(cè)/登錄服務(wù)器,注冊(cè)/登陸服務(wù)器接收到用戶端的信息后,首先判斷是注冊(cè)信息還是登陸信息;應(yīng)為用戶首先必須要注冊(cè)才能使用這個(gè)軟件,所以啟動(dòng)注冊(cè)界面,進(jìn)入注冊(cè)界面后,填寫用戶的基本信息,詳細(xì)信息,通過注
23、冊(cè)登錄服務(wù)器把數(shù)據(jù)傳給數(shù)據(jù)庫,如果注冊(cè)成功則把數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫中,如果注冊(cè)不成功則給用戶返回失敗的消息框(期間有任何異常產(chǎn)生,服務(wù)器都會(huì)返回注冊(cè)失敗消息,提示用戶重新注冊(cè)),數(shù)據(jù)庫要判斷用戶注冊(cè)信息是否重復(fù)、是否符合標(biāo)準(zhǔn),如成功,數(shù)據(jù)庫更新數(shù)據(jù)庫的內(nèi)容并反饋給用戶注冊(cè)成功的消息,這樣用戶就可以根據(jù)剛才注冊(cè)的信息到登錄界面登陸進(jìn)入到客戶端的主界面,通過主界面用戶可以通過通信服務(wù)器給相應(yīng)的用戶發(fā)送信息與附件。用戶的信息發(fā)送是通信服務(wù)期通過訪問共享數(shù)據(jù)結(jié)構(gòu),由共享數(shù)據(jù)結(jié)構(gòu)控制轉(zhuǎn)發(fā)用戶所發(fā)的信息。(三) ipo圖ipo圖是輸入/處理/輸出圖的簡稱,它是美國ibm公司發(fā)展完善起來的一種圖形工具,能夠方便
24、地描繪輸入數(shù)據(jù)、對(duì)數(shù)據(jù)的處理和輸出數(shù)據(jù)的關(guān)系,有了它,模塊間的相互關(guān)系就顯而易見了1。輸入 處理 輸出 圖3-3 ipo圖就是輸入用戶注冊(cè)信息,發(fā)送的信息與附件,登錄信息等,寫入數(shù)據(jù)庫中,初始化數(shù)據(jù)與網(wǎng)絡(luò)后,即初始化響應(yīng)后,判斷注冊(cè)或登錄,如信息發(fā)送則通過通信服務(wù)器轉(zhuǎn)發(fā)用戶發(fā)送的信息或附件,保存進(jìn)入數(shù)據(jù)庫中。四、詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì)階段的根本任務(wù)是確定應(yīng)該怎樣具體地實(shí)現(xiàn)所要求的系統(tǒng),也就是說,經(jīng)過這個(gè)階段的設(shè)計(jì)工作,應(yīng)該得出對(duì)目標(biāo)系統(tǒng)的精確描述,從而在編碼階段可以把這個(gè)描述直接翻譯成用某種程序設(shè)計(jì)語言書寫的程序1。詳細(xì)設(shè)計(jì)階段的任務(wù)還不是具體的編寫程序,而是要設(shè)計(jì)出程序的“藍(lán)圖”,以后程序員將根據(jù)
25、這個(gè)藍(lán)圖寫出實(shí)際的程序代碼。因此,詳細(xì)設(shè)計(jì)的結(jié)果基本上決定了最終的程序代碼的質(zhì)量??紤]程序代碼的質(zhì)量時(shí)必須注意,程序的“讀者”有兩個(gè)程序的維護(hù)者和普通用戶。在軟件的生命周期中,詳細(xì)設(shè)計(jì)方案、診斷程序錯(cuò)誤、修改和改進(jìn)程序等等都必須能夠讀懂程序。實(shí)際上對(duì)于長期使用的軟件系統(tǒng)來說,讀程序的時(shí)間往往要比改寫程序的時(shí)間還要長很多。因此衡量程序的質(zhì)量,不僅要看它的邏輯是否正確、性能是否滿足要求,更主要的是要看它是否容易閱讀和理解。詳細(xì)設(shè)計(jì)的目標(biāo)不僅僅是在邏輯上能正確地反映每個(gè)模塊的功能,更重要的是設(shè)計(jì)出的處理過程應(yīng)該盡可能簡潔明了。結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)是實(shí)現(xiàn)上述目標(biāo)的關(guān)鍵技術(shù),是詳細(xì)設(shè)計(jì)的邏輯基礎(chǔ)。(一)服
26、務(wù)器端設(shè)計(jì)方案1 、注冊(cè)登錄服務(wù)器設(shè)計(jì)首先注冊(cè)登陸服務(wù)器負(fù)責(zé)的是用戶的注冊(cè)、登陸以及數(shù)據(jù)庫的管理。注冊(cè)/登陸服務(wù)器啟動(dòng),接收到用戶端的信息后,首先得判斷是注冊(cè)信息還是登陸信息。如果是注冊(cè)信息,則將該數(shù)據(jù)按預(yù)定的格式寫入數(shù)據(jù)庫,然后返回注冊(cè)成功的消息,期間有任何異常產(chǎn)生,服務(wù)器都會(huì)返回注冊(cè)失敗消息,提示用戶重新注冊(cè);如果是登陸信息,則從數(shù)據(jù)中提取用戶名和id與數(shù)據(jù)庫中的內(nèi)容進(jìn)行比較,如果該用戶存在,則返回登陸成功消息,反之,返回登陸失敗消息。注冊(cè)登錄服務(wù)器采用面向連接的并發(fā)式方式,服務(wù)器設(shè)計(jì)成為一個(gè)對(duì)話框程序。初始化動(dòng)態(tài)庫,創(chuàng)建套接字,綁定本地ip地址和端口,并使套接字進(jìn)入偵聽,由于可能產(chǎn)生阻塞
27、,所以不宜在主線程中調(diào)用該函數(shù),因而在初始化網(wǎng)絡(luò)后當(dāng)用戶按下“運(yùn)行注冊(cè)登錄服務(wù)器”按鈕后,利用偵聽套接字啟動(dòng)注冊(cè)登錄線程進(jìn)入無限循環(huán),在線程中調(diào)用接收函數(shù),用來接受來自客戶端的連接請(qǐng)求,每當(dāng)一個(gè)連接請(qǐng)求到來時(shí),都會(huì)產(chǎn)生一個(gè)新的套接字,利用這個(gè)套接字產(chǎn)生一個(gè)新的線程與客戶端進(jìn)行通信并讀寫數(shù)據(jù)庫,通信完畢后關(guān)閉該套接字和線程,原來的偵聽套接字繼續(xù)處于偵聽狀態(tài)。2 、通信服務(wù)器設(shè)計(jì)聊天通信服務(wù)器設(shè)計(jì)為無界面的進(jìn)程(創(chuàng)建時(shí)先建一個(gè)基于對(duì)話框的應(yīng)用程序,然后把對(duì)話框類刪除,把a(bǔ)pp類里面與對(duì)話框有關(guān)的語句全刪除即可創(chuàng)建無界面進(jìn)程),采用共享數(shù)據(jù)結(jié)構(gòu),為每個(gè)客戶端創(chuàng)建兩個(gè)線程,實(shí)現(xiàn)接收和轉(zhuǎn)發(fā)的功能。運(yùn)用共
28、享數(shù)據(jù)結(jié)構(gòu)技術(shù)及多線程技術(shù),通過i/o端口與用戶端連接,實(shí)現(xiàn)了數(shù)據(jù)轉(zhuǎn)發(fā)功能。首先,程序初始化網(wǎng)絡(luò),接著當(dāng)用戶連接到服務(wù)器時(shí),創(chuàng)建接收線程和發(fā)送線程,這樣就可以實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)。最后,當(dāng)用戶斷開連接時(shí),服務(wù)器關(guān)閉與他的連接,并結(jié)束相應(yīng)的線程。(二) 模塊流程圖1 、注冊(cè)登陸服務(wù)器模塊 注冊(cè)登陸服務(wù)器在對(duì)話框初始化的同時(shí)完成網(wǎng)絡(luò)初始化,啟動(dòng)通信服務(wù)器以及接收線程,然后判斷是否注冊(cè)信息,如果是注冊(cè)信息,則根據(jù)相應(yīng)的規(guī)則進(jìn)入注冊(cè)界面,不論是數(shù)據(jù)的格式不對(duì),或者期間發(fā)生什么錯(cuò)誤都會(huì)返回注冊(cè)不成功的字樣,并且重新注冊(cè),如果成功則把數(shù)據(jù)寫入數(shù)據(jù)庫中并反饋給用戶;如果不是注冊(cè)而是登錄,則判斷是否登錄進(jìn)入客戶端,如
29、果進(jìn)入客戶端則把該用戶列入好友列表里邊,并反饋用戶;如不登錄則從好友列表中刪除該紀(jì)錄。圖4-1注冊(cè)登陸服務(wù)器流程圖2 、通信服務(wù)器模塊:啟動(dòng)通信服務(wù)器并初始化網(wǎng)絡(luò),啟動(dòng)接收線程,判斷發(fā)送的是信息還是附件,或者是信息與附件同時(shí)發(fā)送,如果是文本信息,則直接通過通信服務(wù)器轉(zhuǎn)發(fā)給用戶,如果是附件則給對(duì)方用戶發(fā)送信息,看對(duì)方是否接收。圖4-2通信服務(wù)器流程圖(三) 數(shù)據(jù)庫設(shè)計(jì)首先我建立的是用戶注冊(cè)登錄這個(gè)數(shù)據(jù)庫ybchat,根據(jù)要求,該數(shù)據(jù)庫中我建立了三個(gè)表格,分別是存儲(chǔ)用戶基本信息的表1,存儲(chǔ)用戶詳細(xì)信息的表2,然后對(duì)通信服務(wù)器也建立了一個(gè)表格是用來轉(zhuǎn)發(fā)用戶發(fā)送的信息的,下面對(duì)這三個(gè)表的結(jié)構(gòu)作一下簡單
30、介紹。通過下面三個(gè)表格,我們可以清楚的了解各個(gè)表格中的各個(gè)字段的類型,是否允許空值,碼,默認(rèn)值等信息。表4-1基本信息表: fieldtypenullkeydefaultextraidintnotpri編號(hào)(auto_)sexvarcharnot性別usernamevarcharnot用戶名agenumbernot年齡passwordvarcharnot密碼imagevarcharnot頭像表4-2詳細(xì)信息表: fieldtypenullkeydefaultextraidintnotpri編號(hào)(auto_)truenamevarcharyes真實(shí)姓名cityvarcharyes城市emailv
31、archaryese-mailtelnumberyes電話表4-3數(shù)據(jù)存儲(chǔ)表: fieldtypenullkeydefaultextraidintnotpri編號(hào)(auto_)user1varcharnotuser2varcharnot(四) 共享數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)同一進(jìn)程中的多個(gè)線程共存于同一個(gè)線性地址空間,因此,在多線程間共享數(shù)據(jù)結(jié)構(gòu)是非常容易且方便的。但必須注意的是,對(duì)數(shù)據(jù)結(jié)構(gòu)的訪問必須是多線程互斥的,否則數(shù)據(jù)任意更改將導(dǎo)致不可預(yù)料的結(jié)果。我們的設(shè)計(jì)是通過服務(wù)器轉(zhuǎn)發(fā)技術(shù)也就是通過共享數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)線程間的互相通信。這個(gè)程序的共享數(shù)據(jù)結(jié)構(gòu)一共有兩個(gè),其中包含了所有登陸用戶的一些基本資料,當(dāng)前服務(wù)器
32、接收到的用戶端所發(fā)送的信息資料,通過接收線程接收用戶所發(fā)送的信息,通過線程同步,使用cmutex進(jìn)行數(shù)據(jù)的傳送,每當(dāng)有用戶連接到服務(wù)器,服務(wù)器就將用戶端的一些信息以結(jié)構(gòu)體的形式存入用戶列表中;而當(dāng)服務(wù)器接收到用戶端發(fā)送過來的信息時(shí),就將數(shù)據(jù)格式化后存入結(jié)構(gòu)體中,通過與結(jié)構(gòu)體列表比較,確定需要恢復(fù)的發(fā)送線程。這樣,服務(wù)器就準(zhǔn)確地轉(zhuǎn)了發(fā)數(shù)據(jù)。五、關(guān)鍵代碼分析完成總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)之后,我們需要把前面設(shè)計(jì)的“藍(lán)圖”用程序語言表示出來,這樣才可以交付計(jì)算機(jī)進(jìn)行執(zhí)行。作為軟件工程的一個(gè)環(huán)節(jié),編程是設(shè)計(jì)的自然結(jié)果,因此,程序的質(zhì)量主要取決于軟件設(shè)計(jì)的質(zhì)量。但是,程序設(shè)計(jì)語言的特性和編碼途徑也會(huì)對(duì)程序的可靠
33、性、可讀性、可維護(hù)性、可預(yù)測(cè)性產(chǎn)生深遠(yuǎn)的影響。(一)編碼規(guī)則源程序代碼的邏輯簡明清晰、易讀易懂是程序好壞的一個(gè)重要標(biāo)準(zhǔn),為了做到這一點(diǎn),應(yīng)該遵循下述規(guī)則:1 簡單性原則,不要寫一些過于靈活,不易理解的函數(shù);2 適當(dāng)?shù)淖⑨專哼@對(duì)于提高程序的可讀寫、可維護(hù)性非常有益,將大大減輕后繼開發(fā)的壓力;3 語句構(gòu)造:每個(gè)語句都應(yīng)該簡單而直接,不能為了提高效率而是程序變得過分復(fù)雜。4 在設(shè)計(jì)和編寫程序是因該仔細(xì)考慮輸入/輸出的方面。5 不要犧牲程序的清晰性和可讀性來提高效率。(二)多進(jìn)程編程多進(jìn)程編程是unix的一個(gè)特點(diǎn),并且多進(jìn)程有很多的優(yōu)點(diǎn),下面就是多進(jìn)程編程的一些優(yōu)點(diǎn):1.并行化 ;2.簡單有序 ;3.
34、互不干擾 ;4.事務(wù)化 。(三)多線程技術(shù) 我的代碼設(shè)計(jì)涉及到了多線程技術(shù),是通過多線程來實(shí)現(xiàn)我們這次的畢業(yè)設(shè)計(jì),我們可以把線程看成是一個(gè)進(jìn)程中的一個(gè)執(zhí)行點(diǎn),每個(gè)進(jìn)程在任何給定時(shí)刻可能有若干個(gè)線程在運(yùn)行。一個(gè)進(jìn)程中的所有線程共享該進(jìn)程中同樣的地址空間,同樣的數(shù)據(jù)和代碼,以及同樣的資源。進(jìn)程中每個(gè)線程都有自己獨(dú)立的??臻g,和其它線程分離,并且不可互相訪問。 在我們的設(shè)計(jì)里運(yùn)用多線程技術(shù)就可以實(shí)現(xiàn)對(duì)多用戶的支持。即在服務(wù)器端,使接收來自用戶端的連接請(qǐng)求這步無限循環(huán),每接收一個(gè)用戶請(qǐng)求,產(chǎn)生兩個(gè)線程(接收線程和發(fā)送線程),并且接收線程在創(chuàng)建后處于可執(zhí)行狀態(tài),而發(fā)送線程則阻塞,等待服務(wù)器將其喚醒。這兩
35、個(gè)線程都執(zhí)行一個(gè)無限循環(huán)的過程,只有當(dāng)通信出現(xiàn)異?;蛴脩舳岁P(guān)閉連接時(shí),線程才被自身所結(jié)束,并且,這兩個(gè)線程一定是同時(shí)生成,同時(shí)結(jié)束的,也就是說必須是同步的。很顯然,每個(gè)連接產(chǎn)生兩個(gè)線程,使得數(shù)據(jù)轉(zhuǎn)發(fā)變的簡單,但同時(shí)又使得服務(wù)器的任務(wù)加重。(四)主要設(shè)計(jì)源代碼介紹1 、初始化網(wǎng)絡(luò)模塊初始化網(wǎng)絡(luò)主要就是首先讀取網(wǎng)絡(luò)配置,使用戶知道自己是該注冊(cè)成為會(huì)員還是登錄進(jìn)入客戶端,調(diào)用wsastartup初始化動(dòng)態(tài)庫,socket函數(shù)創(chuàng)建套接字,bind函數(shù)綁定本地ip地址和端口,listen函數(shù)使套接字進(jìn)入偵聽。部分源代碼如下所示:bool cchatsvrdlg:initnet()status = wsa
36、startup(makeword(1, 1), &data); / 初始化動(dòng)態(tài)庫if (status != 0)/ 看初始化動(dòng)態(tài)庫是否成功messagebox("error: wsastartup unsuccessful!", "邊延qq", mb_ok);return false;/以下指定一個(gè)與某個(gè)socket連接本地或遠(yuǎn)程地址*/memset(&serversockaddr, 0, sizeof (serversockaddr);/創(chuàng)建socket并讀取地址.serversocket = socket(af_inet, sock_
37、stream, 0); /初始化socket.status = bind(serversocket, (lpsockaddr)&serversockaddr, sizeof (serversockaddr);/綁定服務(wù)器,獲取服務(wù)器的地址if (status = socket_error)/ 綁定不成功messagebox("error: bind unsuccessful!", "邊延qq", mb_ok);return false;status = listen(serversocket, 5);/服務(wù)器進(jìn)行監(jiān)聽。.return true;接
38、著按下run鍵開始服務(wù)器功能,執(zhí)行reg_load()函數(shù),使服務(wù)器始終處于等待連接狀態(tài),但這樣也使該線程始終阻塞。當(dāng)有用戶連接時(shí),該函數(shù)創(chuàng)建一個(gè)任務(wù)用于處理與用戶及數(shù)據(jù)庫的事務(wù)。具體任務(wù)(詳見原始代碼文件)。 void cserverdlg:reg_load() while(1)cwinthread* hhandle;clientsocket=accept(serversocket,(lpsockaddr)&clientsockaddr,&addrlen); /等待連接,阻塞hhandle=afxbeginthread(talktoclient,(lpvoid)clients
39、ocket);/有連接時(shí),創(chuàng)建任務(wù) 2、 注冊(cè)登陸服務(wù)器設(shè)計(jì)2.1、 注冊(cè)登錄線程初始化網(wǎng)絡(luò)之后,當(dāng)用戶按下“運(yùn)行注冊(cè)登錄服務(wù)器”按鈕后,利用偵聽套接字啟動(dòng)注冊(cè)登錄線程regload(void *s)進(jìn)入無限循環(huán),在線程中調(diào)用accept函數(shù),用來接受來自客戶端的連接請(qǐng)求,每當(dāng)一個(gè)連接請(qǐng)求到來時(shí),accept()函數(shù)將產(chǎn)生一個(gè)新的套接字,利用這個(gè)套接字產(chǎn)生一個(gè)新的線程與客戶端進(jìn)行通信。源代碼如下:uint regload(void *s)/ 創(chuàng)建線程如果成功則同客戶端通信while (1)cwinthread* pthread;clientsocket = accept(serversocke
40、t, (lpsockaddr)&clientsockaddr, &addrlen);pthread = afxbeginthread(talktoclient, (lpvoid)clientsocket);if (pthread = null)/創(chuàng)建線程不成功返回錯(cuò)誤 afxmessagebox("error: unable to create thread!", mb_ok);status = closesocket(clientsocket);if (status = socket_error)afxmessagebox("error: clo
41、sesocket unsuccessful!", mb_ok);2.2、啟動(dòng)連接通信進(jìn)程在啟動(dòng)注冊(cè)登錄線程以后,接受來自客戶端的連接請(qǐng)求,并且產(chǎn)生一個(gè)新的線程talktoclient(void *cs)與客戶端進(jìn)行通信并讀寫數(shù)據(jù)庫,通信完畢后關(guān)閉該套接字和線程,原來的偵聽套接字繼續(xù)處于偵聽狀態(tài)。創(chuàng)建聊天通信服務(wù)器進(jìn)程,想關(guān)閉時(shí)則調(diào)用terminateprocess(m_hprocchat, 2)函數(shù)關(guān)閉此進(jìn)程。源代碼如下:void cchatsvrdlg:onbtnrunchat() /啟動(dòng)通信服務(wù)器. / start the child process. /創(chuàng)建進(jìn)程 用轉(zhuǎn)發(fā)數(shù)據(jù) i
42、f( createprocess( null, / no module name (use command line). ".comsvrcomsvr.exe", / command line. ./通過啟動(dòng)通信服務(wù)器轉(zhuǎn)發(fā)信息 ) . 2.3、關(guān)閉注冊(cè)/登錄服務(wù)器線程當(dāng)用戶結(jié)束通信后可通過關(guān)閉服務(wù)器線程來結(jié)束此次聊天。源代碼如下所示:void cchatsvrdlg:onbtnclose() if (afxmessagebox("真的要關(guān)閉注冊(cè)登錄服務(wù)器嗎?", mb_yesno) = idyes)oncancel();void cchatsvrdlg:
43、onbtnclosechat() if (afxmessagebox("真的要關(guān)閉聊天通信服務(wù)器嗎?", mb_yesno) = idyes)terminateprocess(m_hprocchat, 2);if (waitforsingleobject(m_hprocchat, 1000) = wait_object_0)/當(dāng)進(jìn)程終止時(shí)有信號(hào).void cchatsvrdlg:ondestroy() /關(guān)閉通信服務(wù)器cdialog:ondestroy();if (null != m_hprocchat)terminateprocess(m_hprocchat, 2);3、
44、 通信服務(wù)器設(shè)計(jì)3.1、發(fā)送消息線程采用的是共享數(shù)據(jù)結(jié)構(gòu)方式,通過通信服務(wù)器進(jìn)行數(shù)據(jù)的轉(zhuǎn)發(fā)實(shí)現(xiàn)。源代碼如下所示:uint senddata(void* cs)socket clientsocket=(socket)cs;while(1)if(info_data.data!="close!")m_mutex.lock(); /互鎖numsnd=send(clientsocket,info_data.data,info_data.data.getlength(),no_flags_set); /發(fā)送數(shù)據(jù)now=info_data.thread;m_mutex.unlock();
45、 /解鎖now->suspendthread(); /自身掛起else goto bb; bb: closesocketlink(lpvoid)clientsocket); /關(guān)閉連接afxendthread(0,true); /結(jié)束本線程return 1;3.2、接收消息線程它可判斷是接收到什么文件,是文字、是文件,以及傳輸是否成功(收到還是拒絕),并且如果用戶不在線,則把信息保存在數(shù)據(jù)庫中,等該用戶上線后由服務(wù)器通知該用戶有信息讀取。源代碼如下所示:uint recvdata(void* cs) socket clientsocket=(socket)cs;while(1).if(s
46、trcmp(buffer,"close!")!=0) /不是接收的“close”數(shù)據(jù) if(po!=null)s1=s_info.getnext(po);if(s1.pet.compare(petname)=0) /比較昵稱是否一樣m_mutex.lock(); /互鎖.m_mutex.unlock(); /解鎖s1.thread->resumethread(); /恢復(fù)發(fā)送相應(yīng)的線程break;elseif(clientsocket=s1.s_client)m_mutex.lock(); /互鎖info_data.data=buffer;m_mutex.unlock
47、(); /解鎖s1.thread->resumethread(); /恢復(fù)發(fā)送相應(yīng)的線程s_info.removeat(po1); /刪除該用戶信息break;goto aa;aa: closesocketlink(lpvoid)clientsocket); /關(guān)閉連接afxendthread(0,true); /結(jié)束本線程return 1;4、 數(shù)據(jù)庫設(shè)計(jì)在本次數(shù)據(jù)庫設(shè)計(jì)中,只涉及到了數(shù)據(jù)的查詢、插入;首先說一下服務(wù)器與數(shù)據(jù)庫的查詢,從數(shù)據(jù)庫中查詢注冊(cè)用戶信息是否存在,如果存在則反饋給用戶exist,并且結(jié)束這次查詢,進(jìn)入下一個(gè)查詢;首先數(shù)據(jù)庫中查詢是按用戶名查詢的,打開數(shù)據(jù)庫,看是否是數(shù)據(jù)庫的結(jié)尾,如果不是結(jié)尾則一直查到數(shù)據(jù)庫的末尾,代碼如下:cuser rec;rec.m_strsort = "username" /按用戶名查詢r(jià)ec.open(); /打開數(shù)據(jù)庫while (!rec.iseof()/若用戶名存在則發(fā)送exist!if (rec.m_username = username). /如果存在則退出rec.movenext();成功添加一條記錄:rec.addnew();/添加用戶信息if (rec.update()/添加記錄成功發(fā)送success!,
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 水廠配套設(shè)備加壓泵房改造工程項(xiàng)目可行性研究報(bào)告
- 中國智能一卡通管理系統(tǒng)行業(yè)市場(chǎng)規(guī)模及投資前景預(yù)測(cè)分析報(bào)告
- 鋼結(jié)構(gòu)制造基地項(xiàng)目可行性研究報(bào)告(備案模板)
- 低壓配電設(shè)備生產(chǎn)項(xiàng)目可行性研究報(bào)告
- 浙江丙烯酰胺項(xiàng)目可行性研究報(bào)告模板
- 中交天航(宜賓)交通工程建設(shè)有限公司-企業(yè)報(bào)告(業(yè)主版)
- 阻燃劑項(xiàng)目評(píng)價(jià)分析報(bào)告
- 壓延玻璃生產(chǎn)建設(shè)項(xiàng)目節(jié)能評(píng)估報(bào)告(節(jié)能專)
- 幕墻工程方案分析報(bào)告
- 2025年水利工程建設(shè)中的質(zhì)量控制與安全管理策略研究報(bào)告
- 肢端肥大癥護(hù)理查房
- 《滑炒雞絲》課程教學(xué)設(shè)計(jì)
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)教程PPT完整全套教學(xué)課件
- 鋼板卷管工實(shí)用工藝
- 外科學(xué)(2)知到章節(jié)答案智慧樹2023年溫州醫(yī)科大學(xué)
- 火電廠典型危險(xiǎn)點(diǎn)分析預(yù)控措施
- GB/T 18915.1-2013鍍膜玻璃第1部分:陽光控制鍍膜玻璃
- GB 28375-2012混凝土結(jié)構(gòu)防火涂料
- DB33T 2226-2019 空氣負(fù)(氧)離子觀測(cè)與評(píng)價(jià)技術(shù)規(guī)范-純圖
- 高管人員績效考核方案
- DB32-T 4338-2022 高速公路橋梁支座安裝施工技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論