2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  2007屆畢業(yè)生</b></p><p><b>  畢業(yè)論文</b></p><p>  題 目: 基于LAN的聊天系統(tǒng) </p><p>  院系名稱: 信息科學(xué)與工程學(xué)院 </p><p>

2、  專業(yè)班級: 計算機科學(xué)與技術(shù)03級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分類4</p><p>  2.1.3 WinSock API 編程

10、4</p><p>  2.2 MFC Socket 編程技術(shù)5</p><p>  2.2.1 CAsyncSocket類7</p><p>  2.2.2 CSocket類9</p><p>  2.3 XML DOM技術(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文檔對象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在線朋友維護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è)計與實現(xiàn)19</p><p>

14、;<b>  4.1類設(shè)計19</b></p><p>  4.1.1系統(tǒng)生成類19</p><p>  4.1.2.創(chuàng)建類19</p><p>  4.2詳細(xì)設(shè)計與實現(xiàn)19</p><p>  4.2.1 UDP廣播實現(xiàn)朋友上線19</p><p>  4.2.2 朋友下線通知21&

15、lt;/p><p>  4.2.3 XML聊天報文發(fā)送22</p><p>  4.2.4 聊天報文接收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、拽文件實現(xiàn)25</p><p>  5 系統(tǒng)調(diào)試與運行26</p><p>  5.1 系統(tǒng)調(diào)試26</p><p>  5.2 系統(tǒng)運行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ò)在人們的生活中所扮演的角色越來越多,也越來越重要。我們可以借助網(wǎng)絡(luò)進(jìn)行網(wǎng)上購物、網(wǎng)上求醫(yī)問藥、網(wǎng)上銀行、網(wǎng)上報名等。我們

18、的人際關(guān)系網(wǎng)也可以在網(wǎng)上進(jìn)行,人們可以通過這個空間進(jìn)行網(wǎng)絡(luò)聊天,實現(xiàn)彼此溝通,交換信息,甚至網(wǎng)絡(luò)聊天工具在部分人的生活中大有與傳統(tǒng)的電話通信手段同等重要的趨勢。</p><p>  隨著局域網(wǎng)技術(shù)的發(fā)展,大多企事業(yè)單位或公司構(gòu)建了本單位的局域網(wǎng)。利用基于LAN的聊天系統(tǒng)交流工作經(jīng)驗或是彼此通告工作進(jìn)程,既可以節(jié)約時間、及時知道彼此的信息或工作進(jìn)度,而且不會帶來例如外網(wǎng)入侵或是病毒感染等安全隱患問題。使用基于LAN

19、的聊天系統(tǒng),使交流工作經(jīng)驗或彼此通告工作進(jìn)程變的更加方便快捷,同時也促進(jìn)了單位的發(fā)展,使本單位在激烈的競爭環(huán)境中更具有優(yōu)勢。</p><p>  目前,國內(nèi)外研究基于LAN的聊天系統(tǒng)基本上有兩種模式:</p><p>  (1)采用客戶端/服務(wù)器模型。用戶上線時,要先向服務(wù)器請求建立連接,服務(wù)器同意建立連接后,用戶將個人信息送交服務(wù)器;服務(wù)器則給此用戶分配相關(guān)資源并建立相關(guān)服務(wù)線程,同時,

20、服務(wù)器向其他在線用戶發(fā)送此用戶上線消息和其個人信息,并將當(dāng)前所有在線用戶的信息發(fā)給新上線的用戶。這時,新上線的用戶就可以和其他在線用戶進(jìn)行聊天或是文件傳送。聊天內(nèi)容的傳送或文件傳輸有兩種解決方法:</p><p> ?、傧葌鹘o服務(wù)器,然后再由服務(wù)器轉(zhuǎn)發(fā)。這種方法資源共享的程度很高,但由于所有數(shù)據(jù)都要經(jīng)過服務(wù)器,服務(wù)器的負(fù)擔(dān)很重。因此,這種方法常用于有大量數(shù)據(jù)需要共享的單位。</p><p>

21、; ?、谥苯影l(fā)送到接收用戶。服務(wù)器將每個上線用戶的個人信息與其網(wǎng)絡(luò)地址發(fā)送給其余上線用戶,當(dāng)一個用戶向另一個用戶發(fā)送信息或是傳送文件時,直接傳送到接收用戶的電腦上。這種方法的優(yōu)缺點與前一種剛好相反,其常用于資源共享程度不高的小公司里。</p><p>  (2)采用對等模型。此模型沒有服務(wù)器,用戶上線、下線和用戶維護等功能都由個人電腦完成。當(dāng)用戶上線時,運行在本機上的程序完成初始化的工作,并啟動聊天、文件傳輸?shù)确?/p>

22、務(wù),初始化工作做好以后,運行程序向整個局域網(wǎng)發(fā)送用戶上線消息和個人信息及網(wǎng)絡(luò)地址,以后運行程序會每隔一定時間發(fā)送自己在線的消息。用戶發(fā)送自己上線或在線消息的同時,它也監(jiān)聽網(wǎng)絡(luò)上是否有別的用戶發(fā)送上線或在線消息,當(dāng)接收到用戶上線或在線消息時,讀取此用戶的個人信息并檢查朋友列表中是否已有此朋友,如有則不做任何工作,沒有就將此用戶加到朋友列表中。當(dāng)用戶下線時,程序會向整個網(wǎng)絡(luò)廣播自己下線的消息,收到該消息的在線用戶將下線用戶從在線朋友列表中刪

