




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、延邊大學(xué)本科畢業(yè)論文局域網(wǎng)信息發(fā)布程序的設(shè)計與實現(xiàn)作 者 院 系 理工學(xué)院 計算機(jī)系 專 業(yè) 科學(xué)與技術(shù)專業(yè) 年 級 2001級 學(xué) 號 指導(dǎo)教師 職 稱 講師 答辯日期 2005年6月11日 目 錄摘要.3英文摘要.4一、緒論.5(一)背景介紹.5(二)相關(guān)知識.5二、需求分析.9(一) 可行性分析:.9(二) 系統(tǒng)綜合要求: .9(三) 系統(tǒng)數(shù)據(jù)要求: .10三、總體設(shè)計.12(一) 層次圖.12(二) 系統(tǒng)構(gòu)架圖.13(三) ipo圖.14四、詳細(xì)設(shè)計.16(一) 服務(wù)器端設(shè)計方案 .16(二) 模塊流程圖.17(三) 數(shù)據(jù)庫設(shè)計.20(四) 共享數(shù)據(jù)結(jié)構(gòu)設(shè)計.20五、關(guān)鍵代碼分析.22
2、(一) 編碼規(guī)則.22(二) 多進(jìn)程編程 .22(三) 多線程技術(shù).23(四) 主要設(shè)計源代碼介紹.23六、測試.31(一) 測試的目標(biāo)和方法.31(二) 軟件測試情況.31(三) 界面與功能測試情況.32七、總結(jié).35參考文獻(xiàn).36摘 要本次畢業(yè)設(shè)計的題目是局域網(wǎng)信息發(fā)布程序的實現(xiàn),是采用redhat linux 作為開發(fā)平臺,以mysql為數(shù)據(jù)載體,以vc語言為主要開發(fā)語言的一套包括發(fā)送消息及附件為主,并提供及時聊天功能的一個綜合性軟件。主要的功能是基于tcp/ip網(wǎng)絡(luò)通信技術(shù)實現(xiàn)了面向連接的用戶與服務(wù)器間點對點的通信傳輸功能,并且應(yīng)用了多線程以及共享數(shù)據(jù)結(jié)構(gòu)技術(shù),使網(wǎng)絡(luò)服務(wù)器具有了多用戶
3、數(shù)據(jù)轉(zhuǎn)發(fā)的功能,進(jìn)而解決了局域網(wǎng)多用戶間的信息發(fā)送的問題。在客戶端,用戶通過注冊/登陸機(jī)制進(jìn)行身份驗證并通過通信服務(wù)器轉(zhuǎn)發(fā)信息以及附件。對于一般采用tcp/ip協(xié)議的應(yīng)用程序只實現(xiàn)了單用戶與服務(wù)器間點對點的連接,而本文在vc6.0的環(huán)境下,運用了多線程以及共享數(shù)據(jù)結(jié)構(gòu)技術(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)用程序只實現(xiàn)了單用戶與服務(wù)器間點對點的連接,而我所選擇的題目則是應(yīng)用多線程及共享數(shù)據(jù)結(jié)構(gòu)技術(shù),不僅實現(xiàn)了多用戶與服務(wù)器間的連接,而且解決了多用戶間信息交換問題。所以說開發(fā)的這個軟件應(yīng)該是一個比較實用的,功能比較強大的軟件。它的主要功能是基于tcp
8、/ip網(wǎng)絡(luò)通信技術(shù)實現(xiàn)了面向連接的用戶與服務(wù)器間點對點的通信傳輸功能,一套包括發(fā)送消息及附件為主,并提供及時聊天功能的一個綜合性軟件。它的開發(fā)環(huán)境是以redhat linux作為開發(fā)平臺,以mysql為數(shù)據(jù)載體,以vc語言為主要開發(fā)語言的一個軟件。在這次代碼的編寫中我們主要研究的是網(wǎng)絡(luò)通信方面的知識1。(二)相關(guān)知識1、linux的特性及其優(yōu)點linux操作系統(tǒng)核心最早源于芬蘭赫爾辛基大學(xué)一名學(xué)生linus torvalds的天才想法,后來經(jīng)過眾多世界頂尖的軟件工程師的不斷修改和完善,linux得以在全球普及開來,在服務(wù)器及個人桌面領(lǐng)域得到越來越多的應(yīng)用,在嵌入式開發(fā)方面更是具有其它操作系統(tǒng)無
9、可比擬的優(yōu)勢,并以每年100%的用戶遞增數(shù)量顯示了linux強大的力量,成為unix世界的一朵奇葩。linux是一套免費的32位多用戶多任務(wù)的操作系統(tǒng),其穩(wěn)定性、多任務(wù)能力與網(wǎng)絡(luò)功能已是許多商業(yè)操作系統(tǒng)無法比擬的,linux還有一項最大的特色在于源代碼完全公開,在符合gnu gpl(general public license)的原則下,任何人皆可自由取得、散布、甚至修改源代碼。 linux還具有以下特點:1)采用階層式目錄結(jié)構(gòu),文件歸類清楚、容易管理;2)支持多種文件系統(tǒng);3)具備高度移植性;4)可與其它的操作系統(tǒng)并存于同一臺計算機(jī)上。linux的優(yōu)點也有很多,如下:1)低廉的附加費用;2)
10、根據(jù)您的需求靈活定制;3)從許可證的限制中解脫;4)穩(wěn)定性;5)高性能;6)標(biāo)準(zhǔn)兼容性。2 、 數(shù)據(jù)庫(mysql)及其特點隨著計算機(jī)技術(shù)的飛速發(fā)展,計算機(jī)用于管理的規(guī)模越來越大,應(yīng)用越來越廣泛,數(shù)據(jù)量急劇增長,傳統(tǒng)的數(shù)據(jù)管理方式(人工管理、文件系統(tǒng)方式)已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足人們的要求,數(shù)據(jù)庫技術(shù)便應(yīng)運而生,出現(xiàn)了統(tǒng)一管理數(shù)據(jù)的專門軟件系統(tǒng)數(shù)據(jù)庫管理系統(tǒng)。數(shù)據(jù)庫系統(tǒng)由于其數(shù)據(jù)結(jié)構(gòu)化、共享性高、冗余度低、易擴(kuò)充,數(shù)據(jù)獨立性高等優(yōu)點,在各個領(lǐng)域得到了廣泛的應(yīng)用4。mysql是一個真正的多用戶、多線程的sql數(shù)據(jù)庫,是一個客戶機(jī)/服務(wù)器結(jié)構(gòu)的應(yīng)用,它由一個服務(wù)器守護(hù)程序mysql同的客戶程序和庫組成。m
11、ysql的主要目標(biāo)是快速、健壯和易用。mysql具有以下功能特點:l 可以同時處理幾乎不限數(shù)量的用戶;l 處理多達(dá)50,000,000以上的記錄;l 命令執(zhí)行速度快,也許是現(xiàn)今最快的;l 用戶名和口令獨立于/etc/passwd。這便于cgi的使用;l 使用核心線程的完全多線程支持,這意味著它能利用多cpu;l 支持多種語言開發(fā),例如c c+ java php;l 支持多字節(jié)類型,包括1 2 3 4 8字節(jié)長度的有符號、無符號整數(shù);l 全面支持sql。3、 vc簡介3.1、 vc的特性雖然vc比較難學(xué),盡管也是visual的,但很多地方需要手工編寫代碼,但其開發(fā)后生成的程序質(zhì)量比較高。vc編譯
12、后的速度較快,不需要龐大的運行時間庫支持,軟件發(fā)行也不是困難;而且底層調(diào)用手段較多,適合開發(fā)硬件操作多、速度要求高的場合,比如編寫硬件驅(qū)動程序等等。3.2、 vc+與網(wǎng)絡(luò)編程vc+對網(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)于一種文件描述符,具有一個類似于打開文件的函數(shù)調(diào)用-socket()??梢赃@樣理解:socket實際上是一個通信端點,通過它,用戶的sock
13、et程序可以通過網(wǎng)絡(luò)和其他的socket應(yīng)用程序通信。socket存在于一個"通信域"里,并且與另一個域的socket交換數(shù)據(jù)。socket有三類。第一種是sock_stream(流式),提供面向連接的可靠的通信服務(wù),比如telnet,http。第二種是sock_dgram(數(shù)據(jù)報),提供無連接不可靠的通信,比如udp。第三種是sock_raw(原始),主要用于協(xié)議的開發(fā)和測試,支持通信底層操作3。4、數(shù)據(jù)通信的種類4.1、tcp/ip(傳輸控制協(xié)議)它是由socket類實現(xiàn),并且它提供的是一種可靠的、面向連接的數(shù)據(jù)傳輸方式,不管是對單個的數(shù)據(jù)報還是對數(shù)據(jù)包,流式套接字都提
14、供了一種流式數(shù)據(jù)傳輸。tcp接收傳輸協(xié)議數(shù)據(jù)包并把它們傳遞到表示層。并把信息分解成數(shù)據(jù)包(datagrams) 并在接收端重新組裝起來。它還對丟失的數(shù)據(jù)包進(jìn)行重新傳輸?shù)恼埱?。4.2、udp(用戶數(shù)據(jù)報協(xié)議)由datagramsocket類實現(xiàn)數(shù)據(jù)報套接字,它提供的是一種不可靠的非連接的數(shù)據(jù)包通信方式,不可靠的意思是發(fā)送一個數(shù)據(jù)包不能保證被接收方接收,也不保證數(shù)據(jù)包按照發(fā)送順序到達(dá)接收方,雖然它使你的應(yīng)用程序更有效率,但只有在你的應(yīng)用程序并不是立即交流大量數(shù)據(jù)并且不需要組裝大量的數(shù)據(jù)報而完成一條消息的時候才使用5?;谏厦鎯煞N方法的比較,我選擇的是tcp/ip協(xié)議作為這次開發(fā)的協(xié)議,用他來控制
15、傳輸數(shù)據(jù)。5、 小組分工在局域網(wǎng)信息發(fā)布程序的設(shè)計與實現(xiàn)中本人負(fù)責(zé)服務(wù)器部分的代碼設(shè)計與編寫。二、需求分析(一) 可行性分析可行性分析的目的是為了用最小代價在最短時間內(nèi)確定問題是否能夠解決。可行性分析的實質(zhì)就是要進(jìn)行一次壓縮簡化系統(tǒng)分析和設(shè)計的過程,也就是在較高層次上以較抽象的方式進(jìn)行的系統(tǒng)分析和設(shè)計的過程1。(1)技術(shù)可行性:這個軟件通用,可行。(2)經(jīng)濟(jì)可行性:這個軟件的經(jīng)濟(jì)效益會遠(yuǎn)大于開發(fā)成本,可行。(3)操作可行性:linux系統(tǒng)/windows系統(tǒng)和mysql為大家所熟知,比較易于操作,這個軟件也易于使用,可行。(二) 系統(tǒng)綜合要求需求分析的基本任務(wù)是準(zhǔn)確的回答“系統(tǒng)必須做什么?”1
16、這個問題。這一階段是對系統(tǒng)認(rèn)識最為全面、準(zhǔn)確、清晰、得體的一個比較關(guān)鍵的時期。需求分析的結(jié)果是系統(tǒng)開發(fā)的基礎(chǔ),關(guān)系到工程的成敗和軟件產(chǎn)品的質(zhì)量。因此,必須用行之有效的方法對軟件需求進(jìn)行嚴(yán)格的審查驗證,為下一步的總體設(shè)計打好基礎(chǔ)。2.1 、系統(tǒng)功能要求需求分析的基本任務(wù)是準(zhǔn)確的回答“系統(tǒng)必須做什么?” 功能:1) 注冊會員于登錄服務(wù)器,并把相關(guān)會員信息寫入數(shù)據(jù)庫中,在登陸時要進(jìn)行身份驗證。2) 建立多用戶間的通信連接。3) 用戶間消息和文件的傳送和接收。4) 附件與文字同時發(fā)送。2.2、 系統(tǒng)性能要求時間性能要求:在實際應(yīng)用中可能需要多用戶間信息互發(fā)的問題,客戶端的大量頻繁的訪問,服務(wù)器響應(yīng)時間
17、應(yīng)該盡可能縮短,對于有特殊需求的應(yīng)用,還要求達(dá)到實時響應(yīng)。存儲性能要求:根據(jù)應(yīng)用中的實際情況配置適當(dāng)容量的存儲設(shè)備。穩(wěn)定性安全性要求:要求軟件盡可能的穩(wěn)定,對于一般的應(yīng)用系統(tǒng),對安全性要求不高,對于特殊的應(yīng)用,還需要在安全性方面加以保證,所以要相應(yīng)提高服務(wù)器端的配置。2.3、 系統(tǒng)運行要求服務(wù)器端: linux系統(tǒng)和mysql服務(wù)器。server:用于接收/轉(zhuǎn)發(fā)數(shù)據(jù),連接數(shù)據(jù)庫及應(yīng)用程序??蛻舳? 多個pc機(jī),通信用,作為數(shù)據(jù)發(fā)生器。2.4、 將來可能提出的要求在實際應(yīng)用中,用戶的要求隨時可能發(fā)生變化,如需要更改數(shù)據(jù)庫信息,改變通信參數(shù),增加訪問量以及需要提高系統(tǒng)的性能要求等等。為了減少軟件改
18、寫的難度,提高軟件的可維護(hù)性,在設(shè)計時要考慮到以上的種種可能性,提高程序的可讀性和易擴(kuò)充性。(三) 系統(tǒng)數(shù)據(jù)要求數(shù)據(jù)流圖是描繪系統(tǒng)的邏輯模型,描繪信息在系統(tǒng)中流動和處理的情況。數(shù)據(jù)流圖是邏輯系統(tǒng)的圖形表示,非常容易理解,所以是極好的通信工具,同時,設(shè)計數(shù)據(jù)流圖只需要考慮系統(tǒng)必須完成的基本邏輯功能,完全不需要考慮如何具體地實現(xiàn)這些功能,所以它也是軟件設(shè)計的很好的出發(fā)點1。下面是我們設(shè)計的數(shù)據(jù)流圖: 圖2-1數(shù)據(jù)流圖因為數(shù)據(jù)流圖是描繪信息在系統(tǒng)中流動和處理的情況,所以首先說明一下這個數(shù)據(jù)流圖的作用:局域網(wǎng)信息發(fā)布的起點與終點都是用戶自己本身,也就是發(fā)起者與接收者都是用戶自己。進(jìn)入我們的程序后,首先
19、用戶要自己判斷是這冊用戶還是登錄用戶,想成為會員首先就要注冊成為會員,這樣就進(jìn)入了注冊信息這個階段,填寫注冊用戶的基本信息,詳細(xì)信息。判斷該信息是否有人注冊,如果注冊信息成功,則把用戶的注冊信息寫入在數(shù)據(jù)庫中,也就是更新我們的數(shù)據(jù)庫信息并保存數(shù)據(jù),反饋給用戶注冊成功的信息,用戶就進(jìn)入登錄界面進(jìn)行登錄,進(jìn)入到客戶端后,用戶可根據(jù)相應(yīng)的要求發(fā)送信息、附件等給用戶。并且這些信息與附件相應(yīng)的通過通信服務(wù)器轉(zhuǎn)發(fā),并保存2。上面就是這個數(shù)據(jù)流圖的過程,用戶與用戶之間的聯(lián)系,用戶與服務(wù)器的聯(lián)系,都表現(xiàn)了出來。三、 總體設(shè)計經(jīng)過了需求分析階段的工作,系統(tǒng)必須“做什么”的問題已經(jīng)清楚了,現(xiàn)在是決定“怎么做”的時
20、候了??傮w設(shè)計的基本目的就是回答“概括得說,系統(tǒng)應(yīng)該如何實現(xiàn)?”這個問題,因此,總體設(shè)計又稱為概要設(shè)計或初步設(shè)計。通過這個階段的工作,將劃分出組成系統(tǒng)的各個物理要素程序、文件、數(shù)據(jù)庫、人工過程和文檔等等,但是每個物理元素仍然處于黑盒子級,這些黑盒子里的具體內(nèi)容將在以后進(jìn)行詳細(xì)設(shè)計。總體設(shè)計階段的另一項重要任務(wù)是設(shè)計軟件的結(jié)構(gòu),也就是要確定系統(tǒng)中每個程序是由哪些模塊組成的,以及這些模塊相互間的關(guān)系1。(一)層次圖層次圖用來描繪軟件的層次結(jié)構(gòu),通過它我們可以更清晰的看到軟件的模塊組成情況。根據(jù)我們這個題目的設(shè)計,我們相應(yīng)的把設(shè)計劃分成下面幾個大的模塊5。一個模塊是注冊登錄服務(wù)器,它包括用戶注冊、登
21、錄以及數(shù)據(jù)庫管理這三個功能,啟動注冊登錄服務(wù)器,判斷用戶是注冊還是登錄,注冊則進(jìn)入注冊部分,并保存數(shù)據(jù)于數(shù)據(jù)庫中,登錄則直接從數(shù)據(jù)庫調(diào)出數(shù)據(jù),登錄進(jìn)入客戶端通信。另一個模塊是通信服務(wù)器模塊,它負(fù)責(zé)完成數(shù)據(jù)轉(zhuǎn)發(fā)以及共享數(shù)據(jù)結(jié)構(gòu)的管理;主要是用戶之間信息發(fā)送的轉(zhuǎn)發(fā)問題,服務(wù)器接收到用戶端發(fā)來的消息后,提取消息的一部分與共享數(shù)據(jù)結(jié)構(gòu)存儲的內(nèi)容進(jìn)行比較,確定所要轉(zhuǎn)發(fā)的對象,最后通過多線程及其通信機(jī)制完成數(shù)據(jù)轉(zhuǎn)發(fā)??蛻舳诉@個模塊,它的主要功能就是用戶的注冊,登陸,信息發(fā)送與附件的發(fā)送。數(shù)據(jù)庫模塊,它記錄了用戶注冊的基本信息,詳細(xì)信息,并通過它來反饋給注冊登陸服務(wù)器,驗證用戶是否已經(jīng)注冊,以及提取正確的信
22、息;還有就是保存了用戶間發(fā)送的信息與附件。局域網(wǎng)信息發(fā)布系統(tǒng) 注冊/登陸服務(wù)器模塊模塊客戶端通信服務(wù)器模塊數(shù)據(jù)庫模塊登陸用戶注冊數(shù)據(jù)庫管理登陸注冊發(fā)送信息數(shù)據(jù)轉(zhuǎn)發(fā)用戶信息共享數(shù)據(jù)圖3-1層次圖(二) 系統(tǒng)構(gòu)架圖系統(tǒng)構(gòu)架圖是整個程序的關(guān)鍵所在,也是整個程序的靈魂,我們的設(shè)計就是按照這個整個的系統(tǒng)構(gòu)架圖所做的,它有著很重要的作用6。下面這個就是我們設(shè)計的系統(tǒng)構(gòu)架圖:圖3-2系統(tǒng)構(gòu)架圖用戶進(jìn)入程序后,啟動注冊/登錄服務(wù)器,注冊/登陸服務(wù)器接收到用戶端的信息后,首先判斷是注冊信息還是登陸信息;應(yīng)為用戶首先必須要注冊才能使用這個軟件,所以啟動注冊界面,進(jìn)入注冊界面后,填寫用戶的基本信息,詳細(xì)信息,通過注
23、冊登錄服務(wù)器把數(shù)據(jù)傳給數(shù)據(jù)庫,如果注冊成功則把數(shù)據(jù)存儲到數(shù)據(jù)庫中,如果注冊不成功則給用戶返回失敗的消息框(期間有任何異常產(chǎn)生,服務(wù)器都會返回注冊失敗消息,提示用戶重新注冊),數(shù)據(jù)庫要判斷用戶注冊信息是否重復(fù)、是否符合標(biāo)準(zhǔn),如成功,數(shù)據(jù)庫更新數(shù)據(jù)庫的內(nèi)容并反饋給用戶注冊成功的消息,這樣用戶就可以根據(jù)剛才注冊的信息到登錄界面登陸進(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ù)、對數(shù)據(jù)的處理和輸出數(shù)據(jù)的關(guān)系,有了它,模塊間的相互關(guān)系就顯而易見了1。輸入 處理 輸出 圖3-3 ipo圖就是輸入用戶注冊信息,發(fā)送的信息與附件,登錄信息等,寫入數(shù)據(jù)庫中,初始化數(shù)據(jù)與網(wǎng)絡(luò)后,即初始化響應(yīng)后,判斷注冊或登錄,如信息發(fā)送則通過通信服務(wù)器轉(zhuǎn)發(fā)用戶發(fā)送的信息或附件,保存進(jìn)入數(shù)據(jù)庫中。四、詳細(xì)設(shè)計詳細(xì)設(shè)計階段的根本任務(wù)是確定應(yīng)該怎樣具體地實現(xiàn)所要求的系統(tǒng),也就是說,經(jīng)過這個階段的設(shè)計工作,應(yīng)該得出對目標(biāo)系統(tǒng)的精確描述,從而在編碼階段可以把這個描述直接翻譯成用某種程序設(shè)計語言書寫的程序1。詳細(xì)設(shè)計階段的任務(wù)還不是具體的編寫程序,而是要設(shè)計出程序的“藍(lán)圖”,以后程序員將根據(jù)
25、這個藍(lán)圖寫出實際的程序代碼。因此,詳細(xì)設(shè)計的結(jié)果基本上決定了最終的程序代碼的質(zhì)量??紤]程序代碼的質(zhì)量時必須注意,程序的“讀者”有兩個程序的維護(hù)者和普通用戶。在軟件的生命周期中,詳細(xì)設(shè)計方案、診斷程序錯誤、修改和改進(jìn)程序等等都必須能夠讀懂程序。實際上對于長期使用的軟件系統(tǒng)來說,讀程序的時間往往要比改寫程序的時間還要長很多。因此衡量程序的質(zhì)量,不僅要看它的邏輯是否正確、性能是否滿足要求,更主要的是要看它是否容易閱讀和理解。詳細(xì)設(shè)計的目標(biāo)不僅僅是在邏輯上能正確地反映每個模塊的功能,更重要的是設(shè)計出的處理過程應(yīng)該盡可能簡潔明了。結(jié)構(gòu)化程序設(shè)計技術(shù)是實現(xiàn)上述目標(biāo)的關(guān)鍵技術(shù),是詳細(xì)設(shè)計的邏輯基礎(chǔ)。(一)服
26、務(wù)器端設(shè)計方案1 、注冊登錄服務(wù)器設(shè)計首先注冊登陸服務(wù)器負(fù)責(zé)的是用戶的注冊、登陸以及數(shù)據(jù)庫的管理。注冊/登陸服務(wù)器啟動,接收到用戶端的信息后,首先得判斷是注冊信息還是登陸信息。如果是注冊信息,則將該數(shù)據(jù)按預(yù)定的格式寫入數(shù)據(jù)庫,然后返回注冊成功的消息,期間有任何異常產(chǎn)生,服務(wù)器都會返回注冊失敗消息,提示用戶重新注冊;如果是登陸信息,則從數(shù)據(jù)中提取用戶名和id與數(shù)據(jù)庫中的內(nèi)容進(jìn)行比較,如果該用戶存在,則返回登陸成功消息,反之,返回登陸失敗消息。注冊登錄服務(wù)器采用面向連接的并發(fā)式方式,服務(wù)器設(shè)計成為一個對話框程序。初始化動態(tài)庫,創(chuàng)建套接字,綁定本地ip地址和端口,并使套接字進(jìn)入偵聽,由于可能產(chǎn)生阻塞
27、,所以不宜在主線程中調(diào)用該函數(shù),因而在初始化網(wǎng)絡(luò)后當(dāng)用戶按下“運行注冊登錄服務(wù)器”按鈕后,利用偵聽套接字啟動注冊登錄線程進(jìn)入無限循環(huán),在線程中調(diào)用接收函數(shù),用來接受來自客戶端的連接請求,每當(dāng)一個連接請求到來時,都會產(chǎn)生一個新的套接字,利用這個套接字產(chǎn)生一個新的線程與客戶端進(jìn)行通信并讀寫數(shù)據(jù)庫,通信完畢后關(guān)閉該套接字和線程,原來的偵聽套接字繼續(xù)處于偵聽狀態(tài)。2 、通信服務(wù)器設(shè)計聊天通信服務(wù)器設(shè)計為無界面的進(jìn)程(創(chuàng)建時先建一個基于對話框的應(yīng)用程序,然后把對話框類刪除,把app類里面與對話框有關(guān)的語句全刪除即可創(chuàng)建無界面進(jìn)程),采用共享數(shù)據(jù)結(jié)構(gòu),為每個客戶端創(chuàng)建兩個線程,實現(xiàn)接收和轉(zhuǎn)發(fā)的功能。運用共
28、享數(shù)據(jù)結(jié)構(gòu)技術(shù)及多線程技術(shù),通過i/o端口與用戶端連接,實現(xiàn)了數(shù)據(jù)轉(zhuǎn)發(fā)功能。首先,程序初始化網(wǎng)絡(luò),接著當(dāng)用戶連接到服務(wù)器時,創(chuàng)建接收線程和發(fā)送線程,這樣就可以實現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)。最后,當(dāng)用戶斷開連接時,服務(wù)器關(guān)閉與他的連接,并結(jié)束相應(yīng)的線程。(二) 模塊流程圖1 、注冊登陸服務(wù)器模塊 注冊登陸服務(wù)器在對話框初始化的同時完成網(wǎng)絡(luò)初始化,啟動通信服務(wù)器以及接收線程,然后判斷是否注冊信息,如果是注冊信息,則根據(jù)相應(yīng)的規(guī)則進(jìn)入注冊界面,不論是數(shù)據(jù)的格式不對,或者期間發(fā)生什么錯誤都會返回注冊不成功的字樣,并且重新注冊,如果成功則把數(shù)據(jù)寫入數(shù)據(jù)庫中并反饋給用戶;如果不是注冊而是登錄,則判斷是否登錄進(jìn)入客戶端,如
29、果進(jìn)入客戶端則把該用戶列入好友列表里邊,并反饋用戶;如不登錄則從好友列表中刪除該紀(jì)錄。圖4-1注冊登陸服務(wù)器流程圖2 、通信服務(wù)器模塊:啟動通信服務(wù)器并初始化網(wǎng)絡(luò),啟動接收線程,判斷發(fā)送的是信息還是附件,或者是信息與附件同時發(fā)送,如果是文本信息,則直接通過通信服務(wù)器轉(zhuǎn)發(fā)給用戶,如果是附件則給對方用戶發(fā)送信息,看對方是否接收。圖4-2通信服務(wù)器流程圖(三) 數(shù)據(jù)庫設(shè)計首先我建立的是用戶注冊登錄這個數(shù)據(jù)庫ybchat,根據(jù)要求,該數(shù)據(jù)庫中我建立了三個表格,分別是存儲用戶基本信息的表1,存儲用戶詳細(xì)信息的表2,然后對通信服務(wù)器也建立了一個表格是用來轉(zhuǎn)發(fā)用戶發(fā)送的信息的,下面對這三個表的結(jié)構(gòu)作一下簡單
30、介紹。通過下面三個表格,我們可以清楚的了解各個表格中的各個字段的類型,是否允許空值,碼,默認(rèn)值等信息。表4-1基本信息表: fieldtypenullkeydefaultextraidintnotpri編號(auto_)sexvarcharnot性別usernamevarcharnot用戶名agenumbernot年齡passwordvarcharnot密碼imagevarcharnot頭像表4-2詳細(xì)信息表: fieldtypenullkeydefaultextraidintnotpri編號(auto_)truenamevarcharyes真實姓名cityvarcharyes城市emailv
31、archaryese-mailtelnumberyes電話表4-3數(shù)據(jù)存儲表: fieldtypenullkeydefaultextraidintnotpri編號(auto_)user1varcharnotuser2varcharnot(四) 共享數(shù)據(jù)結(jié)構(gòu)設(shè)計同一進(jìn)程中的多個線程共存于同一個線性地址空間,因此,在多線程間共享數(shù)據(jù)結(jié)構(gòu)是非常容易且方便的。但必須注意的是,對數(shù)據(jù)結(jié)構(gòu)的訪問必須是多線程互斥的,否則數(shù)據(jù)任意更改將導(dǎo)致不可預(yù)料的結(jié)果。我們的設(shè)計是通過服務(wù)器轉(zhuǎn)發(fā)技術(shù)也就是通過共享數(shù)據(jù)結(jié)構(gòu)實現(xiàn)線程間的互相通信。這個程序的共享數(shù)據(jù)結(jié)構(gòu)一共有兩個,其中包含了所有登陸用戶的一些基本資料,當(dāng)前服務(wù)器
32、接收到的用戶端所發(fā)送的信息資料,通過接收線程接收用戶所發(fā)送的信息,通過線程同步,使用cmutex進(jìn)行數(shù)據(jù)的傳送,每當(dāng)有用戶連接到服務(wù)器,服務(wù)器就將用戶端的一些信息以結(jié)構(gòu)體的形式存入用戶列表中;而當(dāng)服務(wù)器接收到用戶端發(fā)送過來的信息時,就將數(shù)據(jù)格式化后存入結(jié)構(gòu)體中,通過與結(jié)構(gòu)體列表比較,確定需要恢復(fù)的發(fā)送線程。這樣,服務(wù)器就準(zhǔn)確地轉(zhuǎn)了發(fā)數(shù)據(jù)。五、關(guān)鍵代碼分析完成總體設(shè)計和詳細(xì)設(shè)計之后,我們需要把前面設(shè)計的“藍(lán)圖”用程序語言表示出來,這樣才可以交付計算機(jī)進(jìn)行執(zhí)行。作為軟件工程的一個環(huán)節(jié),編程是設(shè)計的自然結(jié)果,因此,程序的質(zhì)量主要取決于軟件設(shè)計的質(zhì)量。但是,程序設(shè)計語言的特性和編碼途徑也會對程序的可靠
33、性、可讀性、可維護(hù)性、可預(yù)測性產(chǎn)生深遠(yuǎn)的影響。(一)編碼規(guī)則源程序代碼的邏輯簡明清晰、易讀易懂是程序好壞的一個重要標(biāo)準(zhǔn),為了做到這一點,應(yīng)該遵循下述規(guī)則:1 簡單性原則,不要寫一些過于靈活,不易理解的函數(shù);2 適當(dāng)?shù)淖⑨專哼@對于提高程序的可讀寫、可維護(hù)性非常有益,將大大減輕后繼開發(fā)的壓力;3 語句構(gòu)造:每個語句都應(yīng)該簡單而直接,不能為了提高效率而是程序變得過分復(fù)雜。4 在設(shè)計和編寫程序是因該仔細(xì)考慮輸入/輸出的方面。5 不要犧牲程序的清晰性和可讀性來提高效率。(二)多進(jìn)程編程多進(jìn)程編程是unix的一個特點,并且多進(jìn)程有很多的優(yōu)點,下面就是多進(jìn)程編程的一些優(yōu)點:1.并行化 ;2.簡單有序 ;3.
34、互不干擾 ;4.事務(wù)化 。(三)多線程技術(shù) 我的代碼設(shè)計涉及到了多線程技術(shù),是通過多線程來實現(xiàn)我們這次的畢業(yè)設(shè)計,我們可以把線程看成是一個進(jìn)程中的一個執(zhí)行點,每個進(jìn)程在任何給定時刻可能有若干個線程在運行。一個進(jìn)程中的所有線程共享該進(jìn)程中同樣的地址空間,同樣的數(shù)據(jù)和代碼,以及同樣的資源。進(jìn)程中每個線程都有自己獨立的??臻g,和其它線程分離,并且不可互相訪問。 在我們的設(shè)計里運用多線程技術(shù)就可以實現(xiàn)對多用戶的支持。即在服務(wù)器端,使接收來自用戶端的連接請求這步無限循環(huán),每接收一個用戶請求,產(chǎn)生兩個線程(接收線程和發(fā)送線程),并且接收線程在創(chuàng)建后處于可執(zhí)行狀態(tài),而發(fā)送線程則阻塞,等待服務(wù)器將其喚醒。這兩
35、個線程都執(zhí)行一個無限循環(huán)的過程,只有當(dāng)通信出現(xiàn)異?;蛴脩舳岁P(guān)閉連接時,線程才被自身所結(jié)束,并且,這兩個線程一定是同時生成,同時結(jié)束的,也就是說必須是同步的。很顯然,每個連接產(chǎn)生兩個線程,使得數(shù)據(jù)轉(zhuǎn)發(fā)變的簡單,但同時又使得服務(wù)器的任務(wù)加重。(四)主要設(shè)計源代碼介紹1 、初始化網(wǎng)絡(luò)模塊初始化網(wǎng)絡(luò)主要就是首先讀取網(wǎng)絡(luò)配置,使用戶知道自己是該注冊成為會員還是登錄進(jìn)入客戶端,調(diào)用wsastartup初始化動態(tài)庫,socket函數(shù)創(chuàng)建套接字,bind函數(shù)綁定本地ip地址和端口,listen函數(shù)使套接字進(jìn)入偵聽。部分源代碼如下所示:bool cchatsvrdlg:initnet()status = wsa
36、startup(makeword(1, 1), &data); / 初始化動態(tài)庫if (status != 0)/ 看初始化動態(tài)庫是否成功messagebox("error: wsastartup unsuccessful!", "邊延qq", mb_ok);return false;/以下指定一個與某個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ù)創(chuàng)建一個任務(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);/有連接時,創(chuàng)建任務(wù) 2、 注冊登陸服務(wù)器設(shè)計2.1、 注冊登錄線程初始化網(wǎng)絡(luò)之后,當(dāng)用戶按下“運行注冊登錄服務(wù)器”按鈕后,利用偵聽套接字啟動注冊登錄線程regload(void *s)進(jìn)入無限循環(huán),在線程中調(diào)用accept函數(shù),用來接受來自客戶端的連接請求,每當(dāng)一個連接請求到來時,accept()函數(shù)將產(chǎn)生一個新的套接字,利用這個套接字產(chǎn)生一個新的線程與客戶端進(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)建線程不成功返回錯誤 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、啟動連接通信進(jìn)程在啟動注冊登錄線程以后,接受來自客戶端的連接請求,并且產(chǎn)生一個新的線程talktoclient(void *cs)與客戶端進(jìn)行通信并讀寫數(shù)據(jù)庫,通信完畢后關(guān)閉該套接字和線程,原來的偵聽套接字繼續(xù)處于偵聽狀態(tài)。創(chuàng)建聊天通信服務(wù)器進(jìn)程,想關(guān)閉時則調(diào)用terminateprocess(m_hprocchat, 2)函數(shù)關(guān)閉此進(jìn)程。源代碼如下:void cchatsvrdlg:onbtnrunchat() /啟動通信服務(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. ./通過啟動通信服務(wù)器轉(zhuǎn)發(fā)信息 ) . 2.3、關(guān)閉注冊/登錄服務(wù)器線程當(dāng)用戶結(jié)束通信后可通過關(guān)閉服務(wù)器線程來結(jié)束此次聊天。源代碼如下所示:void cchatsvrdlg:onbtnclose() if (afxmessagebox("真的要關(guān)閉注冊登錄服務(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)程終止時有信號.void cchatsvrdlg:ondestroy() /關(guān)閉通信服務(wù)器cdialog:ondestroy();if (null != m_hprocchat)terminateprocess(m_hprocchat, 2);3、
44、 通信服務(wù)器設(shè)計3.1、發(fā)送消息線程采用的是共享數(shù)據(jù)結(jié)構(gòu)方式,通過通信服務(wù)器進(jìn)行數(shù)據(jù)的轉(zhuǎn)發(fā)實現(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è)計在本次數(shù)據(jù)庫設(shè)計中,只涉及到了數(shù)據(jù)的查詢、插入;首先說一下服務(wù)器與數(shù)據(jù)庫的查詢,從數(shù)據(jù)庫中查詢注冊用戶信息是否存在,如果存在則反饋給用戶exist,并且結(jié)束這次查詢,進(jìn)入下一個查詢;首先數(shù)據(jù)庫中查詢是按用戶名查詢的,打開數(shù)據(jù)庫,看是否是數(shù)據(jù)庫的結(jié)尾,如果不是結(jié)尾則一直查到數(shù)據(jù)庫的末尾,代碼如下:cuser rec;rec.m_strsort = "username" /按用戶名查詢rec.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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 長春大學(xué)旅游學(xué)院《數(shù)理方程二》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇省泰州市泰興市2025屆初三3月統(tǒng)一測試(一模)數(shù)學(xué)試題含解析
- 楊凌職業(yè)技術(shù)學(xué)院《唐詩和唐宋詞經(jīng)典導(dǎo)讀》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東省廣饒縣2024-2025學(xué)年3月初三教學(xué)測試(一)化學(xué)試題含解析
- 山東省聊城冠縣聯(lián)考2024-2025學(xué)年初三物理試題第一次診斷性檢測試題含解析
- 江蘇揚州2024-2025學(xué)年數(shù)學(xué)五下期末聯(lián)考試題含答案
- 嘉應(yīng)學(xué)院《護(hù)理與醫(yī)療保健》2023-2024學(xué)年第一學(xué)期期末試卷
- 山東省棗莊市第三十二中學(xué)2024-2025學(xué)年初三下學(xué)期第一次質(zhì)量檢測試題(數(shù)學(xué)試題理)試題含解析
- 上陰影的課件
- 山西同文職業(yè)技術(shù)學(xué)院《高級醫(yī)學(xué)統(tǒng)計學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- GB/T 38615-2020超聲波物位計通用技術(shù)條件
- 商業(yè)銀行經(jīng)營管理學(xué)商業(yè)銀行資產(chǎn)負(fù)債管理課件
- 智慧環(huán)衛(wèi)大數(shù)據(jù)信息化云平臺建設(shè)和運營綜合解決方案
- 2022Z世代洞察報告QuestMobile
- 中國制造業(yè)數(shù)字化轉(zhuǎn)型研究報告
- 申請法院調(diào)查取證申請書(調(diào)取銀行資金流水)
- 辦公室事故防范(典型案例分析)
- 三治融合課件講解
- 第二部分-CPO-10中央機(jī)房優(yōu)化控制系統(tǒng)
- 設(shè)計概論重點知識
- 留仙洞總部基地城市設(shè)計
評論
0/150
提交評論