




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)任務(wù)書學(xué)院 專業(yè)課程名稱VC+課程設(shè)計(jì)時(shí)間學(xué)生姓名指導(dǎo)老師題 目用VC+設(shè)計(jì)簡(jiǎn)單的聊天室程序主要內(nèi)容:該系統(tǒng)要求完成聊天室的全過程,包括客戶端和服務(wù)器兩大部分的編程及其連接。服務(wù)器端聊天程序負(fù)責(zé)接收和發(fā)送來自客戶端的聊天信息,客戶端聊天程序負(fù)責(zé)建立和維護(hù)與服務(wù)器端的連接,想服務(wù)器發(fā)送本客戶的聊天內(nèi)容。系統(tǒng)采用VISUAL C+語言程序設(shè)計(jì)編程實(shí)現(xiàn)。要求:(1)通過實(shí)際軟件項(xiàng)目的分析、設(shè)計(jì)、編碼、測(cè)試等工作,掌握用軟件工程的方法來開發(fā)和維護(hù)軟件。(2)按要求編寫課程設(shè)計(jì)報(bào)告書,能正確編寫分析、設(shè)計(jì)、編碼、測(cè)試等技術(shù)文檔和用戶使用手冊(cè)。 (3)進(jìn)行系統(tǒng)的聯(lián)合調(diào)試,編寫系統(tǒng)使用說明。(4)完
2、成系統(tǒng)的文檔、設(shè)計(jì)說明工作應(yīng)當(dāng)提交的文件:(1) 課程設(shè)計(jì)學(xué)年論文。(2) 課程設(shè)計(jì)附件(主要是源程序)。 用VC+設(shè)計(jì)簡(jiǎn)單的聊天室程序?qū)W生姓名: 指導(dǎo)老師: 摘 要 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)發(fā)展至今已經(jīng)大大超越了人們當(dāng)初的預(yù)想,無論是人們?nèi)粘5墓ぷ鬟€是學(xué)習(xí),我們都越來越多的依靠到互聯(lián)網(wǎng)。各種實(shí)時(shí)性的聊天娛樂軟件也同時(shí)誕生,而且為我們的即時(shí)通訊帶來了眾多的方便,比如說大家所熟知的騰訊QQ、微軟的MSN、移動(dòng)的Fetion等,都是做的比較成功的實(shí)時(shí)聊天工具。隨著網(wǎng)絡(luò)的日益普及,各種聊天工具也層出不窮,但當(dāng)我們學(xué)習(xí)了TCP/IP協(xié)議與網(wǎng)絡(luò)編程這門課程之后,我們便會(huì)覺得,其實(shí)要實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)絡(luò)通訊其實(shí)并不難。接
3、下來的課程設(shè)計(jì)就是針對(duì)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)聊天程序,利用MFC為開發(fā)工具,實(shí)現(xiàn)基本的通訊功能。在課程設(shè)計(jì)中,系統(tǒng)開發(fā)平臺(tái)為Windows 2000,程序設(shè)計(jì)設(shè)計(jì)語言采用Visual C+,數(shù)據(jù)庫(kù)采用MS SQL 2000,程序運(yùn)行平臺(tái)為Windows 98/2000/XP。關(guān)鍵詞 聊天軟件;網(wǎng)絡(luò)通訊;MFC;課程設(shè)計(jì);Visual C+1 引 言1.1課題背景及意義當(dāng)今世界正處于信息時(shí)代,計(jì)算機(jī)和通信網(wǎng)絡(luò)是這一時(shí)代所謂“信息基礎(chǔ)設(shè)施”。在互聯(lián)網(wǎng)相當(dāng)普及的今天,在互聯(lián)網(wǎng)上聊天對(duì)很多“網(wǎng)蟲”來說已經(jīng)是家常便飯了。聊天室程序可以說是網(wǎng)上最簡(jiǎn)單的多點(diǎn)通信程序。一個(gè)簡(jiǎn)單的聊天室, 從程序員的觀點(diǎn)來看就是在多個(gè)
4、I/O端點(diǎn)之間實(shí)現(xiàn)多對(duì)多的通信?;赟OCKET的局域網(wǎng)通信是一種靈活的、易于實(shí)現(xiàn)的、低成本的方法。它可以運(yùn)行在各種使用TCP/IP協(xié)議作為通訊協(xié)議的網(wǎng)絡(luò)上。而在SOCKET API的幫助下,開發(fā)基于SOCKET的局域網(wǎng)通信軟件也是易于實(shí)現(xiàn)的。1.2 實(shí)驗(yàn)平臺(tái)介紹Visual C+(簡(jiǎn)稱VC)是Microsoft公司推出的目前使用極為廣泛的基于Windows平臺(tái)的C+可視化開發(fā)環(huán)境。VC基于C,C+語言,主要由是MFC組成,是與系統(tǒng)聯(lián)系非常緊密的編程工具,它兼有高級(jí),和低級(jí)語言的雙重性,功能強(qiáng)大,靈活,執(zhí)行效率高,幾乎可說VC在 Windows平臺(tái)無所不能。VC主要是針對(duì)Window
5、s系統(tǒng),適合一些系統(tǒng)級(jí) 的開發(fā),可以方便實(shí)現(xiàn)一些底層 的調(diào)用。在VC里邊嵌入?yún)R編語言很簡(jiǎn)單。當(dāng)對(duì)系統(tǒng)性能要求很高的時(shí)候,可用VC開發(fā)。VC在多線程、網(wǎng)絡(luò)通信、分布應(yīng)用方面,有著不可比擬的優(yōu)勢(shì)。1.3 可行性分析本課程設(shè)計(jì)主要解決在客戶端于客戶端的信息交換和客戶端于服務(wù)器的信息交換及服務(wù)器的信息處理上的管理的課程設(shè)計(jì)。此程序主要分為兩部分:服務(wù)器端和客戶端。服務(wù)器端用于提供一個(gè)網(wǎng)絡(luò)端口,等待客戶端發(fā)出請(qǐng)求,登錄到此服務(wù)端,然后進(jìn)行網(wǎng)絡(luò)通訊和消息的轉(zhuǎn)發(fā);客戶端可通過服務(wù)器端的IP地址發(fā)送連接請(qǐng)求,然后登陸聊天室。在服務(wù)器端的成員列表欄中會(huì)顯示在線的所有人名單,有人退出聊天室,成員列表會(huì)自
6、動(dòng)除名。服務(wù)器端同時(shí)也提供了成員之間的私聊功能,此時(shí)服務(wù)器端作為一個(gè)轉(zhuǎn)發(fā)站,進(jìn)行消息的轉(zhuǎn)發(fā)。整個(gè)程序的主體使用了CSocket類的方法,實(shí)現(xiàn)了網(wǎng)絡(luò)通訊聊天。 先啟動(dòng)服務(wù)器端聊天程序,這是聊天服務(wù)器需要指定一個(gè)端口號(hào),客戶端則根據(jù)這個(gè)端口號(hào)以及服務(wù)器的網(wǎng)絡(luò)地址與服務(wù)器進(jìn)行通信。在這里,把端口號(hào)成為“聊天頻道” 。在后面的程序代碼分析中將看到,端口號(hào)并不等同于聊天頻道,而是在聊天頻道上增加一個(gè)固定的偏移值,使得這個(gè)聊天頻道不會(huì)和系統(tǒng)保留的端口發(fā)生沖突。 服務(wù)器啟動(dòng)后將在這個(gè)指定的端口號(hào)中等待客戶的連接。對(duì)于公共聊天室,服務(wù)器對(duì)客戶的數(shù)目不做任何限制。而對(duì)于私人聊天室,每個(gè)聊天頻道則只能允許兩個(gè)客戶
7、互相連接,使得一方發(fā)送的信息只能到達(dá)對(duì)方的主機(jī)中。這里的服務(wù)器提供的是公共聊天服務(wù)。 通過分析發(fā)現(xiàn),該程序完全可以通過Visual C+中MFC完成。2需求分析2.1 設(shè)計(jì)目的綜合運(yùn)用本課程及計(jì)算機(jī)網(wǎng)絡(luò)的相關(guān)知識(shí)設(shè)計(jì)并實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)應(yīng)用程序,以Visual C+作為開發(fā)平臺(tái),通過實(shí)踐復(fù)習(xí)鞏固課堂所學(xué)的理論知識(shí),提高對(duì)所學(xué)知識(shí)的綜合應(yīng)用能力。2.2 設(shè)計(jì)要求 采用客戶/服務(wù)器模式,分為客戶端程序和服務(wù)器端程序。服務(wù)器采用WINSOCK I/O模型中的任一種,支持多個(gè)客戶同時(shí)在線聊天。客戶端程序和服務(wù)器程序通過網(wǎng)絡(luò)交換聊天字符串內(nèi)容,服務(wù)器窗口的列表框中顯示當(dāng)前在線用戶,支持客戶端之間的私聊(可以通
8、過服務(wù)器中轉(zhuǎn),或考慮UDP打洞直接建立端端連接)。課程設(shè)計(jì)要求設(shè)計(jì)并編程完成兩個(gè)方面的內(nèi)容:首先建立一個(gè)使用TCP協(xié)議的聊天室服務(wù)器,這個(gè)服務(wù)器可以同時(shí)支持多個(gè)用戶的在線聊天;其次設(shè)計(jì)一個(gè)可以和服務(wù)器通信的聊天室客戶端。2.3 功能要求² 支持多個(gè)客戶端的連接,在服務(wù)器和多個(gè)客戶端之間進(jìn)行數(shù)據(jù)傳輸;² 接收客戶端發(fā)送的消息,并顯示在一個(gè)列表框中;² 在用戶連接上后有提示,顯示出連接的用戶名字;² 發(fā)送信息時(shí)可以顯示聊天的所有記錄;2.4 系統(tǒng)主要功能和主要功能描述:服務(wù)器端聊天程序必須能夠做3件事情:(1) 服務(wù)器聊天程序要在待定的端口上等待來自聊天客戶
9、的連接請(qǐng)求,并且需要維護(hù)一個(gè)客戶連接表,以記錄所有成功的連接。(2) 服務(wù)器聊天程序要及時(shí)接受從各個(gè)聊天客戶發(fā)送過來的信息,然后把這些信息轉(zhuǎn)發(fā)到一個(gè)或多個(gè)客戶連接。對(duì)于公共聊天室,服務(wù)器將把接受到的信息向除源端外的所有客戶發(fā)送過去。(3) 服務(wù)器還要監(jiān)控這些連接的狀態(tài),在客戶主動(dòng)離開或發(fā)生故障時(shí)從列表中刪除相應(yīng)的表項(xiàng),并及時(shí)更新連接表。這些要求可以通過CSocket類提供的功能實(shí)現(xiàn)。從CSocket派生出兩個(gè)類CListenSocket和CClientSocket,它們分別用來偵聽客戶的連接請(qǐng)求和建立與客戶的連接。服務(wù)器只需要一個(gè)偵聽套接字CListenSocket,然后根據(jù)客戶的連接請(qǐng)求動(dòng)態(tài)
10、創(chuàng)建客戶套接字CClientSocket??蛻籼捉幼值臄?shù)量是不可預(yù)知的,因此需要一個(gè)列表來記錄。MFC的CPtrList類就能實(shí)現(xiàn)這種功能??蛻舳肆奶斐绦蛐枰瓿梢韵聨讉€(gè)功能:(1) 客戶端聊天程序要負(fù)責(zé)建立和維護(hù)與服務(wù)器的連接,通過獲取用戶的設(shè)置嘗試與服務(wù)器的連接,并且隨時(shí)檢測(cè)連接的狀態(tài)。(2) 客戶端聊天程序要把用戶輸入的信息及時(shí)發(fā)送到聊天服務(wù)器。一般情況下,當(dāng)用戶輸入一行信息并且按下回車鍵后聊天程序就要把這一行信息發(fā)送出去,才能及時(shí)地滿足用戶的交互需求。(3) 要隨時(shí)準(zhǔn)備好接受來自服務(wù)器的信息,隨時(shí)把接受到的信息顯示出來,讓用戶及時(shí)看到對(duì)方的響應(yīng)。(4) 在用戶退出聊天過程是要關(guān)閉與服務(wù)
11、器的連接。比較好的做法是提前通知服務(wù)器或者直接給服務(wù)器發(fā)送一條退出通知,使得服務(wù)器能夠及時(shí)掌握客戶端的連接狀態(tài),把對(duì)方客戶的退出信息及時(shí)發(fā)送到對(duì)等實(shí)體上??蛻舳肆奶斐绦蛐枰褂靡粋€(gè)通過CSocket類派生出來的CChatSocket類來實(shí)現(xiàn)。該套接字用來發(fā)送一個(gè)與服務(wù)器的連接請(qǐng)求和維持與服務(wù)器的連接,發(fā)送和接收聊天信息,完成上述各項(xiàng)功能。3設(shè)計(jì)流程圖根據(jù)對(duì)用戶的要求及功能設(shè)置可以得到以下的流程圖3.1,用戶首先啟動(dòng)客戶端,登陸服務(wù)器并向服務(wù)器發(fā)送信息,啟動(dòng)服務(wù)器,服務(wù)器等待客戶要求并向客戶反饋在線用戶信息,用戶向服務(wù)器發(fā)送信息,服務(wù)器處理用戶的數(shù)據(jù),然后用戶開始聊天??蛻舳说牧奶旆譃閷?duì)所有人的
12、信息和私聊的信息,該信息應(yīng)通過程序控制分別進(jìn)行處理。啟動(dòng)登陸等待客戶端登陸客戶端用戶創(chuàng)建子套接字MessageCListenSocketCClientSocketMessage登陸成功連接上發(fā)送message顯示找到客戶端并顯示登陸失敗發(fā)送ID和IP圖3.1 設(shè)計(jì)流程圖4 調(diào)試分析過程描述Login服務(wù)器:在啟動(dòng)聊天室服務(wù)端的時(shí)候,會(huì)出現(xiàn)圖4.1的界面,該界面為服務(wù)器的登陸界面。圖4.1登陸服務(wù)器界面啟動(dòng)服務(wù)器:在登陸頁(yè)面的環(huán)境下,點(diǎn)擊啟動(dòng)服務(wù)器按鈕,即可創(chuàng)建一個(gè)新的服務(wù)器,服務(wù)器界面如圖4.2所示。圖4.2 啟動(dòng)服務(wù)器界面Login客戶端:在啟動(dòng)客戶端服務(wù)端的時(shí)候,會(huì)出現(xiàn)圖4.3的界面,該界
13、面為客戶端的連接界面。圖4.3 登陸客戶端界面圖4.4為創(chuàng)建張三客戶端,輸入用戶名張三:圖4.4 輸入名稱張三圖4.5為用戶張三連接服務(wù)器界面,在輸入用戶名張三并點(diǎn)擊確定后,出現(xiàn)如下界面:圖4.5 張三登陸服務(wù)器圖4.6為用戶李四的連接界面,在李四連接后,張三和李四用戶同時(shí)出現(xiàn)在用戶列表內(nèi):圖4.6 李四登陸服務(wù)器圖4.7為用戶李四的連接界面,在王五連接后,張三,李四和王五用戶同時(shí)出現(xiàn)在用戶列表內(nèi):圖4.7 王五登陸服務(wù)器服務(wù)器顯示:在張三,李四,王五進(jìn)入聊天室后的界面為圖4.8.:圖4.8 用戶成功登陸后界面開始聊天,群聊:客戶端發(fā)送信息時(shí)的界面為圖4.9圖4.9 聊天界面圖4.10為私聊界
14、面。張三與李四私聊:點(diǎn)擊私聊選項(xiàng),并發(fā)送私聊內(nèi)容。圖4.10 張三私聊界面圖4.11為張三私聊界面,李四和張三私聊,張三能看到李四發(fā)送的內(nèi)容:圖4.11 李四私聊界面圖4.12為王五的界面顯示,王五看不到張三和李四的私聊內(nèi)容:圖4.12 非私聊對(duì)象界面5 設(shè)計(jì)的總結(jié)和體會(huì)該次課程設(shè)計(jì)的制作我主要是參照了圖書館內(nèi)的相關(guān)書籍,找到一個(gè)類似的程序,然后按照書上的內(nèi)容一步步的做出來了,雖然這個(gè)程序算不上是我自己寫出來的,但通過這樣的一個(gè)過程,還是讓我學(xué)會(huì)了很多東西,也算能比較熟練地掌握MFC這一個(gè)軟件了,這算是一個(gè)不小的收獲吧,而且,在做這個(gè)程序的過程中,讓我認(rèn)識(shí)到了在做這樣程序中,遇到解決不了的問題
15、與同學(xué)的討論時(shí)很重要的,譬如可以以運(yùn)行,但是就是無法出現(xiàn)連接的顯示和狀態(tài)。最后與同學(xué)討論后,才知道是服務(wù)器端有了錯(cuò)誤,沒有設(shè)置自己的IP地址,然后對(duì)于客戶端進(jìn)行了一番修改,才終于出現(xiàn)了上述的結(jié)果。雖然沒有徹底做的出來,但是還是比較開心的,因?yàn)樽约褐懒四睦锊蛔?,哪里不可以,可以在以后多多的做練?xí)來充實(shí)自己。在課程設(shè)計(jì)過程中,收獲知識(shí),提高能力的同時(shí),我也學(xué)到了很多人生的哲理,懂得怎么樣去制定計(jì)劃,怎么樣去實(shí)現(xiàn)這個(gè)計(jì)劃,并掌握了在執(zhí)行過程中怎么樣去克服心理上的不良情緒。因此在以后的生活和學(xué)習(xí)的過程中,我一定會(huì)把課程設(shè)計(jì)的精神帶到生活中,不畏艱難,勇往直前!我以后還是需要多多的練習(xí),多多的勤奮,這
16、樣才有可能讓自己有信心,有動(dòng)力,讓自己不至于懂的太少而怯場(chǎng),因?yàn)椴欢粫?huì)做,相信自己以后會(huì)編寫出讓自己滿意的程序和軟件的。6 參考文獻(xiàn)1 任泰明著. TCP/IP協(xié)議與網(wǎng)絡(luò)編程. 西安電子科技大學(xué)出版社. 20042 唐克著. MFC程序設(shè)計(jì):Using Visual C+ 6.0. 北京希望電子出版社. 20023 鄧全良著. Winsock網(wǎng)絡(luò)程序設(shè)計(jì). 中國(guó)鐵道出版社. 20024Visual C+6.0使用與開發(fā) 清華大學(xué)出版社,木林森、高峰霞、羅麗瓊、奚紅宇編著5Visual c+ 實(shí)用教程(第三版) 鄭阿奇 , 電子工業(yè)出版社附:源代碼I服務(wù)器:/ ServerDlg.cpp :
17、 implementation file/#include "stdafx.h"#include "Server.h"#include "ServerDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();protected:DECL
18、ARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ CServerDlg dialogCServerDlg:CServerDlg(CWnd* pParent /*=NULL*/): CDialog(CServerDlg:IDD, pParent)m_hIco
19、n = AfxGetApp()->LoadIcon(IDI_ICONAPP);void CServerDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST_USER, m_lbUser);DDX_Text(pDX, IDC_EDIT_DISPLAY, m_strDisplay);BEGIN_MESSAGE_MAP(CServerDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON
20、_BN_CLICKED(IDC_BN_START, OnBnStart)ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)ON_MESSAGE(WM_RECEIVE, OnReceive)ON_MESSAGE(WM_CLIENTCLOSE, OnClientClose)ON_MESSAGE(WM_ACCEPT, OnAccept)ON_WM_DESTROY()END_MESSAGE_MAP()/ CServerDlg message handlersBOOL CServerDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(
21、IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_A
22、BOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small iconm_iNetPort = 3127;m_Server.Initialize(this);m_bServer = FALSE;GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);return TRUE; / return TRUE unless you set the focus to a controlvoid CServerDlg:OnSysComm
23、and(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CServerDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int cxIcon
24、= GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CServerDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;vo
25、id CServerDlg:OnBnStart() / 創(chuàng)建套接字m_Server.Create(m_iNetPort);/ 開始監(jiān)聽m_Server.Listen();/ 顯示CString strInfo;strInfo.LoadString(IDS_CREATE_SERVER);ShowInDisplay(strInfo);m_bServer = TRUE;GetDlgItem(IDC_BN_START)->EnableWindow(FALSE);GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE);void CServerDlg:OnBn
26、Close() CloseServer();GetDlgItem(IDC_BN_START)->EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);void CServerDlg:OnAccept()/ 創(chuàng)建新客戶CMySocket *pNewClient = new CMySocket;pNewClient->Initialize(this);m_Server.Accept(*pNewClient);/ 放入鏈表中m_lsClient.AddTail(pNewClient);void CServe
27、rDlg:OnClientClose(WPARAM wParam, LPARAM lParam)CMySocket *p_delClient = (CMySocket*)wParam;/ 關(guān)閉該用戶p_delClient->ShutDown();char bufferBUFFERSIZE;while(p_delClient->Receive(buffer, BUFFERSIZE)>0);p_delClient->Close();/ 在用戶鏈表中刪除該用戶POSITION psCur, psList = m_lsClient.GetHeadPosition();CMySo
28、cket *p_curClient;while(psList!=NULL)psCur = psList;p_curClient = (CMySocket *)m_lsClient.GetNext(psList);if(p_delClient=p_curClient)m_lsClient.RemoveAt(psCur);break;/ 發(fā)送信息告訴其他用戶該客戶退出CString strMsg;strMsg.LoadString(IDS_CLIENT_CLOSE);NETMESSAGE netMessage(PTC_CLIENT_QUIT, p_delClient->GetName(),
29、_T(""), p_delClient->GetName() + strMsg);SendToAllClient(netMessage);/ 界面上清理該用戶信息m_lbUser.DeleteString(m_lbUser.FindString(-1, p_delClient->GetName();ShowInDisplay(p_delClient->GetName() + strMsg);/ 刪除該用戶delete p_delClient;void CServerDlg:OnReceive(WPARAM wParam, LPARAM lParam)CMy
30、Socket *p_curClient = (CMySocket*)wParam;NETMESSAGE netMessage;p_curClient->Receive(char *)&netMessage, sizeof(netMessage);switch(netMessage.type)case PTC_NEW:/ 新客戶加入NewClientAdd(p_curClient, &netMessage);break;case PTC_SAY:/ 普通聊天ShowMessage(netMessage);break;/ 把加工過的信息發(fā)送給其他用戶SendToAllClie
31、nt(netMessage);void CServerDlg:CloseServer()if(!m_bServer) return;/ 向所有客戶發(fā)送服務(wù)端關(guān)閉的信息CString strInfo;strInfo.LoadString(IDS_CLOSESERVER);NETMESSAGE netMessage(PTC_SYSTEM, _T(""), _T(""), strInfo);SendToAllClient(netMessage);/ 服務(wù)端界面顯示關(guān)閉信息ShowInDisplay(strInfo);/ 關(guān)閉服務(wù)端m_Server.Close(
32、);/ 關(guān)閉客戶端char bufferBUFFERSIZE;CMySocket *m_pClient;POSITION psList = m_lsClient.GetHeadPosition();while(psList!=NULL)m_pClient = (CMySocket *)m_lsClient.GetNext(psList);m_pClient->ShutDown();while(m_pClient->Receive(buffer, BUFFERSIZE)>0);m_pClient->Close();delete m_pClient;m_lsClient.R
33、emoveAll();m_bServer = FALSE;/ 向所有戶發(fā)出信息void CServerDlg:SendToAllClient(const NETMESSAGE &netMessage)CMySocket *m_pClient;POSITION psList = m_lsClient.GetHeadPosition();while(psList!=NULL)m_pClient = (CMySocket *)m_lsClient.GetNext(psList);m_pClient->SendMsg(netMessage);void CServerDlg:ShowInD
34、isplay(CString str)m_strDisplay += str + "rn"UpdateData(false);void CServerDlg:OnDestroy() CDialog:OnDestroy();/ TODO: Add your message handler code here/ 新用戶加入 void CServerDlg:NewClientAdd(CMySocket *p_client, NETMESSAGE *netMessage)/ 存入用戶名字p_client->SetName(netMessage->form);/ 在列表框
35、中顯示該用戶m_lbUser.AddString(p_client->GetName();/ 發(fā)送用戶列表給該客戶NETMESSAGE netMsg(PTC_USER_LIST, _T(""), _T(""), _T("");int iListLen = m_lbUser.GetCount();CString strMsg;for(int index=m_lbUser.GetTopIndex(); index<iListLen; index+)m_lbUser.GetText(index, strMsg);strcpy(n
36、etMsg.data, (LPCTSTR)strMsg);p_client->SendMsg(netMsg);/ 加工信息strMsg.LoadString(IDS_NEW_CLIENT);strMsg = p_client->GetName() + strMsg;strcpy(netMessage->data, (LPCTSTR)strMsg);/ 顯示該用戶進(jìn)入ShowInDisplay(strMsg);/ 顯示普通消息void CServerDlg:ShowMessage(NETMESSAGE netMessage)CString strTo = netMessage.
37、to;if(strTo=_T("")strTo = "所有人"CString strForm = netMessage.form;CString strMsg = netMessage.data;CString strOut = strForm + "對(duì)" + strTo + "說:" + strMsg;ShowInDisplay(strOut);II客戶端:/ ClientDlg.cpp : implementation file/#include "stdafx.h"#include &qu
38、ot;Client.h"#include "ClientDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange
39、* pDX); / DDX/DDV supportprotected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ CClientDlg dialogCClientDlg:CClientDlg(CWnd* pParent /*=NULL*/):
40、 CDialog(CClientDlg:IDD, pParent)m_strDisplay = _T("");m_strSend = _T("");m_bWhispering = FALSE;m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);void CClientDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST_USER, m_lbUser);DDX_Text(pDX,
41、IDC_EDIT_DIAPLAY, m_strDisplay);DDX_Text(pDX, IDC_EDIT_SEND, m_strSend);DDX_Check(pDX, IDC_CHECK_WHISPERING, m_bWhispering);BEGIN_MESSAGE_MAP(CClientDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BN_CONNECT, OnBnConnect)ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)ON_BN_
42、CLICKED(IDC_BN_SEND, OnBnSend)ON_MESSAGE(WM_RECEIVE, OnReceive)ON_MESSAGE(WM_SOCKETCLOSE, OnServerClose)ON_MESSAGE(WM_SEND, OnSend)ON_MESSAGE(WM_CONNCET, OnConnect)ON_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser)END_MESSAGE_MAP()/ CClientDlg message handlersBOOL CClientDlg:OnInitDialog()CDialog:OnInit
43、Dialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(
44、MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ 參數(shù)初始化m_Socket.Initialize(this);m_strNetIP = _T("127.0.0.1");m_iNetPort = 3127;m_bConnect = FALSE;GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)-&g
45、t;EnableWindow(FALSE);return TRUE; / return TRUE unless you set the focus to a controlvoid CClientDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CClientDlg:OnPaint() if (IsIconic()CPaintDC
46、 dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;d
47、c.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CClientDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CClientDlg:OnBnConnect() CString strConnectError;/ 獲取用戶名字CInputDlg inputDlg;int iResult = inputDlg.DoModal();if(iResult=IDCANCEL)return;m_strName = inputDlg.m_strName;/ 創(chuàng)建套接字if(!m_Socket
48、.Create()strConnectError.LoadString(IDS_FAIL_CREATE_SOCKET);ShowInDisplay(strConnectError);return;CString strInfo;strInfo.LoadString(IDS_CONNECTING);ShowInDisplay(strInfo);/ 連接服務(wù)器if(!m_Socket.Connect(m_strNetIP, m_iNetPort)int n = m_Socket.GetLastError();strConnectError.LoadString(IDS_FAIL_CONNECT);
49、ShowInDisplay(strConnectError);return;strInfo.LoadString(IDS_SUCCEED_CONNECT);ShowInDisplay(strInfo);m_bConnect = TRUE;/ 發(fā)送自已的名字NETMESSAGE netMessage(PTC_NEW, m_strName, _T(""), _T("");m_Socket.SendMsg(netMessage);GetDlgItem(IDC_BN_CONNECT)->EnableWindow(FALSE);GetDlgItem(IDC_
50、BN_CLOSE)->EnableWindow(TRUE);GetDlgItem(IDC_BN_SEND)->EnableWindow(TRUE);void CClientDlg:OnBnClose() if(m_bConnect) m_Socket.Close();m_bConnect = FALSE;GetDlgItem(IDC_BN_CONNECT)->EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)->EnableWindow(F
51、ALSE);m_lbUser.ResetContent();CString strMsg;strMsg.LoadString(IDS_BREAK);ShowInDisplay(strMsg);void CClientDlg:OnBnSend() OnSend();m_strSend = _T("");UpdateData(FALSE);void CClientDlg:OnReceive()NETMESSAGE netMessage;m_Socket.Receive(char *)&netMessage, sizeof(netMessage);CString strF
52、orm = netMessage.form;/ 過濾自已發(fā)出的信息if(strForm=m_strName) return;CString strTo = netMessage.to;CString strMsg = netMessage.data;switch(netMessage.type)case PTC_USER_LIST:/ 用戶列表m_lbUser.AddString(strMsg);break;case PTC_NEW:/ 新用戶進(jìn)入m_lbUser.AddString(strForm);ShowInDisplay(strMsg);break;case PTC_SAY:ShowMessage(netMessage);case PTC_WHISPERING:/ 密語if(strTo!=m_strName) return;ShowMessa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件測(cè)試基礎(chǔ)知識(shí)試題及答案
- 2025屆欽州市重點(diǎn)中學(xué)數(shù)學(xué)七下期末復(fù)習(xí)檢測(cè)模擬試題含解析
- 2025屆北京東城二中學(xué)八年級(jí)數(shù)學(xué)第二學(xué)期期末質(zhì)量檢測(cè)試題含解析
- C++高級(jí)編程技巧試題及答案
- 網(wǎng)絡(luò)安全攻防演練中的策略與技巧試題及答案
- 如何開展精益管理實(shí)踐計(jì)劃
- 醫(yī)院內(nèi)部培訓(xùn)體系建設(shè)計(jì)劃
- 重慶市彭水一中學(xué)2025屆七年級(jí)數(shù)學(xué)第二學(xué)期期末教學(xué)質(zhì)量檢測(cè)模擬試題含解析
- 軟件開發(fā)常見問題解析試題及答案
- 城市交通與城市規(guī)劃方法創(chuàng)新研究重點(diǎn)基礎(chǔ)知識(shí)點(diǎn)
- 2023年四川省第一期醫(yī)療護(hù)理員理論考試試題及答案
- 2022-2023學(xué)年寧夏回族石嘴山市大武口區(qū)小學(xué)六年級(jí)第二學(xué)期小升初數(shù)學(xué)試卷含答案
- 經(jīng)濟(jì)與社會(huì):如何用決策思維洞察生活學(xué)習(xí)通課后章節(jié)答案期末考試題庫(kù)2023年
- 日本文化知識(shí)競(jìng)賽真題模擬匯編(共877題)
- 幼兒園小班語言活動(dòng)《我不想離開你》繪本故事PPT課件【幼兒教案】
- 2023汽車智能座艙分級(jí)與綜合評(píng)價(jià)白皮書
- 職業(yè)暴露針刺傷應(yīng)急預(yù)案演練腳本-
- 校外培訓(xùn)機(jī)構(gòu)章程示范文本
- 大學(xué)生就業(yè)指導(dǎo)之職業(yè)素養(yǎng)與職業(yè)能力
- 砂檢驗(yàn)報(bào)告(機(jī)制砂)國(guó)標(biāo) 亞甲藍(lán)值<1.4或合格
- YY/T 0068.2-2008醫(yī)用內(nèi)窺鏡硬性內(nèi)窺鏡第2部分:機(jī)械性能及測(cè)試方法
評(píng)論
0/150
提交評(píng)論