23、除,如果此時有與下線用戶進(jìn)行聊天或文件傳輸?shù)?,聊天或文件傳輸中止?lt;/p><p>  對比這兩種模型,對等模型適合一般資金力量較弱、數(shù)據(jù)共享不多的單位,對運行所需的網(wǎng)絡(luò)環(huán)境、機器配置要求一般;開發(fā)工具和環(huán)境簡單;容易維護等優(yōu)勢。</p><p>  1.2 研究的目的、內(nèi)容和意義</p><p>  在企事業(yè)單位中,為了交流工作經(jīng)驗或是幾個人合作完成某項工作,采取

24、的開會的方式既浪費時間又沒有很好的實時性。隨著LAN技術(shù)的發(fā)展,大多企事業(yè)單位建立了自己的LAN,利用基于LAN的聊天系統(tǒng)來彼此交流工作經(jīng)驗或是彼此通告工作進(jìn)程,既節(jié)約時間又可以及時知道彼此的信息。</p><p>  該程系統(tǒng)沒有服務(wù)器,它具有聊天、文件傳輸、聊天的歷史紀(jì)錄查詢和在線人員管理等功能。用戶在使用本程序登錄后,會以UDP報文的形式向整個網(wǎng)絡(luò)廣播自己上線的信息,其他在線用戶收到新用戶上線的消息后,會自

25、動將其加到朋友鏈表中;而且,用戶在登錄以后會每隔一定時間以UDP報文的形式向整個網(wǎng)絡(luò)廣播自己在線的消息。聊天報文UDP的形式從一個用戶向指定用戶傳送。文件傳輸采用TCP/IP協(xié)議,以保證文件的傳輸。</p><p>  使用基于LAN的聊天系統(tǒng)使交流工作經(jīng)驗或彼此通告工作進(jìn)程變的更加方便快捷,同時也促進(jìn)了單位的發(fā)展,使本單位在競爭激烈的環(huán)境中更具有優(yōu)勢。</p><p>  1.3 課題的

26、基本內(nèi)容</p><p>  基于LAN的聊天系統(tǒng)的主要功能是以網(wǎng)絡(luò)為載體進(jìn)行信息的傳遞,其主要實現(xiàn)四個功能:</p><p>  (1)在線朋友維護。在線朋友維護部分包括在線用戶的顯示、用戶昵稱的修改、實時更新(上線、下線)。只要有用戶上線,所有在線的朋友都可以知道,并且可以和他聊天及進(jìn)行文件的傳輸。使用本系統(tǒng)的用戶,可以看到在線朋友的昵稱,并根據(jù)昵稱來進(jìn)行聊天、文件傳輸功能。當(dāng)朋友下線

27、的時候,在線的人都可以得到通知,同時這個朋友的昵稱從朋友列表中消失,如果正在和這個朋友進(jìn)行文件傳輸,那么文件傳輸中止,如果正在和這個朋友聊天,那么和這個朋友的聊天也中止。在線朋友的維護采用高效的雙向鏈表作為數(shù)據(jù)結(jié)構(gòu),每個結(jié)點都是一個指向CFriendObj的指針。整個系統(tǒng)中只有一條在線朋友的鏈表,為了方便使用,它作為主窗口類 CNetMsgDlg的靜態(tài)成員出現(xiàn)。</p><p>  (2)聊天功能。本功能就是在

28、線雙方互相傳遞信息的功能,它包括一般文字的傳輸和文件的傳輸兩部分。只要在線就可以和所有使用此系統(tǒng)的已經(jīng)在線的朋友進(jìn)行聊天,并且為不同的朋友提供不同的聊天窗口,在這個聊天窗口中,要提供聊天信息的輸入和聊天信息的顯示功能。當(dāng)一次聊天信息發(fā)送沒有結(jié)束時,不能進(jìn)行新的聊天內(nèi)容的輸入。另外,發(fā)送的信息都應(yīng)該保存起來,以備“查看歷史紀(jì)錄”功能使用。</p><p>  (3)文件傳輸功能。文件傳輸功能由兩個子功能組成:①文件

29、傳輸功能,因為文件傳輸必須確定接收方,因此本系統(tǒng)將此功能放在聊天窗口中,當(dāng)點擊傳輸文件的按鈕后,提供選擇文件的通用對話框,系統(tǒng)通過此通用對話框窗口來幫助用戶找到要傳送的文件,確認(rèn)要進(jìn)行文件傳輸后,這個文件會通過局域網(wǎng)傳送到與自己聊天的朋友的機器上,并且接受者收到這個文件后會被系統(tǒng)自動放到一個指定的目錄下;②支持文件拖拽,此功能支持用戶將文件直接拖拽到和這個朋友的聊天窗口之上進(jìn)行傳輸文件的選擇(在拖拽的時候系統(tǒng)就不再提示)。</p&

30、gt;<p>  (4)查看歷史紀(jì)錄信息。系統(tǒng)在發(fā)送和接收聊天內(nèi)容時,會把這個信息按照聊天對象的昵稱進(jìn)行保存,當(dāng)用戶選擇查看聊天信息時,系統(tǒng)會調(diào)出與特定聊天對象的信息,讓用戶進(jìn)行查看。</p><p>  另外,朋友上線、下線采用UDP報文的形式向整個局域網(wǎng)廣播,所有使用本系統(tǒng)的在線用戶都會收到該報文并進(jìn)行相關(guān)的朋友維護和其他操作;聊天信息以UDP報文的形式從發(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)開發(fā)的網(wǎng)絡(luò)通信接口。由于Socket在網(wǎng)絡(luò)通信編程時使用非常方便簡潔,同時也隨著UNIX操作系統(tǒng)的廣泛使用,套接字成為當(dāng)前最流行的網(wǎng)絡(luò)通信應(yīng)用程序接口之一。被移植到許多非UNIX系統(tǒng)中,其中Windows下的WinSock就是在繼承了Berkeley Sockets主要特征的基礎(chǔ)上,又對它進(jìn)行了重要補充。</p><p>  套接字是一種雙向的通信端口,可以通過這個端口與任何一個具有Soc

