版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 2007屆畢業(yè)生</b></p><p><b> 畢業(yè)論文</b></p><p> 題 目: 基于LAN的聊天系統(tǒng) </p><p> 院系名稱(chēng): 信息科學(xué)與工程學(xué)院 </p><p>
2、 專(zhuān)業(yè)班級(jí): 計(jì)算機(jī)科學(xué)與技術(shù)03級(jí)2班 </p><p> 2007年 6月 5 日</p><p> Title Chats the system based on LAN </p><p><b> Abstract</b></p><
3、;p> Along with the network technology rapid development, the network the role which acts in people's life more and more many, also is more and more important, we may draw support from the network to carry on the
4、on-line shopping, on-line to seek medical help ask the medicine, the on-line bank, the on-line registration and so on. Our interpersonal relationship network also may on-line carry on, the people may carry on the network
5、 through this space to chat, realize each other communication, exchanges</p><p> This procedure is also does not have the server based on LAN to chat the procedure, it has chats function and so on historica
6、l record inquiry and on-line personnel management which, the file transfer, chats. The user after uses this procedure to register, can broadcast on oneself the line information by the UDP text of a telegram form to the e
7、ntire network, after other on-line users receive on the new user the line news, can automatically add to it in the friend chain table; Moreover, the user w</p><p> Key word: LAN chats the file transfer c
8、hats the record</p><p><b> 目 次 </b></p><p><b> 1.概述1</b></p><p> 1.1 研究的背景和現(xiàn)狀1</p><p> 1.2 研究的目的、內(nèi)容和意義2</p><p> 1.3 課題的基
9、本內(nèi)容2</p><p> 2. 主要技術(shù)介紹4</p><p> 2.1 Windows Sockets API 編程技術(shù)4</p><p> 2.1.1 Socket基本概念4</p><p> 2.1.2 Socket分類(lèi)4</p><p> 2.1.3 WinSock API 編程
10、4</p><p> 2.2 MFC Socket 編程技術(shù)5</p><p> 2.2.1 CAsyncSocket類(lèi)7</p><p> 2.2.2 CSocket類(lèi)9</p><p> 2.3 XML DOM技術(shù)基本知識(shí)9</p><p> 2.3.1 XML 概述10</p>
11、<p> 2.3.2 DOM 接口10</p><p> 2.3.3創(chuàng)建DOM文檔對(duì)象11</p><p> 2.3.4加載XML文檔11</p><p> 2.3.5遍歷XML文檔12</p><p> 2.4多線程技術(shù)13</p><p> 2.4.1 創(chuàng)建多線程程序13<
12、/p><p> 2.4.2 線程同步14</p><p> 3 系統(tǒng)功能分析16</p><p> 3.1在線朋友維護(hù)16</p><p> 3.1.1朋友上線16</p><p> 3.1.2朋友下線16</p><p> 3.1.3名字修改17</p>&l
13、t;p> 3.2聊天功能17</p><p> 3.3文件傳輸功能17</p><p> 3.3.1.文件傳輸功能17</p><p> 3.3.2.支持文件拖拽18</p><p> 3.4查看聊天紀(jì)錄18</p><p> 4.詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)19</p><p>
14、;<b> 4.1類(lèi)設(shè)計(jì)19</b></p><p> 4.1.1系統(tǒng)生成類(lèi)19</p><p> 4.1.2.創(chuàng)建類(lèi)19</p><p> 4.2詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)19</p><p> 4.2.1 UDP廣播實(shí)現(xiàn)朋友上線19</p><p> 4.2.2 朋友下線通知21&
15、lt;/p><p> 4.2.3 XML聊天報(bào)文發(fā)送22</p><p> 4.2.4 聊天報(bào)文接收22</p><p> 4.2.5 查看聊天歷史紀(jì)錄23</p><p> 4.2.6 文件發(fā)送24</p><p> 4.2.7 文件接收24</p><p> 4.2.8 拖
16、拽文件實(shí)現(xiàn)25</p><p> 5 系統(tǒng)調(diào)試與運(yùn)行26</p><p> 5.1 系統(tǒng)調(diào)試26</p><p> 5.2 系統(tǒng)運(yùn)行26</p><p><b> 結(jié) 論27</b></p><p><b> 致 謝28</b></p&
17、gt;<p><b> 參考文獻(xiàn)29</b></p><p><b> 1.概述</b></p><p> 1.1 研究的背景和現(xiàn)狀</p><p> 隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,網(wǎng)絡(luò)在人們的生活中所扮演的角色越來(lái)越多,也越來(lái)越重要。我們可以借助網(wǎng)絡(luò)進(jìn)行網(wǎng)上購(gòu)物、網(wǎng)上求醫(yī)問(wèn)藥、網(wǎng)上銀行、網(wǎng)上報(bào)名等。我們
18、的人際關(guān)系網(wǎng)也可以在網(wǎng)上進(jìn)行,人們可以通過(guò)這個(gè)空間進(jìn)行網(wǎng)絡(luò)聊天,實(shí)現(xiàn)彼此溝通,交換信息,甚至網(wǎng)絡(luò)聊天工具在部分人的生活中大有與傳統(tǒng)的電話(huà)通信手段同等重要的趨勢(shì)。</p><p> 隨著局域網(wǎng)技術(shù)的發(fā)展,大多企事業(yè)單位或公司構(gòu)建了本單位的局域網(wǎng)。利用基于LAN的聊天系統(tǒng)交流工作經(jīng)驗(yàn)或是彼此通告工作進(jìn)程,既可以節(jié)約時(shí)間、及時(shí)知道彼此的信息或工作進(jìn)度,而且不會(huì)帶來(lái)例如外網(wǎng)入侵或是病毒感染等安全隱患問(wèn)題。使用基于LAN
19、的聊天系統(tǒng),使交流工作經(jīng)驗(yàn)或彼此通告工作進(jìn)程變的更加方便快捷,同時(shí)也促進(jìn)了單位的發(fā)展,使本單位在激烈的競(jìng)爭(zhēng)環(huán)境中更具有優(yōu)勢(shì)。</p><p> 目前,國(guó)內(nèi)外研究基于LAN的聊天系統(tǒng)基本上有兩種模式:</p><p> (1)采用客戶(hù)端/服務(wù)器模型。用戶(hù)上線時(shí),要先向服務(wù)器請(qǐng)求建立連接,服務(wù)器同意建立連接后,用戶(hù)將個(gè)人信息送交服務(wù)器;服務(wù)器則給此用戶(hù)分配相關(guān)資源并建立相關(guān)服務(wù)線程,同時(shí),
20、服務(wù)器向其他在線用戶(hù)發(fā)送此用戶(hù)上線消息和其個(gè)人信息,并將當(dāng)前所有在線用戶(hù)的信息發(fā)給新上線的用戶(hù)。這時(shí),新上線的用戶(hù)就可以和其他在線用戶(hù)進(jìn)行聊天或是文件傳送。聊天內(nèi)容的傳送或文件傳輸有兩種解決方法:</p><p> ①先傳給服務(wù)器,然后再由服務(wù)器轉(zhuǎn)發(fā)。這種方法資源共享的程度很高,但由于所有數(shù)據(jù)都要經(jīng)過(guò)服務(wù)器,服務(wù)器的負(fù)擔(dān)很重。因此,這種方法常用于有大量數(shù)據(jù)需要共享的單位。</p><p>
21、; ?、谥苯影l(fā)送到接收用戶(hù)。服務(wù)器將每個(gè)上線用戶(hù)的個(gè)人信息與其網(wǎng)絡(luò)地址發(fā)送給其余上線用戶(hù),當(dāng)一個(gè)用戶(hù)向另一個(gè)用戶(hù)發(fā)送信息或是傳送文件時(shí),直接傳送到接收用戶(hù)的電腦上。這種方法的優(yōu)缺點(diǎn)與前一種剛好相反,其常用于資源共享程度不高的小公司里。</p><p> (2)采用對(duì)等模型。此模型沒(méi)有服務(wù)器,用戶(hù)上線、下線和用戶(hù)維護(hù)等功能都由個(gè)人電腦完成。當(dāng)用戶(hù)上線時(shí),運(yùn)行在本機(jī)上的程序完成初始化的工作,并啟動(dòng)聊天、文件傳輸?shù)确?/p>
22、務(wù),初始化工作做好以后,運(yùn)行程序向整個(gè)局域網(wǎng)發(fā)送用戶(hù)上線消息和個(gè)人信息及網(wǎng)絡(luò)地址,以后運(yùn)行程序會(huì)每隔一定時(shí)間發(fā)送自己在線的消息。用戶(hù)發(fā)送自己上線或在線消息的同時(shí),它也監(jiān)聽(tīng)網(wǎng)絡(luò)上是否有別的用戶(hù)發(fā)送上線或在線消息,當(dāng)接收到用戶(hù)上線或在線消息時(shí),讀取此用戶(hù)的個(gè)人信息并檢查朋友列表中是否已有此朋友,如有則不做任何工作,沒(méi)有就將此用戶(hù)加到朋友列表中。當(dāng)用戶(hù)下線時(shí),程序會(huì)向整個(gè)網(wǎng)絡(luò)廣播自己下線的消息,收到該消息的在線用戶(hù)將下線用戶(hù)從在線朋友列表中刪
23、除,如果此時(shí)有與下線用戶(hù)進(jìn)行聊天或文件傳輸?shù)?,聊天或文件傳輸中止?lt;/p><p> 對(duì)比這兩種模型,對(duì)等模型適合一般資金力量較弱、數(shù)據(jù)共享不多的單位,對(duì)運(yùn)行所需的網(wǎng)絡(luò)環(huán)境、機(jī)器配置要求一般;開(kāi)發(fā)工具和環(huán)境簡(jiǎn)單;容易維護(hù)等優(yōu)勢(shì)。</p><p> 1.2 研究的目的、內(nèi)容和意義</p><p> 在企事業(yè)單位中,為了交流工作經(jīng)驗(yàn)或是幾個(gè)人合作完成某項(xiàng)工作,采取
24、的開(kāi)會(huì)的方式既浪費(fèi)時(shí)間又沒(méi)有很好的實(shí)時(shí)性。隨著LAN技術(shù)的發(fā)展,大多企事業(yè)單位建立了自己的LAN,利用基于LAN的聊天系統(tǒng)來(lái)彼此交流工作經(jīng)驗(yàn)或是彼此通告工作進(jìn)程,既節(jié)約時(shí)間又可以及時(shí)知道彼此的信息。</p><p> 該程系統(tǒng)沒(méi)有服務(wù)器,它具有聊天、文件傳輸、聊天的歷史紀(jì)錄查詢(xún)和在線人員管理等功能。用戶(hù)在使用本程序登錄后,會(huì)以UDP報(bào)文的形式向整個(gè)網(wǎng)絡(luò)廣播自己上線的信息,其他在線用戶(hù)收到新用戶(hù)上線的消息后,會(huì)自
25、動(dòng)將其加到朋友鏈表中;而且,用戶(hù)在登錄以后會(huì)每隔一定時(shí)間以UDP報(bào)文的形式向整個(gè)網(wǎng)絡(luò)廣播自己在線的消息。聊天報(bào)文UDP的形式從一個(gè)用戶(hù)向指定用戶(hù)傳送。文件傳輸采用TCP/IP協(xié)議,以保證文件的傳輸。</p><p> 使用基于LAN的聊天系統(tǒng)使交流工作經(jīng)驗(yàn)或彼此通告工作進(jìn)程變的更加方便快捷,同時(shí)也促進(jìn)了單位的發(fā)展,使本單位在競(jìng)爭(zhēng)激烈的環(huán)境中更具有優(yōu)勢(shì)。</p><p> 1.3 課題的
26、基本內(nèi)容</p><p> 基于LAN的聊天系統(tǒng)的主要功能是以網(wǎng)絡(luò)為載體進(jìn)行信息的傳遞,其主要實(shí)現(xiàn)四個(gè)功能:</p><p> (1)在線朋友維護(hù)。在線朋友維護(hù)部分包括在線用戶(hù)的顯示、用戶(hù)昵稱(chēng)的修改、實(shí)時(shí)更新(上線、下線)。只要有用戶(hù)上線,所有在線的朋友都可以知道,并且可以和他聊天及進(jìn)行文件的傳輸。使用本系統(tǒng)的用戶(hù),可以看到在線朋友的昵稱(chēng),并根據(jù)昵稱(chēng)來(lái)進(jìn)行聊天、文件傳輸功能。當(dāng)朋友下線
27、的時(shí)候,在線的人都可以得到通知,同時(shí)這個(gè)朋友的昵稱(chēng)從朋友列表中消失,如果正在和這個(gè)朋友進(jìn)行文件傳輸,那么文件傳輸中止,如果正在和這個(gè)朋友聊天,那么和這個(gè)朋友的聊天也中止。在線朋友的維護(hù)采用高效的雙向鏈表作為數(shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都是一個(gè)指向CFriendObj的指針。整個(gè)系統(tǒng)中只有一條在線朋友的鏈表,為了方便使用,它作為主窗口類(lèi) CNetMsgDlg的靜態(tài)成員出現(xiàn)。</p><p> (2)聊天功能。本功能就是在
28、線雙方互相傳遞信息的功能,它包括一般文字的傳輸和文件的傳輸兩部分。只要在線就可以和所有使用此系統(tǒng)的已經(jīng)在線的朋友進(jìn)行聊天,并且為不同的朋友提供不同的聊天窗口,在這個(gè)聊天窗口中,要提供聊天信息的輸入和聊天信息的顯示功能。當(dāng)一次聊天信息發(fā)送沒(méi)有結(jié)束時(shí),不能進(jìn)行新的聊天內(nèi)容的輸入。另外,發(fā)送的信息都應(yīng)該保存起來(lái),以備“查看歷史紀(jì)錄”功能使用。</p><p> (3)文件傳輸功能。文件傳輸功能由兩個(gè)子功能組成:①文件
29、傳輸功能,因?yàn)槲募鬏敱仨毚_定接收方,因此本系統(tǒng)將此功能放在聊天窗口中,當(dāng)點(diǎn)擊傳輸文件的按鈕后,提供選擇文件的通用對(duì)話(huà)框,系統(tǒng)通過(guò)此通用對(duì)話(huà)框窗口來(lái)幫助用戶(hù)找到要傳送的文件,確認(rèn)要進(jìn)行文件傳輸后,這個(gè)文件會(huì)通過(guò)局域網(wǎng)傳送到與自己聊天的朋友的機(jī)器上,并且接受者收到這個(gè)文件后會(huì)被系統(tǒng)自動(dòng)放到一個(gè)指定的目錄下;②支持文件拖拽,此功能支持用戶(hù)將文件直接拖拽到和這個(gè)朋友的聊天窗口之上進(jìn)行傳輸文件的選擇(在拖拽的時(shí)候系統(tǒng)就不再提示)。</p&
30、gt;<p> (4)查看歷史紀(jì)錄信息。系統(tǒng)在發(fā)送和接收聊天內(nèi)容時(shí),會(huì)把這個(gè)信息按照聊天對(duì)象的昵稱(chēng)進(jìn)行保存,當(dāng)用戶(hù)選擇查看聊天信息時(shí),系統(tǒng)會(huì)調(diào)出與特定聊天對(duì)象的信息,讓用戶(hù)進(jìn)行查看。</p><p> 另外,朋友上線、下線采用UDP報(bào)文的形式向整個(gè)局域網(wǎng)廣播,所有使用本系統(tǒng)的在線用戶(hù)都會(huì)收到該報(bào)文并進(jìn)行相關(guān)的朋友維護(hù)和其他操作;聊天信息以UDP報(bào)文的形式從發(fā)送方向接收方傳送;文件傳輸采用TCP協(xié)
31、議以保證傳送的文件可靠、正確地被接收方接收。</p><p><b> 2. 主要技術(shù)介紹</b></p><p> 2.1 Windows Sockets API 編程技術(shù)</p><p> 2.1.1 Socket基本概念</p><p> 套接字(Socket)最初是由加利福尼亞大學(xué)Berkeley
32、分校,為UNIX操作系統(tǒng)開(kāi)發(fā)的網(wǎng)絡(luò)通信接口。由于Socket在網(wǎng)絡(luò)通信編程時(shí)使用非常方便簡(jiǎn)潔,同時(shí)也隨著UNIX操作系統(tǒng)的廣泛使用,套接字成為當(dāng)前最流行的網(wǎng)絡(luò)通信應(yīng)用程序接口之一。被移植到許多非UNIX系統(tǒng)中,其中Windows下的WinSock就是在繼承了Berkeley Sockets主要特征的基礎(chǔ)上,又對(duì)它進(jìn)行了重要補(bǔ)充。</p><p> 套接字是一種雙向的通信端口,可以通過(guò)這個(gè)端口與任何一個(gè)具有Soc
33、ket端口的計(jì)算機(jī)通信,套接字四網(wǎng)絡(luò)通信的基礎(chǔ)。Socket在Windows以句柄的形式被創(chuàng)建。使用Socket進(jìn)行網(wǎng)絡(luò)通信必須包含下面的幾種信息:雙方認(rèn)可的協(xié)議,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口,對(duì)方主機(jī)的IP地址,對(duì)方進(jìn)程的協(xié)議端口。</p><p> 2.1.2 Socket分類(lèi)</p><p> 套接字可以分為數(shù)據(jù)報(bào)套接字和流式套接字兩種,下面對(duì)這兩種套接字進(jìn)行簡(jiǎn)單地介
34、紹。</p><p> (1)數(shù)據(jù)報(bào)套接字(Datagram Sockets)</p><p> 對(duì)于在TCP/IP上實(shí)現(xiàn)的WinSock,數(shù)據(jù)報(bào)套接字使用用戶(hù)數(shù)據(jù)報(bào)協(xié)議(UDP)。</p><p> 數(shù)據(jù)報(bào)套接字提供了一種不可靠的、非連接的數(shù)據(jù)包通信方式。“不可靠”的意</p><p> 思是指發(fā)送一個(gè)數(shù)據(jù)包不能保證被接收方接收,也
35、不能保證數(shù)據(jù)包按照發(fā)送順序到達(dá)接收方。實(shí)際使用中,同一個(gè)分組數(shù)據(jù)報(bào)可能不止一次地被發(fā)送,一般要等到接收方發(fā)回確認(rèn)收到的消息才會(huì)停止發(fā)送。</p><p> (2)流式套接字(Stream Sockets)</p><p> 流式套接字使用傳輸控制協(xié)議(TCP)。流式套接字可以將數(shù)據(jù)按順序無(wú)重復(fù)地發(fā)送到目的地,它提供的是一種可靠的、面向連接的數(shù)據(jù)傳輸方式。不管是對(duì)單個(gè)的數(shù)據(jù)報(bào),還是對(duì)數(shù)據(jù)
36、包,流式套接字都提供了一種流式數(shù)據(jù)傳輸。</p><p> 2.1.3 WinSock API 編程</p><p> WinSock是Microsoft公司在繼承了Berkeley Sockets主要特征的基礎(chǔ)上,并對(duì)其進(jìn)行了重要補(bǔ)充之后的產(chǎn)物,是Windows Sockets規(guī)范的簡(jiǎn)稱(chēng),為開(kāi)發(fā)人員提供了一套Windows操作系統(tǒng)上的開(kāi)放的、支持多種協(xié)議網(wǎng)絡(luò)編程接口。從1.0版到2.
37、0.8版,經(jīng)過(guò)不斷完善,事實(shí)上已經(jīng)成了Windows網(wǎng)絡(luò)編程標(biāo)準(zhǔn)。</p><p> 為簡(jiǎn)化網(wǎng)絡(luò)編程,Microsoft公司又將這些WinSock API進(jìn)行了面相對(duì)象的封裝,在MFC類(lèi)庫(kù)中提供了兩個(gè)用于WinSock編程的類(lèi),即:CAsyncSocket和CSocket。</p><p> 在Visual C++中使用Windows Sockets編寫(xiě)網(wǎng)絡(luò)應(yīng)用程序,需要使用下面三個(gè)文
38、件:</p><p> (1)WINSOCK.H:這是WinSock API的頭文件。</p><p> (2)WSOCK32.LIB:WINSOCK API 連接庫(kù)文件。在使用中,一定要把它作為項(xiàng)目的非缺省的連接庫(kù)包含到項(xiàng)目文件中去。</p><p> (3)WINSOCK.DLL:WinSock的動(dòng)態(tài)連接庫(kù),位于WINDOWS的安裝目錄下。</p&g
39、t;<p> 在保證以上文件存在或包含到工程后,就可以使用WinSock API中的函數(shù)進(jìn)行Socket程序的編寫(xiě)。</p><p> 我們知道,一般情況下使用Socket編寫(xiě)的網(wǎng)絡(luò)應(yīng)用程序是服務(wù)器/客戶(hù)機(jī)架構(gòu)的,因此下面給出流式套接字和數(shù)據(jù)報(bào)套接字這兩種套接字的編程模型。</p><p> (1)數(shù)據(jù)報(bào)套接字的編程模型。如圖2-1所示。</p><
40、p> (2)流式套接字的編程模型。如圖2-2所示。</p><p> 2.2 MFC Socket 編程技術(shù)</p><p> MFC是對(duì)API的封裝,MFC針對(duì)WinSock API封裝了兩個(gè)類(lèi):CAsyncSocket和CSocket。因此,使用這兩個(gè)類(lèi)進(jìn)行Socket網(wǎng)絡(luò)程序的編寫(xiě)會(huì)比API方便一些。</p><p> MFC中Socket相關(guān)類(lèi)
41、的繼承關(guān)系如圖2-3所示。 </p><p> CAsyncSock對(duì)WinSock API進(jìn)行了較低程度的封裝,缺省情況下建立的Socket是異步操作方式,即非阻塞式的,因此一些阻塞操作,需要自己動(dòng)手完成。另外,由于它對(duì)API的封裝程度不高,以前在WinSock API中需要自己完成的工作(比如:字節(jié)順序的轉(zhuǎn)換),仍然需要自己完成。當(dāng)然有許多程序員喜
42、歡使用該類(lèi)甚至WinSock API,原因是這些方法具有很大的靈活性,給程序員以較大的發(fā)揮空間。</p><p> 為了給程序員提供更方便的接口以自動(dòng)處理網(wǎng)絡(luò)通信中的一些任務(wù),MFC在CAsyncSocket類(lèi)的基礎(chǔ)上派生了CSocket類(lèi),它提供了比CAsyncSocket更高層的WinSock API 接口。CSocket的網(wǎng)絡(luò)操作是同步方式,即阻塞式的。CSocket建立的Socket不是阻塞的,而是對(duì)
43、非阻塞的Socket進(jìn)行處理后實(shí)現(xiàn)的阻塞操作。在阻塞任務(wù)執(zhí)行過(guò)程中,Windows線程的消息循環(huán)仍然有效,也就是說(shuō)CSocket類(lèi)的阻塞操作不影響Windows的消息循環(huán)。</p><p> 圖2-1 數(shù)據(jù)報(bào)套接字編程模型</p><p> 圖2-2 流式套接字編程模型</p><p> 圖2-3 MFC Socket類(lèi)層次圖</p>&
44、lt;p> 簡(jiǎn)單了解了CAsyncSocket和CSocket類(lèi)之后,下面我們對(duì)這兩個(gè)類(lèi)的使用方法進(jìn)行簡(jiǎn)單的講解。</p><p> 2.2.1 CAsyncSocket類(lèi)</p><p> CAsyncSocket類(lèi)的編程模型簡(jiǎn)述如下:</p><p> 第一步:構(gòu)造一個(gè)CAsyncSocket對(duì)象,并用這個(gè)對(duì)象的Create成員函數(shù)來(lái)創(chuàng)建底層的套接
45、字,并且在Create函數(shù)中通過(guò)參數(shù)可以設(shè)定套接字的端口地址、事件通知、套接字的類(lèi)型。</p><p><b> 示例如下:</b></p><p><b> 第一種方法:</b></p><p> CAsyncSocket Sock;Sock.Create();</p><p> 使用
46、默認(rèn)參數(shù)產(chǎn)生的是一個(gè)流式套接字。</p><p><b> 第二種方法:</b></p><p> CAsyncSocket *pSocket=new CAsyncSocket;</p><p> Int nPort=5000;</p><p> pSocket->Create(nPort,SOCK_
47、DGRAM);</p><p> 第一種方法在棧上產(chǎn)生一個(gè)CAsyncSocket對(duì)象,第二種方法在堆上產(chǎn)生CAsyncSocket對(duì)象。第一種Create成員函數(shù)用缺省參數(shù)產(chǎn)生一個(gè)流式套接字,第二種Create成員函數(shù)用指定的端口和地址產(chǎn)生一個(gè)數(shù)據(jù)報(bào)套接字。</p><p> 第二步:如果創(chuàng)建的是流式套接字,那么就需要在客戶(hù)和服務(wù)器之間建立連接,因?yàn)橹挥性诳蛻?hù)和服務(wù)器之間建立了連接,
48、套接字才能進(jìn)行數(shù)據(jù)傳輸工作。如果是數(shù)據(jù)報(bào)套接字,則不需要建立連接,也就不需要調(diào)用Connect()函數(shù)。</p><p> (1)客戶(hù)方程序:用CAsyncSocket類(lèi)的Connect()成員函數(shù)連接到服務(wù)器方;</p><p> (2)服務(wù)器方程序:用CAsyncSocket的Listen()成員函數(shù)開(kāi)始監(jiān)聽(tīng),一旦收到連接請(qǐng)求,則調(diào)用CAsyncSocket的Accept()成員函
49、數(shù)開(kāi)始接收。</p><p> 第三步:完成了Socket的創(chuàng)建和通信雙方的連接后,該到了相互傳輸信息的時(shí)候了。</p><p> (1)對(duì)于數(shù)據(jù)報(bào)套接字。發(fā)送數(shù)據(jù)函數(shù):SendTo();接收數(shù)據(jù)函數(shù):RecviveFrom()。</p><p> (2)對(duì)于流式套接字。發(fā)送數(shù)據(jù)函數(shù):Send();接收數(shù)據(jù)函數(shù):Receive()。</p>&l
50、t;p> 第四步:通訊結(jié)束后,有兩件事情需要做。</p><p> (1)調(diào)用CAsyncSocket類(lèi)的成員函數(shù)Close();</p><p> (2)銷(xiāo)毀CAsyncSocket對(duì)象;</p><p> 如果是在棧上產(chǎn)生的CAsyncSocket對(duì)象,則對(duì)象超出定義的范圍時(shí)自動(dòng)被析構(gòu);如果是在堆上產(chǎn)生,也就是用了new這個(gè)操作符,則必須使用del
51、ete操作符銷(xiāo)毀CAsyncSocket對(duì)象,否則將造成內(nèi)存泄露。</p><p> 下面介紹CAsyncSocket類(lèi)的事件通知處理函數(shù)。</p><p> 當(dāng)網(wǎng)絡(luò)事件產(chǎn)生時(shí),Socket會(huì)收到一個(gè)WM_SOCK_NOTIFY消息,于是CAsyncSocket類(lèi)的消息處理函數(shù)OnSocketNotify執(zhí)行,而這個(gè)消息處理函數(shù)會(huì)調(diào)用CAsyncSocket類(lèi)的DoCallBack()
52、成員函數(shù)。在這個(gè)函數(shù)中,根據(jù)不同的網(wǎng)絡(luò)事件調(diào)用了不同的網(wǎng)絡(luò)事件處理函數(shù)。注:WM_SOCK_NOTIFY消息及消息處理函數(shù)是MFC的類(lèi)完成的工作。</p><p> 下面介紹這些事件通知處理函數(shù):</p><p> (1)OnSend()函數(shù):</p><p> OnSend()函數(shù)是FD_WRITE事件產(chǎn)生時(shí)的事件處理函數(shù),當(dāng)能夠發(fā)送數(shù)據(jù)時(shí)就產(chǎn)生FD_WRI
53、TE事件通知,OnSend()函數(shù)就會(huì)被調(diào)用,因此,一般把發(fā)送數(shù)據(jù)的網(wǎng)絡(luò)I/O操作放到OnSend()函數(shù)中進(jìn)行。</p><p> (2)OnReceive()函數(shù)</p><p> OnReceive()函數(shù)和OnSend()函數(shù)被調(diào)用的原理相同,當(dāng)接收緩沖區(qū)中有數(shù)據(jù)時(shí)就產(chǎn)生FD_READ事件通知,然后OnReceive()被調(diào)用。</p><p> (3
54、)OnAccept()函數(shù)</p><p> 當(dāng)負(fù)責(zé)監(jiān)聽(tīng)的Socket接收到FD_ACCEPT事件通知時(shí),會(huì)導(dǎo)致OnAccept()函數(shù)的執(zhí)行。</p><p> (4)OnConnect()函數(shù)</p><p> 當(dāng)主動(dòng)請(qǐng)求連接的Socket連接完成后(連接可能是成功的,也可能是失敗的)會(huì)導(dǎo)致OnConnect()函數(shù)的調(diào)用。</p><
55、p> 2.2.2 CSocket類(lèi)</p><p> 在MFC的類(lèi)層次關(guān)系中,CSocket類(lèi)是CAsyncSocket類(lèi)的派生類(lèi),它在基類(lèi)的基礎(chǔ)上加入了阻塞處理,并且可以和CSocketFile類(lèi)以CArchive類(lèi)聯(lián)合工作完成數(shù)據(jù)的發(fā)送和接收任務(wù),從而避免了處理字節(jié)順序等問(wèn)題。</p><p> 提示:由于CSocket類(lèi)的阻塞處理,使得OnConnect()和OnSend
56、()事件通知處理函數(shù)從來(lái)不能被調(diào)用。除了這個(gè)之外,其他的事件通知處理函數(shù)仍可使用。CSocket類(lèi)的阻塞工作方式并不影響Windows的消息循環(huán)。要想利用CSocket類(lèi)和CSocketFile及CArchive類(lèi)共同完成數(shù)據(jù)的發(fā)送和接收工作,要求CSocket創(chuàng)建的套接字是流式套接字。</p><p> 下面介紹CSocket類(lèi)的變成模式。</p><p> 第一步:構(gòu)造一個(gè)CSoc
57、ket對(duì)象;</p><p> 第二步:創(chuàng)建一個(gè)底層套接字;</p><p><b> 第三步:建立連接;</b></p><p> 對(duì)于客戶(hù)端套接字來(lái)說(shuō),如果是流式套接字,則調(diào)用從CAsyncSocket類(lèi)繼承來(lái)的Connect()函數(shù)與服務(wù)器套接字建立連接;如果是數(shù)據(jù)報(bào)套接字,不需要和服務(wù)器建立連接,也就不需要調(diào)用Connect()函
58、數(shù)。</p><p> 對(duì)于服務(wù)器端套接字來(lái)說(shuō),則調(diào)用從CAsyncSocket類(lèi)繼承來(lái)的listen()函數(shù)進(jìn)行監(jiān)聽(tīng)來(lái)自客戶(hù)端的連接請(qǐng)求,收到連接請(qǐng)求后,調(diào)用CAsyncSocket類(lèi)的Accept()函數(shù)接受請(qǐng)求,建立連接。</p><p> 第四步:發(fā)送和接收數(shù)據(jù);</p><p> 第五步:通訊結(jié)束后的工作是做一些清除性工作。</p>&
59、lt;p> 調(diào)用Close()函數(shù),用來(lái)釋放與套接字相關(guān)的資源;銷(xiāo)毀CArchive、CSocketFile和CSocket對(duì)象。</p><p> 2.3 XML DOM技術(shù)基本知識(shí)</p><p> 這里將對(duì)XML DOM接口、創(chuàng)建DOM文檔對(duì)象方法、加載XML文件、遍歷XML文檔的方法做比較詳細(xì)的講解,希望大家掌握在Visual C++中操作XML文檔的方法。</p
60、><p> 2.3.1 XML 概述</p><p> XML是繼HTML之后發(fā)展起來(lái)的一種可擴(kuò)展的標(biāo)記語(yǔ)言。在XML之前還有一種功能非常強(qiáng)大的標(biāo)記語(yǔ)言,就是SGML,可是SGML過(guò)于復(fù)雜,以至于使這種語(yǔ)言的解釋器編寫(xiě)起來(lái)很困難。1996年,W3C開(kāi)始設(shè)計(jì)一種可擴(kuò)展的標(biāo)記語(yǔ)言,這種語(yǔ)言能夠具有SGML的靈活性和強(qiáng)大功能,同時(shí)又具有HTML的簡(jiǎn)單性,最后設(shè)計(jì)的成果就是XML,是在1998年由
61、W3C推薦使用的標(biāo)準(zhǔn)。</p><p> XML是一種存放文本數(shù)據(jù)很好的方法,與HTML相比,具有很大的靈活性。目前,XML已經(jīng)逐步為廣大程序員所認(rèn)同,也逐漸成為網(wǎng)絡(luò)信息傳遞的一種相當(dāng)不錯(cuò)的標(biāo)記語(yǔ)言,雖然目前HTML語(yǔ)言仍然在不少網(wǎng)頁(yè)中使用。曾經(jīng)有人把XML稱(chēng)為“Web上的ASCII碼”,更為甚者,有人把它和大型關(guān)系數(shù)據(jù)庫(kù)相比,預(yù)言它有可能會(huì)取代大型關(guān)系數(shù)據(jù)庫(kù),這些確實(shí)有些夸張,可是也充分說(shuō)明了XML即將在網(wǎng)絡(luò)
62、應(yīng)用中占據(jù)的地位。</p><p> 2.3.2 DOM 接口</p><p> DOM是描述XML文檔中節(jié)點(diǎn)和節(jié)點(diǎn)之間關(guān)系的一種方式,DOM是以節(jié)點(diǎn)的層次結(jié)構(gòu)關(guān)系來(lái)組織數(shù)據(jù)的,因此,它是一種樹(shù)型結(jié)構(gòu),圖2-4描述了DOM組織數(shù)據(jù)的方式。</p><p> DOM提供了一些API編程人員可以使用這些API在樹(shù)的任何地方添加、編輯、移動(dòng)或刪除節(jié)點(diǎn)。Microso
63、ft在IE4.0以后就在系統(tǒng)中加入了msxml.dll——MSXML組件。</p><p> 在MSXML中包含的對(duì)象有:</p><p> (1)XMLDOMDocument:頂端XML樹(shù)的結(jié)點(diǎn),也是XML的根元素。</p><p> (2)XMLDOMNode:XML中的一個(gè)結(jié)點(diǎn)對(duì)象。</p><p> (3)XMLDOMNode
64、List:結(jié)點(diǎn)對(duì)象的集合。</p><p> (4)XMLDOMNamedNodeMap:用來(lái)遍歷和訪問(wèn)屬性的集合。</p><p> (5)XMLDOMParseError:XML訪問(wèn)過(guò)程之中產(chǎn)生的錯(cuò)誤的對(duì)象。</p><p> (6)XMLHttpRequest:支持HTTP Server提供的客戶(hù)端的協(xié)議對(duì)象。</p><p>
65、 (7)XTLRuntime:實(shí)現(xiàn)XSL樣式單中的方法。</p><p> 圖2-4 DOM 描述數(shù)據(jù)的方式</p><p> 2.3.3創(chuàng)建DOM文檔對(duì)象</p><p> 對(duì)DOM樹(shù)中的節(jié)點(diǎn)訪問(wèn)之前必須首先創(chuàng)建Document對(duì)象,這個(gè)對(duì)象是DOM樹(shù)的最高節(jié)點(diǎn),是訪問(wèn)XML文檔的入口。下面給出Visual C++中創(chuàng)建DOM文檔對(duì)象的示例代碼:<
66、/p><p> //********************************************</p><p> HRESULT hr;</p><p> IXMLDOMDocument *pXMLDoc;</p><p> hr =CoInitialize(NULL);//COM環(huán)境的初始化</p>&l
67、t;p> hr =CoCreateInstance(CLSID_DOMDocument,NULL,</p><p> CLSCTX_INPROC_SERVER,</p><p> IID_IXMLDOMDocument,</p><p> (void **)&pXMLDoc);</p><p> //*********
68、***********************************</p><p> 2.3.4加載XML文檔</p><p> 在MSXML DOM 接口中提供了兩種加載XML文檔的方法,一種是load方法,一種是LoadXML方法,下面分別給出示例代碼來(lái)說(shuō)明這兩種方法的使用。</p><p> (1)使用load方法加載XML文檔</p>
69、<p> IXMLDOMDocument::load方法的函數(shù)原型定義為:</p><p> HRESULT load(VARIANT xmlSource,VARIANT_BOOL *isSuccessful);</p><p> 假設(shè)要訪問(wèn)的XML文件的路徑及名稱(chēng)為:c:\alice\country.xml。使用load方法加載XML文檔的代碼示例:</p
70、><p> //********************************************</p><p> HRESULT hr;</p><p> IXMLDOMDocument *pXMLDoc;</p><p> hr =CoInitialize(NULL);//COM環(huán)境的初始化</p><
71、p> hr =CoCreateInstance(CLSID_DOMDocument,NULL,</p><p> CLSCTX_INPROC_SERVER,</p><p> IID_IXMLDOMDocument,</p><p> (void **)&pXMLDoc);</p><p> CString str
72、XMLFile = “c:\\alice\\country.xml”;</p><p> CComVariant varXMLFile(strXMLFile);</p><p> VARIANT_BOOL varBool;</p><p> PXMLDoc->load(varXMLFile,&varBool);</p>&l
73、t;p><b> …………</b></p><p> CoUninitialize();</p><p> //********************************************</p><p> Load方法是將XML文檔的全部?jī)?nèi)容加載,下面要講的LoadXML方法加載的不是XML文檔的全部?jī)?nèi)容,而是加載X
74、ML文檔中符合XML語(yǔ)法的XML片斷,當(dāng)然這個(gè)片斷也可以是XML文檔的全部?jī)?nèi)容。</p><p> (2)使用LoadXML方法加載XML文檔</p><p> IXMLDOMDocument::LoadXML函數(shù)原型定義如下:</p><p> HRESULT loadXML(BSTR xmlString,VARIANT_BOOL *isSuccessf
75、ul);</p><p> 假設(shè)前面給出的DOM樹(shù)型圖的XML文檔為:c:\alice\country.xml,其中的國(guó)家節(jié)點(diǎn)名稱(chēng)為country,省節(jié)點(diǎn)名稱(chēng)為province,縣節(jié)點(diǎn)名稱(chēng)為county,那么下面給出加載縣節(jié)點(diǎn)(即county節(jié)點(diǎn))片斷的示例代碼:</p><p> //********************************************</p
76、><p> HRESULT hr;</p><p> IXMLDOMDocument *pXMLDoc;</p><p> hr =CoInitialize(NULL);//COM環(huán)境的初始化</p><p> hr =CoCreateInstance(CLSID_DOMDocument,NULL,</p><p&
77、gt; CLSCTX_INPROC_SERVER,</p><p> IID_IXMLDOMDocument,</p><p> (void **)&pXMLDoc);</p><p> VARIANT_BOOL varBool;</p><p> PXMLDoc->load(varXMLFile,&varB
78、ool);</p><p><b> …………</b></p><p> CoUninitialize();</p><p> //********************************************</p><p> 2.3.5 遍歷XML文檔</p><p>
79、對(duì)XML文檔的遍歷就是對(duì)DOM樹(shù)的遍歷。與遍歷相關(guān)的DOM接口有:IXMLDOMNodeList、IXMLDOMNode,其中IXMLDOMNodeList接口表示的節(jié)點(diǎn)集合,IXMLDOMNode表示的一個(gè)節(jié)點(diǎn),在這兩個(gè)接口中給出了一系列訪問(wèn)XML文檔節(jié)點(diǎn)的方法,包括遍歷及取得節(jié)點(diǎn)的信息。不過(guò)首先要使用IXMLDOMDocument接口的getElementsByTagName函數(shù)或nodeFromID函數(shù)獲得IXMLDOMNodeL
80、ist接口對(duì)象,然后方能使用其中提供的方法。</p><p> (1)IXMLDOMDocument::getElementsByTagName方法</p><p> (2)IXMLDOMNodeList::get_length方法</p><p> (3)IXMLDOMNodeList::item方法</p><p> (4)IXM
81、LDOMNode::get_xml方法</p><p> (5)IXMLDOMNode::get_text方法</p><p> (6)IXMLDOMNode::get_chileNodes方法</p><p><b> 2.4多線程技術(shù)</b></p><p> 在Windows操作系統(tǒng)中,進(jìn)程是指由WIN32
82、裝載內(nèi)存的應(yīng)用程序。一個(gè)進(jìn)程包含一個(gè)或多個(gè)線程,并且是至少有一個(gè)線程。進(jìn)程是不活動(dòng)的,線程是代碼的執(zhí)行者。具體地說(shuō)線程是指進(jìn)程的一條執(zhí)行路徑,它包含獨(dú)立的堆棧和CPU寄存器狀態(tài),每個(gè)線程共享所有的進(jìn)程資源。一個(gè)進(jìn)程內(nèi)的所有線程使用同一個(gè)32位地址空間,而這些線程的執(zhí)行由系統(tǒng)調(diào)度程序控制,調(diào)度程序決定哪個(gè)線程可執(zhí)行及什么時(shí)候執(zhí)行線程。線程有優(yōu)先級(jí)別,優(yōu)先權(quán)較低的線程必須等到優(yōu)先權(quán)較高的線程執(zhí)行完任務(wù)后再執(zhí)行。當(dāng)進(jìn)程中所有的線程中止后,這個(gè)
83、進(jìn)程也就中止了。</p><p> 編寫(xiě)多線程程序,一定要注意線程的同步問(wèn)題。</p><p> 2.4.1 創(chuàng)建多線程程序</p><p> Windows的多任務(wù)體現(xiàn)在兩個(gè)方面:第一是多進(jìn)程;第二是多線程。</p><p> 當(dāng)需要網(wǎng)絡(luò)傳輸數(shù)據(jù)、后臺(tái)大量的數(shù)據(jù)計(jì)算等比較耗時(shí)的操作時(shí),用多線程是比較好的方法。在服務(wù)器/客戶(hù)端架構(gòu)的網(wǎng)
84、絡(luò)應(yīng)用程序中,服務(wù)器端專(zhuān)門(mén)用一個(gè)線程來(lái)負(fù)責(zé)監(jiān)聽(tīng)是否有客戶(hù)端請(qǐng)求連接,也是一個(gè)很不錯(cuò)的解決方案,下面我們介紹創(chuàng)建線程的方法。</p><p> (1)Windows API 方法</p><p><b> ?、賱?chuàng)建線程</b></p><p> 創(chuàng)建線程的函數(shù)原型如下:</p><p> HANDLE Creat
85、eThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,</p><p> DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,</p><p> LPVOID lpParameter, DWORD dwCreationFlags, </p><p&g
86、t; LPDWORD lpThreadId);</p><p><b> ?、谠O(shè)置線程優(yōu)先級(jí)</b></p><p><b> ?、壑兄咕€程</b></p><p> 當(dāng)線程的函數(shù)返回后,線程自動(dòng)中止。</p><p><b> (2)MFC方法</b></p&g
87、t;<p> MFC的線程分為兩類(lèi):一類(lèi)是工作線程,一類(lèi)是用戶(hù)界面線程。工作線程是指一些后臺(tái)運(yùn)行的線程,不需要用戶(hù)的交互。Visual C++中CWinApp就是一個(gè)典型的用戶(hù)界面線程。</p><p><b> 工作線程</b></p><p> a.創(chuàng)建工作線程 b.中止線程 c.線程函數(shù)。線程函數(shù)的格式:</p><p&
88、gt; UINT ThreadProc(LPVOID pParam);</p><p><b> ②用戶(hù)界面線程</b></p><p> a.從CWinThread派生線程類(lèi)</p><p> 從CWinThread類(lèi)中派生自己的線程類(lèi),有一點(diǎn)必須注意:必須在派生類(lèi)的頭文件中加入DECLARE_DYNCREATE宏,在源文件中加入
89、IMPLEMENT_DYNCREATE宏??梢灾剌d基類(lèi)的InitInstance和ExitInstance函數(shù),分別放入初始化代碼和結(jié)束工作的代碼。</p><p> b.創(chuàng)建線程并啟動(dòng)線程 </p><p> 當(dāng)線程創(chuàng)建成功并開(kāi)始執(zhí)行時(shí),線程類(lèi)的InitInstance函數(shù)總是首先被執(zhí)行。如果線程擁有窗口的話(huà),就應(yīng)該在這里進(jìn)行窗口的創(chuàng)建工作,并且把CWinThread類(lèi)的m_pMai
90、nWnd數(shù)據(jù)成員的值設(shè)置為新創(chuàng)建的窗口的地址值。</p><p> 2.4.2 線程同步</p><p> 多線程的方法確實(shí)能夠幫助我們解決一些復(fù)雜的問(wèn)題。創(chuàng)建線程的方法并不是很復(fù)雜,可是編寫(xiě)一個(gè)好的穩(wěn)健的多線程程序遠(yuǎn)不是想象中那么簡(jiǎn)單。由于一個(gè)進(jìn)程內(nèi)的所有線程共享同一地址空間,因此某個(gè)線程的操作會(huì)不會(huì)給其他線程的數(shù)據(jù)造成影響?比如,某個(gè)負(fù)責(zé)寫(xiě)數(shù)據(jù)的線程在沒(méi)有寫(xiě)完的時(shí)刻,另外一個(gè)負(fù)責(zé)讀
91、取這個(gè)數(shù)據(jù)的線程開(kāi)始工作,可想而知,讀出的數(shù)據(jù)肯定不是最后的結(jié)果。因此,線程的同步就是多線程程序多加關(guān)注的問(wèn)題。</p><p> 此外,不同進(jìn)程的線程訪問(wèn)同一內(nèi)存區(qū)域時(shí)也應(yīng)考慮線程的同步。下面介紹一些方法可以實(shí)現(xiàn)不同進(jìn)程的線程同步。</p><p> 下面我們從Windows API和MFC類(lèi)兩個(gè)方面介紹線程同步的方法。</p><p> (1)Windo
92、ws中的同步對(duì)象</p><p> ?、倩コ怏w(Mutex)對(duì)象的使用方法</p><p> a.創(chuàng)建互斥體對(duì)象;b.同步;c.釋放互斥體對(duì)象。</p><p> ?、谛盘?hào)燈(Semaphore)對(duì)象的使用方法</p><p> a創(chuàng)建信號(hào)燈;b同步。</p><p> ③事件(Event)對(duì)象的使用方法<
93、/p><p> a創(chuàng)建事件對(duì)象;b設(shè)置事件對(duì)象是否允許線程通過(guò);c同步。</p><p> ?、芘R界區(qū)(Critical Section)對(duì)象的使用方法</p><p> a創(chuàng)建臨界區(qū)對(duì)象;b同步。</p><p> (2)MFC提供的同步類(lèi)</p><p> 針對(duì)Windows提供的同步對(duì)象,MFC封裝了下面幾
94、個(gè)類(lèi):CMutex:互斥體類(lèi),CSemaphore:信號(hào)燈類(lèi),CEvent:事件類(lèi)和CCriticalSection:臨界區(qū)類(lèi)。在MFC的類(lèi)層次關(guān)系中,CSyncObject為上面四個(gè)類(lèi)的基類(lèi)。</p><p> 這四個(gè)類(lèi)的用法比較簡(jiǎn)單:</p><p> 第一步:使用類(lèi)的構(gòu)造函數(shù)構(gòu)造一個(gè)類(lèi)對(duì)象。</p><p> 第二步:使用類(lèi)的成員函數(shù)CSyncObjec
95、t::Lock()獲取同步對(duì)象的占有權(quán)。</p><p> 第三步:不使用時(shí),可以通過(guò)調(diào)用CSyncObject::UnLock()函數(shù)釋放對(duì)同步對(duì)象的占有權(quán)。</p><p><b> 3 系統(tǒng)功能分析</b></p><p> 基于LAN的聊天系統(tǒng)的主要功能是以網(wǎng)絡(luò)為載體進(jìn)行信息的傳遞。另外,除了信息傳遞外,還提供保存曾經(jīng)傳遞的信息、
96、文件傳遞、在線人員管理等功能。</p><p> 本系統(tǒng)中的信息和配置要采用XML來(lái)完成,目的是為了方便擴(kuò)展。</p><p> 本系統(tǒng)的主要功能有四個(gè):在線朋友維護(hù)、聊天功能、文件傳輸功能、查看歷史信息。</p><p><b> 3.1在線朋友維護(hù)</b></p><p> 在線朋友指的是所有使用本系統(tǒng)在網(wǎng)上
97、進(jìn)行信息傳遞的用戶(hù)。</p><p> 在線朋友維護(hù)部分包括在線用戶(hù)的顯示、用戶(hù)昵稱(chēng)的修改、實(shí)時(shí)更新(上線、下線)。只要有用戶(hù)上線,所有在線的朋友都可以知道,并且可以和他聊天及進(jìn)行文件的傳輸。使用本程序的用戶(hù),可以看到在線朋友的昵稱(chēng),他們根據(jù)昵稱(chēng)來(lái)進(jìn)行聊天、文件傳輸功能。當(dāng)朋友下線的時(shí)候,在線的人都可以得到通知,同時(shí)這個(gè)朋友的昵稱(chēng)從朋友列表中消失,如果正在和這個(gè)朋友進(jìn)行文件傳輸,那么文件傳輸中止,如果正在和這個(gè)
98、朋友聊天,那么和這個(gè)朋友的聊天也中止。本程序用戶(hù)可以修改自己的昵稱(chēng)、ID,修改完畢后,在下次上線時(shí)作用。</p><p> 用戶(hù)的配置信息比如ID、昵稱(chēng)等保存在用戶(hù)自己的機(jī)器上,程序提供多種修改的方式,既可以使用本程序中提供的修改功能完成,又可以通過(guò)直接修改存放這些信息的系統(tǒng)文件來(lái)完成。</p><p><b> 3.1.1朋友上線</b></p>
99、<p> 朋友上線功能分為兩部分:</p><p> 第一:開(kāi)啟系統(tǒng)的時(shí)候,使用系統(tǒng)的用戶(hù)就要收到這個(gè)人的信息,知道他已經(jīng)上線。對(duì)于上線的人,其他的人可以跟他進(jìn)行聊天,也可以進(jìn)行文件的傳輸。</p><p> 第二:系統(tǒng)在運(yùn)行之中,它會(huì)不斷地進(jìn)行心跳告訴其他人。這個(gè)功能是為了防止在系統(tǒng)啟動(dòng)的時(shí)候發(fā)出的用戶(hù)信息沒(méi)有被其他的使用本系統(tǒng)的人收到。使用心跳功能后,用戶(hù)的信息會(huì)不斷地
100、通知在線的人,這樣有利于系統(tǒng)的穩(wěn)定。此功能要采用網(wǎng)絡(luò)廣播來(lái)實(shí)現(xiàn)。</p><p><b> 3.1.2朋友下線</b></p><p> 當(dāng)朋友退出本系統(tǒng)時(shí),系統(tǒng)會(huì)自動(dòng)發(fā)出下線的消息。凡是正在使用本系統(tǒng)的人都會(huì)得到通知,得到這個(gè)通知后,每個(gè)在線的人都會(huì)看到這個(gè)朋友的信息從自己的列表中刪除。正在和他進(jìn)行的操作(聊天、文件傳輸)都會(huì)停止。同時(shí)聊天的窗口也會(huì)在提示過(guò)后關(guān)
101、閉。</p><p> 3.1.3名字修改 </p><p> 用戶(hù)可以修改自己的昵稱(chēng)。當(dāng)修改了昵稱(chēng)后,所有在線人員的朋友列表仍然保持修改前的昵稱(chēng),只有當(dāng)這個(gè)用戶(hù)下線并再次上線才會(huì)起作用。</p><p><b> 3.2聊天功能</b></p><p> 聊天功能就是在線雙方互相傳遞信息的功能,它包括一般文字的
102、傳輸和文件的傳輸兩部分。下面對(duì)一般文字的傳遞功能進(jìn)行描述。</p><p> 只要在線就可以和所有使用此系統(tǒng)的已經(jīng)在線的朋友進(jìn)行聊天,并且為不同的朋友提供不同的聊天窗口,在這個(gè)聊天窗口中,要提供聊天信息的輸入和聊天信息的顯示功能。</p><p> 要發(fā)送給對(duì)方的文字或者稱(chēng)為字符的輸入工作是在聊天窗口的輸入框中完成的,當(dāng)輸入完畢后,進(jìn)行發(fā)送,當(dāng)發(fā)送沒(méi)有結(jié)束時(shí),不能進(jìn)行新的聊天內(nèi)容的輸入
103、。特別提示:聊天的內(nèi)容一次不能超過(guò)500個(gè)字符。</p><p> 聊天信息顯示在聊天窗口中,顯示的內(nèi)容包括:發(fā)送信息、接收信息。發(fā)送信息是指自己發(fā)送給對(duì)方的信息,這里要顯示出自己的昵稱(chēng)及發(fā)送內(nèi)容;接收信息是指來(lái)自對(duì)方的信息,要顯示出對(duì)方的昵稱(chēng)及接收到的內(nèi)容。</p><p> 另外,發(fā)送的信息及接收的信息都會(huì)被保存起來(lái),以備“查看聊天紀(jì)錄”功能使用。</p><p
104、><b> 3.3文件傳輸功能</b></p><p> 此系統(tǒng)除了傳輸一般的文字外,還提供文件的傳輸,從而豐富了傳遞的信息。文件傳輸功能支持任何文件類(lèi)型,支持在線朋友之間的文件共享。</p><p> 3.3.1.文件傳輸功能</p><p> 因?yàn)槲募鬏敱仨毚_定接收方,因此文件傳輸功能要放到聊天窗口中。點(diǎn)擊傳輸文件的按鈕后,
105、應(yīng)該提供選擇文件的文件對(duì)話(huà)框,系統(tǒng)通過(guò)文件打開(kāi)窗口來(lái)提示用戶(hù)找到要傳送的文件。然后確認(rèn)要進(jìn)行文件傳輸之后,這個(gè)文件會(huì)通過(guò)網(wǎng)絡(luò)傳送到與自己聊天的那個(gè)人的機(jī)器上。接收者不能阻止文件傳輸?shù)恼?qǐng)求。接收者收到這個(gè)文件后,會(huì)被系統(tǒng)自動(dòng)放到一個(gè)指定的目錄:“\file\”。</p><p> 3.3.2.支持文件拖拽</p><p> 系統(tǒng)除了支持讓用戶(hù)選擇傳輸文件之外,還支持用戶(hù)將文件直接拖拽到和
106、這個(gè)朋友的聊天窗口之上,在拖拽的時(shí)候系統(tǒng)就不再提示。</p><p><b> 3.4查看聊天紀(jì)錄</b></p><p> 在聊天的時(shí)候會(huì)保存聊天的內(nèi)容,可以在事后對(duì)這些信息進(jìn)行查看,本系統(tǒng)會(huì)把每個(gè)用戶(hù)的信息分別放在一個(gè)文件中。</p><p> 系統(tǒng)在發(fā)送和接收聊天內(nèi)容時(shí),會(huì)把這個(gè)信息按照聊天對(duì)象的ID進(jìn)行保存。當(dāng)用戶(hù)選擇查看聊天紀(jì)律
107、是,系統(tǒng)會(huì)調(diào)出與特定聊天對(duì)象的聊天紀(jì)錄讓用戶(hù)查看。</p><p> 下面是查看聊天紀(jì)錄的活動(dòng)圖:</p><p> 圖3-1 查看聊天紀(jì)錄活動(dòng)圖</p><p><b> 4.詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)</b></p><p><b> 4.1類(lèi)設(shè)計(jì)</b></p><p>
108、 本程序一共有10個(gè)類(lèi),其中三個(gè)是系統(tǒng)自動(dòng)生成的,其余七個(gè)是為程序創(chuàng)建的,下面對(duì)它們做一個(gè)介紹:</p><p> 4.1.1系統(tǒng)生成類(lèi)</p><p> (1)CAboutDlg類(lèi),系統(tǒng)的關(guān)于對(duì)話(huà)框。</p><p> (2)CNetMsgApp類(lèi),系統(tǒng)的Application類(lèi)。</p><p> (3)CNetMsgDlg類(lèi),
109、系統(tǒng)的主窗口類(lèi)。其有以下功能:朋友的維護(hù)(增加、刪除),廣播自身profile報(bào)文的服務(wù),廣播自己下線的報(bào)文,處理朋友的上線和下線信息,判斷指定NetMsgDlg的朋友存在性,釋放和建立朋友鏈表,監(jiān)聽(tīng)朋友上線和下線報(bào)文,建立與朋友聊天的會(huì)話(huà)。</p><p><b> 4.1.2.創(chuàng)建類(lèi)</b></p><p> (1)CChatDGram,聊天報(bào)文類(lèi)。</
110、p><p> (2)CChatDlg,聊天窗口類(lèi)。其有以下功能:監(jiān)聽(tīng)和接收其他人發(fā)送來(lái)的聊天報(bào)文,發(fā)送聊天報(bào)文,保存聊天報(bào)文,在朋友下線的時(shí)候會(huì)提示關(guān)閉自己并釋放窗口資源。</p><p> (3)CFileTranDlg,文件傳輸?shù)念?lèi)。用來(lái)建立文件監(jiān)聽(tīng)服務(wù),文件傳輸和文件接收。</p><p> (4)CFormChatHist,查看聊天歷史信息的類(lèi),是對(duì)話(huà)框派
111、生類(lèi)。按用戶(hù)的NetMsgID來(lái)進(jìn)行列表,詳細(xì)列出聊天的紀(jì)錄。</p><p> (5)CFriendObj,代表一個(gè)朋友結(jié)點(diǎn)的類(lèi)。它具有固定的標(biāo)識(shí)成員:NickName和NetMsgID,同時(shí)也有動(dòng)態(tài)的成員:IPAddress,還有標(biāo)識(shí)與自己關(guān)聯(lián)的聊天對(duì)話(huà)框的指針:ChatDlg。</p><p> (6)CFriendListBox</p><p> (7
112、)CWorkSocket,TCP和UDP的類(lèi),是CSocket的派生類(lèi)。</p><p> 4.2詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)</p><p> 4.2.1 UDP廣播實(shí)現(xiàn)朋友上線</p><p> 圖4-1是程序的主界面,其中的ListBox用來(lái)顯示在線的朋友昵稱(chēng)。</p><p><b> 圖4-1 主界面</b><
113、;/p><p> 當(dāng)朋友上線時(shí),其他所有在線人員都需要得到通知,也就是需要將剛剛上線的朋友昵稱(chēng)列在主界面的ListBox中。實(shí)現(xiàn)實(shí)時(shí)的朋友上線通知有兩種方法:一種是查詢(xún)式,另外一種是主動(dòng)通知式。查詢(xún)式就是每隔一段時(shí)間,系統(tǒng)就要將整個(gè)網(wǎng)絡(luò)內(nèi)在線人員做一次查詢(xún),并將查詢(xún)的結(jié)果顯示到主界面的列表中。這種方法需要提前知道在這個(gè)網(wǎng)絡(luò)內(nèi)所有人員的ID。主動(dòng)通知式與查詢(xún)式的做法恰恰相反,它是以主動(dòng)方式來(lái)通知網(wǎng)絡(luò)內(nèi)人員的。當(dāng)一個(gè)用
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文--聊天系統(tǒng)的設(shè)計(jì)
- 小型聊天系統(tǒng)畢業(yè)論文
- android聊天系統(tǒng)畢業(yè)論文--基于android平臺(tái)的聊天系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)論文-c#聊天系統(tǒng)
- 畢業(yè)論文-基于java聊天系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 基于java的聊天系統(tǒng)的設(shè)計(jì)于實(shí)現(xiàn)——畢業(yè)論文
- 基于java的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)---畢業(yè)論文
- 基于java的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)---畢業(yè)論文
- 基于java的聊天系統(tǒng)的設(shè)計(jì)于實(shí)現(xiàn)——畢業(yè)論文
- 畢業(yè)論文 基于java即時(shí)聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 基于.net平臺(tái)的聊天程序畢業(yè)論文
- 基于web的聊天室畢業(yè)論文
- 畢業(yè)論文---聊天系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)
- 畢業(yè)論文-基于java的聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 基于android平臺(tái)的聊天系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) 畢業(yè)論文
- 基于java即時(shí)聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_畢業(yè)論文
- 基于java即時(shí)聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_畢業(yè)論文
- 基于web的聊天室畢業(yè)論文
- 基于javaee技術(shù)在線聊天系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)——畢業(yè)論文
- 基于c#聊天群的編程畢業(yè)論文
評(píng)論
0/150
提交評(píng)論