33、ket端口的計算機通信,套接字四網(wǎng)絡(luò)通信的基礎(chǔ)。Socket在Windows以句柄的形式被創(chuàng)建。使用Socket進(jìn)行網(wǎng)絡(luò)通信必須包含下面的幾種信息:雙方認(rèn)可的協(xié)議,本地主機的IP地址,本地進(jìn)程的協(xié)議端口,對方主機的IP地址,對方進(jìn)程的協(xié)議端口。</p><p>  2.1.2 Socket分類</p><p>  套接字可以分為數(shù)據(jù)報套接字和流式套接字兩種,下面對這兩種套接字進(jìn)行簡單地介

34、紹。</p><p>  (1)數(shù)據(jù)報套接字(Datagram Sockets)</p><p>  對于在TCP/IP上實現(xiàn)的WinSock,數(shù)據(jù)報套接字使用用戶數(shù)據(jù)報協(xié)議(UDP)。</p><p>  數(shù)據(jù)報套接字提供了一種不可靠的、非連接的數(shù)據(jù)包通信方式。“不可靠”的意</p><p>  思是指發(fā)送一個數(shù)據(jù)包不能保證被接收方接收,也

35、不能保證數(shù)據(jù)包按照發(fā)送順序到達(dá)接收方。實際使用中,同一個分組數(shù)據(jù)報可能不止一次地被發(fā)送,一般要等到接收方發(fā)回確認(rèn)收到的消息才會停止發(fā)送。</p><p>  (2)流式套接字(Stream Sockets)</p><p>  流式套接字使用傳輸控制協(xié)議(TCP)。流式套接字可以將數(shù)據(jù)按順序無重復(fù)地發(fā)送到目的地,它提供的是一種可靠的、面向連接的數(shù)據(jù)傳輸方式。不管是對單個的數(shù)據(jù)報,還是對數(shù)據(jù)

36、包,流式套接字都提供了一種流式數(shù)據(jù)傳輸。</p><p>  2.1.3 WinSock API 編程</p><p>  WinSock是Microsoft公司在繼承了Berkeley Sockets主要特征的基礎(chǔ)上,并對其進(jìn)行了重要補充之后的產(chǎn)物,是Windows Sockets規(guī)范的簡稱,為開發(fā)人員提供了一套Windows操作系統(tǒng)上的開放的、支持多種協(xié)議網(wǎng)絡(luò)編程接口。從1.0版到2.

37、0.8版,經(jīng)過不斷完善,事實上已經(jīng)成了Windows網(wǎng)絡(luò)編程標(biāo)準(zhǔn)。</p><p>  為簡化網(wǎng)絡(luò)編程,Microsoft公司又將這些WinSock API進(jìn)行了面相對象的封裝,在MFC類庫中提供了兩個用于WinSock編程的類,即:CAsyncSocket和CSocket。</p><p>  在Visual C++中使用Windows Sockets編寫網(wǎng)絡(luò)應(yīng)用程序,需要使用下面三個文

38、件:</p><p>  (1)WINSOCK.H:這是WinSock API的頭文件。</p><p>  (2)WSOCK32.LIB:WINSOCK API 連接庫文件。在使用中,一定要把它作為項目的非缺省的連接庫包含到項目文件中去。</p><p>  (3)WINSOCK.DLL:WinSock的動態(tài)連接庫,位于WINDOWS的安裝目錄下。</p&g

39、t;<p>  在保證以上文件存在或包含到工程后,就可以使用WinSock API中的函數(shù)進(jìn)行Socket程序的編寫。</p><p>  我們知道,一般情況下使用Socket編寫的網(wǎng)絡(luò)應(yīng)用程序是服務(wù)器/客戶機架構(gòu)的,因此下面給出流式套接字和數(shù)據(jù)報套接字這兩種套接字的編程模型。</p><p>  (1)數(shù)據(jù)報套接字的編程模型。如圖2-1所示。</p><

40、p>  (2)流式套接字的編程模型。如圖2-2所示。</p><p>  2.2 MFC Socket 編程技術(shù)</p><p>  MFC是對API的封裝,MFC針對WinSock API封裝了兩個類:CAsyncSocket和CSocket。因此,使用這兩個類進(jìn)行Socket網(wǎng)絡(luò)程序的編寫會比API方便一些。</p><p>  MFC中Socket相關(guān)類

41、的繼承關(guān)系如圖2-3所示。 </p><p>  CAsyncSock對WinSock API進(jìn)行了較低程度的封裝,缺省情況下建立的Socket是異步操作方式,即非阻塞式的,因此一些阻塞操作,需要自己動手完成。另外,由于它對API的封裝程度不高,以前在WinSock API中需要自己完成的工作(比如:字節(jié)順序的轉(zhuǎn)換),仍然需要自己完成。當(dāng)然有許多程序員喜

42、歡使用該類甚至WinSock API,原因是這些方法具有很大的靈活性,給程序員以較大的發(fā)揮空間。</p><p>  為了給程序員提供更方便的接口以自動處理網(wǎng)絡(luò)通信中的一些任務(wù),MFC在CAsyncSocket類的基礎(chǔ)上派生了CSocket類,它提供了比CAsyncSocket更高層的WinSock API 接口。CSocket的網(wǎng)絡(luò)操作是同步方式,即阻塞式的。CSocket建立的Socket不是阻塞的,而是對

43、非阻塞的Socket進(jìn)行處理后實現(xiàn)的阻塞操作。在阻塞任務(wù)執(zhí)行過程中,Windows線程的消息循環(huán)仍然有效,也就是說CSocket類的阻塞操作不影響Windows的消息循環(huán)。</p><p>  圖2-1 數(shù)據(jù)報套接字編程模型</p><p>  圖2-2 流式套接字編程模型</p><p>  圖2-3 MFC Socket類層次圖</p>&

44、lt;p>  簡單了解了CAsyncSocket和CSocket類之后,下面我們對這兩個類的使用方法進(jìn)行簡單的講解。</p><p>  2.2.1 CAsyncSocket類</p><p>  CAsyncSocket類的編程模型簡述如下:</p><p>  第一步:構(gòu)造一個CAsyncSocket對象,并用這個對象的Create成員函數(shù)來創(chuàng)建底層的套接

45、字,并且在Create函數(shù)中通過參數(shù)可以設(shè)定套接字的端口地址、事件通知、套接字的類型。</p><p><b>  示例如下:</b></p><p><b>  第一種方法:</b></p><p>  CAsyncSocket Sock;Sock.Create();</p><p>  使用

46、默認(rèn)參數(shù)產(chǎn)生的是一個流式套接字。</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)生一個CAsyncSocket對象,第二種方法在堆上產(chǎn)生CAsyncSocket對象。第一種Create成員函數(shù)用缺省參數(shù)產(chǎn)生一個流式套接字,第二種Create成員函數(shù)用指定的端口和地址產(chǎn)生一個數(shù)據(jù)報套接字。</p><p>  第二步:如果創(chuàng)建的是流式套接字,那么就需要在客戶和服務(wù)器之間建立連接,因為只有在客戶和服務(wù)器之間建立了連接,

48、套接字才能進(jìn)行數(shù)據(jù)傳輸工作。如果是數(shù)據(jù)報套接字,則不需要建立連接,也就不需要調(diào)用Connect()函數(shù)。</p><p>  (1)客戶方程序:用CAsyncSocket類的Connect()成員函數(shù)連接到服務(wù)器方;</p><p>  (2)服務(wù)器方程序:用CAsyncSocket的Listen()成員函數(shù)開始監(jiān)聽,一旦收到連接請求,則調(diào)用CAsyncSocket的Accept()成員函

49、數(shù)開始接收。</p><p>  第三步:完成了Socket的創(chuàng)建和通信雙方的連接后,該到了相互傳輸信息的時候了。</p><p>  (1)對于數(shù)據(jù)報套接字。發(fā)送數(shù)據(jù)函數(shù):SendTo();接收數(shù)據(jù)函數(shù):RecviveFrom()。</p><p>  (2)對于流式套接字。發(fā)送數(shù)據(jù)函數(shù):Send();接收數(shù)據(jù)函數(shù):Receive()。</p>&l

50、t;p>  第四步:通訊結(jié)束后,有兩件事情需要做。</p><p>  (1)調(diào)用CAsyncSocket類的成員函數(shù)Close();</p><p>  (2)銷毀CAsyncSocket對象;</p><p>  如果是在棧上產(chǎn)生的CAsyncSocket對象,則對象超出定義的范圍時自動被析構(gòu);如果是在堆上產(chǎn)生,也就是用了new這個操作符,則必須使用del

51、ete操作符銷毀CAsyncSocket對象,否則將造成內(nèi)存泄露。</p><p>  下面介紹CAsyncSocket類的事件通知處理函數(shù)。</p><p>  當(dāng)網(wǎng)絡(luò)事件產(chǎn)生時,Socket會收到一個WM_SOCK_NOTIFY消息,于是CAsyncSocket類的消息處理函數(shù)OnSocketNotify執(zhí)行,而這個消息處理函數(shù)會調(diào)用CAsyncSocket類的DoCallBack()

52、成員函數(shù)。在這個函數(shù)中,根據(jù)不同的網(wǎng)絡(luò)事件調(diào)用了不同的網(wǎng)絡(luò)事件處理函數(shù)。注:WM_SOCK_NOTIFY消息及消息處理函數(shù)是MFC的類完成的工作。</p><p>  下面介紹這些事件通知處理函數(shù):</p><p>  (1)OnSend()函數(shù):</p><p>  OnSend()函數(shù)是FD_WRITE事件產(chǎn)生時的事件處理函數(shù),當(dāng)能夠發(fā)送數(shù)據(jù)時就產(chǎn)生FD_WRI

53、TE事件通知,OnSend()函數(shù)就會被調(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ù)時就產(chǎn)生FD_READ事件通知,然后OnReceive()被調(diào)用。</p><p>  (3

54、)OnAccept()函數(shù)</p><p>  當(dāng)負(fù)責(zé)監(jiān)聽的Socket接收到FD_ACCEPT事件通知時,會導(dǎo)致OnAccept()函數(shù)的執(zhí)行。</p><p>  (4)OnConnect()函數(shù)</p><p>  當(dāng)主動請求連接的Socket連接完成后(連接可能是成功的,也可能是失敗的)會導(dǎo)致OnConnect()函數(shù)的調(diào)用。</p><

55、p>  2.2.2 CSocket類</p><p>  在MFC的類層次關(guān)系中,CSocket類是CAsyncSocket類的派生類,它在基類的基礎(chǔ)上加入了阻塞處理,并且可以和CSocketFile類以CArchive類聯(lián)合工作完成數(shù)據(jù)的發(fā)送和接收任務(wù),從而避免了處理字節(jié)順序等問題。</p><p>  提示:由于CSocket類的阻塞處理,使得OnConnect()和OnSend

56、()事件通知處理函數(shù)從來不能被調(diào)用。除了這個之外,其他的事件通知處理函數(shù)仍可使用。CSocket類的阻塞工作方式并不影響Windows的消息循環(huán)。要想利用CSocket類和CSocketFile及CArchive類共同完成數(shù)據(jù)的發(fā)送和接收工作,要求CSocket創(chuàng)建的套接字是流式套接字。</p><p>  下面介紹CSocket類的變成模式。</p><p>  第一步:構(gòu)造一個CSoc

57、ket對象;</p><p>  第二步:創(chuàng)建一個底層套接字;</p><p><b>  第三步:建立連接;</b></p><p>  對于客戶端套接字來說,如果是流式套接字,則調(diào)用從CAsyncSocket類繼承來的Connect()函數(shù)與服務(wù)器套接字建立連接;如果是數(shù)據(jù)報套接字,不需要和服務(wù)器建立連接,也就不需要調(diào)用Connect()函

58、數(shù)。</p><p>  對于服務(wù)器端套接字來說,則調(diào)用從CAsyncSocket類繼承來的listen()函數(shù)進(jìn)行監(jiān)聽來自客戶端的連接請求,收到連接請求后,調(diào)用CAsyncSocket類的Accept()函數(shù)接受請求,建立連接。</p><p>  第四步:發(fā)送和接收數(shù)據(jù);</p><p>  第五步:通訊結(jié)束后的工作是做一些清除性工作。</p>&

59、lt;p>  調(diào)用Close()函數(shù),用來釋放與套接字相關(guān)的資源;銷毀CArchive、CSocketFile和CSocket對象。</p><p>  2.3 XML DOM技術(shù)基本知識</p><p>  這里將對XML DOM接口、創(chuàng)建DOM文檔對象方法、加載XML文件、遍歷XML文檔的方法做比較詳細(xì)的講解,希望大家掌握在Visual C++中操作XML文檔的方法。</p

60、><p>  2.3.1 XML 概述</p><p>  XML是繼HTML之后發(fā)展起來的一種可擴展的標(biāo)記語言。在XML之前還有一種功能非常強大的標(biāo)記語言,就是SGML,可是SGML過于復(fù)雜,以至于使這種語言的解釋器編寫起來很困難。1996年,W3C開始設(shè)計一種可擴展的標(biāo)記語言,這種語言能夠具有SGML的靈活性和強大功能,同時又具有HTML的簡單性,最后設(shè)計的成果就是XML,是在1998年由

61、W3C推薦使用的標(biāo)準(zhǔn)。</p><p>  XML是一種存放文本數(shù)據(jù)很好的方法,與HTML相比,具有很大的靈活性。目前,XML已經(jīng)逐步為廣大程序員所認(rèn)同,也逐漸成為網(wǎng)絡(luò)信息傳遞的一種相當(dāng)不錯的標(biāo)記語言,雖然目前HTML語言仍然在不少網(wǎng)頁中使用。曾經(jīng)有人把XML稱為“Web上的ASCII碼”,更為甚者,有人把它和大型關(guān)系數(shù)據(jù)庫相比,預(yù)言它有可能會取代大型關(guān)系數(shù)據(jù)庫,這些確實有些夸張,可是也充分說明了XML即將在網(wǎng)絡(luò)

62、應(yīng)用中占據(jù)的地位。</p><p>  2.3.2 DOM 接口</p><p>  DOM是描述XML文檔中節(jié)點和節(jié)點之間關(guān)系的一種方式,DOM是以節(jié)點的層次結(jié)構(gòu)關(guān)系來組織數(shù)據(jù)的,因此,它是一種樹型結(jié)構(gòu),圖2-4描述了DOM組織數(shù)據(jù)的方式。</p><p>  DOM提供了一些API編程人員可以使用這些API在樹的任何地方添加、編輯、移動或刪除節(jié)點。Microso

63、ft在IE4.0以后就在系統(tǒng)中加入了msxml.dll——MSXML組件。</p><p>  在MSXML中包含的對象有:</p><p>  (1)XMLDOMDocument:頂端XML樹的結(jié)點,也是XML的根元素。</p><p>  (2)XMLDOMNode:XML中的一個結(jié)點對象。</p><p>  (3)XMLDOMNode

64、List:結(jié)點對象的集合。</p><p>  (4)XMLDOMNamedNodeMap:用來遍歷和訪問屬性的集合。</p><p>  (5)XMLDOMParseError:XML訪問過程之中產(chǎn)生的錯誤的對象。</p><p>  (6)XMLHttpRequest:支持HTTP Server提供的客戶端的協(xié)議對象。</p><p> 

65、 (7)XTLRuntime:實現(xiàn)XSL樣式單中的方法。</p><p>  圖2-4 DOM 描述數(shù)據(jù)的方式</p><p>  2.3.3創(chuàng)建DOM文檔對象</p><p>  對DOM樹中的節(jié)點訪問之前必須首先創(chuàng)建Document對象,這個對象是DOM樹的最高節(jié)點,是訪問XML文檔的入口。下面給出Visual C++中創(chuàng)建DOM文檔對象的示例代碼:<

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方法,下面分別給出示例代碼來說明這兩種方法的使用。</p><p>  (1)使用load方法加載XML文檔</p>

69、<p>  IXMLDOMDocument::load方法的函數(shù)原型定義為:</p><p>  HRESULT load(VARIANT xmlSource,VARIANT_BOOL *isSuccessful);</p><p>  假設(shè)要訪問的XML文件的路徑及名稱為: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文檔的全部內(nèi)容加載,下面要講的LoadXML方法加載的不是XML文檔的全部內(nèi)容,而是加載X

74、ML文檔中符合XML語法的XML片斷,當(dāng)然這個片斷也可以是XML文檔的全部內(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樹型圖的XML文檔為:c:\alice\country.xml,其中的國家節(jié)點名稱為country,省節(jié)點名稱為province,縣節(jié)點名稱為county,那么下面給出加載縣節(jié)點(即county節(jié)點)片斷的示例代碼:</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、對XML文檔的遍歷就是對DOM樹的遍歷。與遍歷相關(guān)的DOM接口有:IXMLDOMNodeList、IXMLDOMNode,其中IXMLDOMNodeList接口表示的節(jié)點集合,IXMLDOMNode表示的一個節(jié)點,在這兩個接口中給出了一系列訪問XML文檔節(jié)點的方法,包括遍歷及取得節(jié)點的信息。不過首先要使用IXMLDOMDocument接口的getElementsByTagName函數(shù)或nodeFromID函數(shù)獲得IXMLDOMNodeL

80、ist接口對象,然后方能使用其中提供的方法。</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)用程序。一個進(jìn)程包含一個或多個線程,并且是至少有一個線程。進(jìn)程是不活動的,線程是代碼的執(zhí)行者。具體地說線程是指進(jìn)程的一條執(zhí)行路徑,它包含獨立的堆棧和CPU寄存器狀態(tài),每個線程共享所有的進(jìn)程資源。一個進(jìn)程內(nèi)的所有線程使用同一個32位地址空間,而這些線程的執(zhí)行由系統(tǒng)調(diào)度程序控制,調(diào)度程序決定哪個線程可執(zhí)行及什么時候執(zhí)行線程。線程有優(yōu)先級別,優(yōu)先權(quán)較低的線程必須等到優(yōu)先權(quán)較高的線程執(zhí)行完任務(wù)后再執(zhí)行。當(dāng)進(jìn)程中所有的線程中止后,這個

83、進(jìn)程也就中止了。</p><p>  編寫多線程程序,一定要注意線程的同步問題。</p><p>  2.4.1 創(chuàng)建多線程程序</p><p>  Windows的多任務(wù)體現(xiàn)在兩個方面:第一是多進(jìn)程;第二是多線程。</p><p>  當(dāng)需要網(wǎng)絡(luò)傳輸數(shù)據(jù)、后臺大量的數(shù)據(jù)計算等比較耗時的操作時,用多線程是比較好的方法。在服務(wù)器/客戶端架構(gòu)的網(wǎng)

84、絡(luò)應(yīng)用程序中,服務(wù)器端專門用一個線程來負(fù)責(zé)監(jiān)聽是否有客戶端請求連接,也是一個很不錯的解決方案,下面我們介紹創(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)先級</b></p><p><b> ?、壑兄咕€程</b></p><p>  當(dāng)線程的函數(shù)返回后,線程自動中止。</p><p><b>  (2)MFC方法</b></p&g

87、t;<p>  MFC的線程分為兩類:一類是工作線程,一類是用戶界面線程。工作線程是指一些后臺運行的線程,不需要用戶的交互。Visual C++中CWinApp就是一個典型的用戶界面線程。</p><p><b>  工作線程</b></p><p>  a.創(chuàng)建工作線程 b.中止線程 c.線程函數(shù)。線程函數(shù)的格式:</p><p&

88、gt;  UINT ThreadProc(LPVOID pParam);</p><p><b> ?、谟脩艚缑婢€程</b></p><p>  a.從CWinThread派生線程類</p><p>  從CWinThread類中派生自己的線程類,有一點必須注意:必須在派生類的頭文件中加入DECLARE_DYNCREATE宏,在源文件中加入

89、IMPLEMENT_DYNCREATE宏??梢灾剌d基類的InitInstance和ExitInstance函數(shù),分別放入初始化代碼和結(jié)束工作的代碼。</p><p>  b.創(chuàng)建線程并啟動線程 </p><p>  當(dāng)線程創(chuàng)建成功并開始執(zhí)行時,線程類的InitInstance函數(shù)總是首先被執(zhí)行。如果線程擁有窗口的話,就應(yīng)該在這里進(jìn)行窗口的創(chuàng)建工作,并且把CWinThread類的m_pMai

90、nWnd數(shù)據(jù)成員的值設(shè)置為新創(chuàng)建的窗口的地址值。</p><p>  2.4.2 線程同步</p><p>  多線程的方法確實能夠幫助我們解決一些復(fù)雜的問題。創(chuàng)建線程的方法并不是很復(fù)雜,可是編寫一個好的穩(wěn)健的多線程程序遠(yuǎn)不是想象中那么簡單。由于一個進(jìn)程內(nèi)的所有線程共享同一地址空間,因此某個線程的操作會不會給其他線程的數(shù)據(jù)造成影響?比如,某個負(fù)責(zé)寫數(shù)據(jù)的線程在沒有寫完的時刻,另外一個負(fù)責(zé)讀

91、取這個數(shù)據(jù)的線程開始工作,可想而知,讀出的數(shù)據(jù)肯定不是最后的結(jié)果。因此,線程的同步就是多線程程序多加關(guān)注的問題。</p><p>  此外,不同進(jìn)程的線程訪問同一內(nèi)存區(qū)域時也應(yīng)考慮線程的同步。下面介紹一些方法可以實現(xiàn)不同進(jìn)程的線程同步。</p><p>  下面我們從Windows API和MFC類兩個方面介紹線程同步的方法。</p><p>  (1)Windo

92、ws中的同步對象</p><p>  ①互斥體(Mutex)對象的使用方法</p><p>  a.創(chuàng)建互斥體對象;b.同步;c.釋放互斥體對象。</p><p> ?、谛盘枱?Semaphore)對象的使用方法</p><p>  a創(chuàng)建信號燈;b同步。</p><p>  ③事件(Event)對象的使用方法<

93、/p><p>  a創(chuàng)建事件對象;b設(shè)置事件對象是否允許線程通過;c同步。</p><p> ?、芘R界區(qū)(Critical Section)對象的使用方法</p><p>  a創(chuàng)建臨界區(qū)對象;b同步。</p><p>  (2)MFC提供的同步類</p><p>  針對Windows提供的同步對象,MFC封裝了下面幾

94、個類:CMutex:互斥體類,CSemaphore:信號燈類,CEvent:事件類和CCriticalSection:臨界區(qū)類。在MFC的類層次關(guān)系中,CSyncObject為上面四個類的基類。</p><p>  這四個類的用法比較簡單:</p><p>  第一步:使用類的構(gòu)造函數(shù)構(gòu)造一個類對象。</p><p>  第二步:使用類的成員函數(shù)CSyncObjec

95、t::Lock()獲取同步對象的占有權(quán)。</p><p>  第三步:不使用時,可以通過調(diào)用CSyncObject::UnLock()函數(shù)釋放對同步對象的占有權(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來完成,目的是為了方便擴展。</p><p>  本系統(tǒng)的主要功能有四個:在線朋友維護、聊天功能、文件傳輸功能、查看歷史信息。</p><p><b>  3.1在線朋友維護</b></p><p>  在線朋友指的是所有使用本系統(tǒng)在網(wǎng)上

97、進(jìn)行信息傳遞的用戶。</p><p>  在線朋友維護部分包括在線用戶的顯示、用戶昵稱的修改、實時更新(上線、下線)。只要有用戶上線,所有在線的朋友都可以知道,并且可以和他聊天及進(jìn)行文件的傳輸。使用本程序的用戶,可以看到在線朋友的昵稱,他們根據(jù)昵稱來進(jìn)行聊天、文件傳輸功能。當(dāng)朋友下線的時候,在線的人都可以得到通知,同時這個朋友的昵稱從朋友列表中消失,如果正在和這個朋友進(jìn)行文件傳輸,那么文件傳輸中止,如果正在和這個

98、朋友聊天,那么和這個朋友的聊天也中止。本程序用戶可以修改自己的昵稱、ID,修改完畢后,在下次上線時作用。</p><p>  用戶的配置信息比如ID、昵稱等保存在用戶自己的機器上,程序提供多種修改的方式,既可以使用本程序中提供的修改功能完成,又可以通過直接修改存放這些信息的系統(tǒng)文件來完成。</p><p><b>  3.1.1朋友上線</b></p>

99、<p>  朋友上線功能分為兩部分:</p><p>  第一:開啟系統(tǒng)的時候,使用系統(tǒng)的用戶就要收到這個人的信息,知道他已經(jīng)上線。對于上線的人,其他的人可以跟他進(jìn)行聊天,也可以進(jìn)行文件的傳輸。</p><p>  第二:系統(tǒng)在運行之中,它會不斷地進(jìn)行心跳告訴其他人。這個功能是為了防止在系統(tǒng)啟動的時候發(fā)出的用戶信息沒有被其他的使用本系統(tǒng)的人收到。使用心跳功能后,用戶的信息會不斷地

100、通知在線的人,這樣有利于系統(tǒng)的穩(wěn)定。此功能要采用網(wǎng)絡(luò)廣播來實現(xiàn)。</p><p><b>  3.1.2朋友下線</b></p><p>  當(dāng)朋友退出本系統(tǒng)時,系統(tǒng)會自動發(fā)出下線的消息。凡是正在使用本系統(tǒng)的人都會得到通知,得到這個通知后,每個在線的人都會看到這個朋友的信息從自己的列表中刪除。正在和他進(jìn)行的操作(聊天、文件傳輸)都會停止。同時聊天的窗口也會在提示過后關(guān)

101、閉。</p><p>  3.1.3名字修改 </p><p>  用戶可以修改自己的昵稱。當(dāng)修改了昵稱后,所有在線人員的朋友列表仍然保持修改前的昵稱,只有當(dāng)這個用戶下線并再次上線才會起作用。</p><p><b>  3.2聊天功能</b></p><p>  聊天功能就是在線雙方互相傳遞信息的功能,它包括一般文字的

102、傳輸和文件的傳輸兩部分。下面對一般文字的傳遞功能進(jìn)行描述。</p><p>  只要在線就可以和所有使用此系統(tǒng)的已經(jīng)在線的朋友進(jìn)行聊天,并且為不同的朋友提供不同的聊天窗口,在這個聊天窗口中,要提供聊天信息的輸入和聊天信息的顯示功能。</p><p>  要發(fā)送給對方的文字或者稱為字符的輸入工作是在聊天窗口的輸入框中完成的,當(dāng)輸入完畢后,進(jìn)行發(fā)送,當(dāng)發(fā)送沒有結(jié)束時,不能進(jìn)行新的聊天內(nèi)容的輸入

103、。特別提示:聊天的內(nèi)容一次不能超過500個字符。</p><p>  聊天信息顯示在聊天窗口中,顯示的內(nèi)容包括:發(fā)送信息、接收信息。發(fā)送信息是指自己發(fā)送給對方的信息,這里要顯示出自己的昵稱及發(fā)送內(nèi)容;接收信息是指來自對方的信息,要顯示出對方的昵稱及接收到的內(nèi)容。</p><p>  另外,發(fā)送的信息及接收的信息都會被保存起來,以備“查看聊天紀(jì)錄”功能使用。</p><p

104、><b>  3.3文件傳輸功能</b></p><p>  此系統(tǒng)除了傳輸一般的文字外,還提供文件的傳輸,從而豐富了傳遞的信息。文件傳輸功能支持任何文件類型,支持在線朋友之間的文件共享。</p><p>  3.3.1.文件傳輸功能</p><p>  因為文件傳輸必須確定接收方,因此文件傳輸功能要放到聊天窗口中。點擊傳輸文件的按鈕后,

105、應(yīng)該提供選擇文件的文件對話框,系統(tǒng)通過文件打開窗口來提示用戶找到要傳送的文件。然后確認(rèn)要進(jìn)行文件傳輸之后,這個文件會通過網(wǎng)絡(luò)傳送到與自己聊天的那個人的機器上。接收者不能阻止文件傳輸?shù)恼埱蟆=邮照呤盏竭@個文件后,會被系統(tǒng)自動放到一個指定的目錄:“\file\”。</p><p>  3.3.2.支持文件拖拽</p><p>  系統(tǒng)除了支持讓用戶選擇傳輸文件之外,還支持用戶將文件直接拖拽到和

106、這個朋友的聊天窗口之上,在拖拽的時候系統(tǒng)就不再提示。</p><p><b>  3.4查看聊天紀(jì)錄</b></p><p>  在聊天的時候會保存聊天的內(nèi)容,可以在事后對這些信息進(jìn)行查看,本系統(tǒng)會把每個用戶的信息分別放在一個文件中。</p><p>  系統(tǒng)在發(fā)送和接收聊天內(nèi)容時,會把這個信息按照聊天對象的ID進(jìn)行保存。當(dāng)用戶選擇查看聊天紀(jì)律

107、是,系統(tǒng)會調(diào)出與特定聊天對象的聊天紀(jì)錄讓用戶查看。</p><p>  下面是查看聊天紀(jì)錄的活動圖:</p><p>  圖3-1 查看聊天紀(jì)錄活動圖</p><p><b>  4.詳細(xì)設(shè)計與實現(xiàn)</b></p><p><b>  4.1類設(shè)計</b></p><p>

108、  本程序一共有10個類,其中三個是系統(tǒng)自動生成的,其余七個是為程序創(chuàng)建的,下面對它們做一個介紹:</p><p>  4.1.1系統(tǒng)生成類</p><p>  (1)CAboutDlg類,系統(tǒng)的關(guān)于對話框。</p><p>  (2)CNetMsgApp類,系統(tǒng)的Application類。</p><p>  (3)CNetMsgDlg類,

109、系統(tǒng)的主窗口類。其有以下功能:朋友的維護(增加、刪除),廣播自身profile報文的服務(wù),廣播自己下線的報文,處理朋友的上線和下線信息,判斷指定NetMsgDlg的朋友存在性,釋放和建立朋友鏈表,監(jiān)聽朋友上線和下線報文,建立與朋友聊天的會話。</p><p><b>  4.1.2.創(chuàng)建類</b></p><p>  (1)CChatDGram,聊天報文類。</

110、p><p>  (2)CChatDlg,聊天窗口類。其有以下功能:監(jiān)聽和接收其他人發(fā)送來的聊天報文,發(fā)送聊天報文,保存聊天報文,在朋友下線的時候會提示關(guān)閉自己并釋放窗口資源。</p><p>  (3)CFileTranDlg,文件傳輸?shù)念?。用來建立文件監(jiān)聽服務(wù),文件傳輸和文件接收。</p><p>  (4)CFormChatHist,查看聊天歷史信息的類,是對話框派

111、生類。按用戶的NetMsgID來進(jìn)行列表,詳細(xì)列出聊天的紀(jì)錄。</p><p>  (5)CFriendObj,代表一個朋友結(jié)點的類。它具有固定的標(biāo)識成員:NickName和NetMsgID,同時也有動態(tài)的成員:IPAddress,還有標(biāo)識與自己關(guān)聯(lián)的聊天對話框的指針:ChatDlg。</p><p>  (6)CFriendListBox</p><p>  (7

112、)CWorkSocket,TCP和UDP的類,是CSocket的派生類。</p><p>  4.2詳細(xì)設(shè)計與實現(xiàn)</p><p>  4.2.1 UDP廣播實現(xiàn)朋友上線</p><p>  圖4-1是程序的主界面,其中的ListBox用來顯示在線的朋友昵稱。</p><p><b>  圖4-1 主界面</b><

113、;/p><p>  當(dāng)朋友上線時,其他所有在線人員都需要得到通知,也就是需要將剛剛上線的朋友昵稱列在主界面的ListBox中。實現(xiàn)實時的朋友上線通知有兩種方法:一種是查詢式,另外一種是主動通知式。查詢式就是每隔一段時間,系統(tǒng)就要將整個網(wǎng)絡(luò)內(nèi)在線人員做一次查詢,并將查詢的結(jié)果顯示到主界面的列表中。這種方法需要提前知道在這個網(wǎng)絡(luò)內(nèi)所有人員的ID。主動通知式與查詢式的做法恰恰相反,它是以主動方式來通知網(wǎng)絡(luò)內(nèi)人員的。當(dāng)一個用

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論