MFC聊天軟件課程設(shè)計(jì)報(bào)告書_第1頁
MFC聊天軟件課程設(shè)計(jì)報(bào)告書_第2頁
MFC聊天軟件課程設(shè)計(jì)報(bào)告書_第3頁
MFC聊天軟件課程設(shè)計(jì)報(bào)告書_第4頁
MFC聊天軟件課程設(shè)計(jì)報(bào)告書_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 . . . 面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì)設(shè)計(jì)說明書網(wǎng)絡(luò)聊天程序設(shè)計(jì)起止日期:2012年5月27日至2012年6月1日學(xué)生 何根班級(jí)計(jì)本103班學(xué)號(hào)成績(jī)指導(dǎo)教師(簽字)計(jì)算機(jī)與通信學(xué)院2012年 5 月30 日17 / 18網(wǎng)絡(luò)聊天程序設(shè)計(jì)一、 課題的介紹和課題的任務(wù)課題介紹:近年來隨著PC的廣泛應(yīng)用和網(wǎng)絡(luò)的不斷發(fā)展,目前網(wǎng)絡(luò)技術(shù)已經(jīng)成為了計(jì)算機(jī)領(lǐng)域的最熱門的發(fā)展方向。聊天室。在網(wǎng)絡(luò)早期就開始盛行,不論是BBS,IRC 都有類似網(wǎng)上聊天室的機(jī)制。聊天室適用于網(wǎng)上會(huì)議或閑聊的一些場(chǎng)合。聊天室為網(wǎng)友提供了較好的交友環(huán)境,網(wǎng)友之間相互以文字交談,在形式上有點(diǎn)類似筆友的性質(zhì),卻大大節(jié)省了書信往返

2、的時(shí)間,這也是網(wǎng)上交友之所以如此熱門的原因。課題任務(wù):1、綜合運(yùn)用本課程與計(jì)算機(jī)網(wǎng)絡(luò)的相關(guān)知識(shí)設(shè)計(jì)并實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)應(yīng)用程序,以Visual C+6.0作為開發(fā)平臺(tái),通過實(shí)踐復(fù)習(xí)鞏固課堂所學(xué)的理論知識(shí),提高對(duì)所學(xué)知識(shí)的綜合應(yīng)用能力,進(jìn)一步加強(qiáng)winsock編程技術(shù)。2、采用客戶/服務(wù)器模式,分為客戶端程序和服務(wù)器程序。服務(wù)器采用WINSOCK I/O模型中的任一種,支持多個(gè)客戶同時(shí)在線聊天??蛻舳顺绦蚝头?wù)器程序通過網(wǎng)絡(luò)交換聊天字符串容,服務(wù)器窗口的列表框中顯示當(dāng)前在線用戶,支持服務(wù)器與客戶端之間的私聊二、設(shè)計(jì)的要求1、 用WINSOCK實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)絡(luò)聊天;2、 在MFC開發(fā)平臺(tái)上編寫一個(gè)聊天系統(tǒng)

3、; 3、 得server和client之間可以相互通信; 4、 多人能夠發(fā)送信息至服務(wù)器,首先顯示進(jìn)入聊天室的成員名,然后顯示對(duì)方名字和聊天信息,可以并發(fā)執(zhí)行。5、 服務(wù)器與單個(gè)客戶端之間可以進(jìn)行私聊三、系統(tǒng)的分析和系統(tǒng)中類的設(shè)計(jì)在此主要介紹服務(wù)器端的構(gòu)建(即本人所負(fù)責(zé)的部分),不是本人負(fù)責(zé)的部分不過多介紹建立連接過程流程圖如下:程序個(gè)模塊代碼如下:1.客戶端 (1)通過AppWizard生成基于對(duì)話框的應(yīng)用程序ChatClient,在向?qū)У牡诙竭x擇WindowsSockets的支持,其余步驟均用默認(rèn)值。 (2)增加一個(gè)登錄服務(wù)器的對(duì)話框資源,其ID為IDD_SETUP,然后通過ClassW

4、izard生成對(duì)應(yīng)的基于CDialog的類CSetupDlg。 (3)給對(duì)話框CSetupDlg增加3個(gè)編輯框,用來輸入登錄信息(聊天代號(hào)、服務(wù)器地址以與服務(wù)器端口號(hào)), (4)通過ClassWizard生成對(duì)應(yīng)的基于CSocket的類CChatSocket。 (5)給CChatSocket類聲明一個(gè)主對(duì)話框CChatClientDlg指針類型的私有成員變量,其代碼如下: protected: CChatClientDlg* m_pDlg;并且在ChatSocket類的頭文件開始處增加如下代碼:class CChatClientDlg; /主對(duì)話框類 (6)給ChatSocket類重載一個(gè)構(gòu)造

5、函數(shù),其定義如下: CChatSocket:CChatSocket(CChatClientDlg* pDlg) m_pDlg = pDlg;并且在ChatSocket類的CPP文件開始處增加如下語句:#include "ChatClientDlg.h" (7)通過ClassWizard響應(yīng)類的ChatSocket的OnReceive函數(shù),表示可以接收數(shù)據(jù)了,其代碼如下:/通知客戶端可以接受數(shù)據(jù)void CChatSocket:OnReceive(int nErrorCode) CSocket:OnReceive(nErrorCode); if(m_pDlg) PlaySou

6、nd("F:msg.wav",NULL,SND_ASYNC|SND_NODEFAULT); m_pDlg->ProcessPendingRead(); (8)在主對(duì)話框ChatClientDlg的頭文件中定義ChatSocket指針類型的私有成員變量,其代碼如下:CChatSocket* m_pSocket;并且在CChatClientDlg類的頭文件開始處增加如下代碼:class CChatSocket;/基于CSocket的新類CChatSocket (9)給對(duì)話框CChatClientDlg增加處理接收數(shù)據(jù)的共有成員函數(shù)ProcessPendingRead,其定

7、義如下:void CChatClientDlg:ProcessPendingRead()/處理接收的數(shù)據(jù) /定義緩沖區(qū) char bufferBUFFER_SIZE; /接收數(shù)據(jù) int nReceived = m_pSocket->Receive(buffer,BUFFER_SIZE,0); buffernReceived = 0; /將數(shù)據(jù)在列表框中顯示出來 CString str; str.Format("%s",buffer); m_ctrlMsgs.AddString(str); (10)給對(duì)話框CChatClientDlg增加發(fā)送數(shù)據(jù)的私有成員函數(shù)Send

8、Msg:/發(fā)送數(shù)據(jù)到服務(wù)器void CChatClientDlg:SendMsg(CString strMsg) CString str; str.Format("%s:%s",m_strClientName,strMsg); m_pSocket->Send(str.GetBuffer(0),str.GetLength(),0);并且在CChatClientDlg類的頭文件開始處定義緩沖區(qū)的大小,其代碼如下:#defineBUFFER_SIZE200 (11)給對(duì)話框CChatClientDlg增加表示聊天代號(hào)的CString類型私有成員變量m_strClientNa

9、me。 (12)在對(duì)話框CChatClientDlg的OnInitialUpdate函數(shù)中增加登錄服務(wù)器的代碼:BOOL CChatClientDlg:OnInitDialog()/登錄服務(wù)器 CDialog:OnInitDialog(); ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) CString strAboutMenu; strAboutMe

10、nu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty() pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX, strAboutMenu); SetIcon(m_hIcon, TRUE);/ Set big icon SetIcon(m_hIcon, FALSE);/ Set small icon /顯示登錄對(duì)話框CSetupDlg dlg; if(dlg.DoModal()=IDOK) /創(chuàng)建一個(gè)新的Socket m_

11、pSocket = new CChatSocket(this); if (!m_pSocket->Create() delete m_pSocket; m_pSocket = NULL; AfxMessageBox("create socket failed"); return FALSE; /連接服務(wù)器 while (!m_pSocket->Connect(dlg.m_strServer,dlg.m_nPort + 700) if (AfxMessageBox("Failed to connect to servernTry again?"

12、,MB_YESNO) = IDNO) delete m_pSocket; m_pSocket = NULL; return FALSE; m_strClientName = dlg.m_strName; else return FALSE; /發(fā)送登錄消息給服務(wù)器 SendMsg("進(jìn)入聊天室"); return TRUE; / return TRUE unless you set the focus to a control (13)給主對(duì)話框CChatClientDlg增加一個(gè)CListBox類型的變量m_strMsg。 (14)給住對(duì)話框CChatClientDlg增

13、加一個(gè)輸入發(fā)送信息的編輯框,并生成對(duì)應(yīng)的CString類型的變量m_strMsg。(15)給主對(duì)話框CChatClientDlg增加一個(gè)send按鈕,其響應(yīng)函數(shù)定義如下:void CChatClientDlg:OnSend() /響應(yīng)控件send UpdateData(TRUE); SendMsg(m_strMsg);m_strMsg.Empty();/清空編輯區(qū) UpdateData(FALSE); (16)給主對(duì)話框增添一個(gè)離開按鈕,其響應(yīng)函數(shù)定義如下:void CChatClientDlg:leave()/離開 SendMsg("離開聊天室"); m_ctrlMsgs

14、.AddString("離開狀態(tài)");m_pSocket->Close();(17)給主對(duì)話框增添一個(gè)連接按鈕,其響應(yīng)函數(shù)如下:void CChatClientDlg:land()/連接OnInitDialog();四、系統(tǒng)的數(shù)據(jù)設(shè)計(jì)沒有涉與到數(shù)據(jù)設(shè)計(jì),只有文件保存。五、系統(tǒng)的實(shí)現(xiàn)與調(diào)試1.服務(wù)端初始化, 進(jìn)入聊天室界面:2.客戶端初始化,端口號(hào)與服務(wù)器對(duì)應(yīng):4. 進(jìn)入聊天界面:5.聊天室顯示進(jìn)入的客戶:6.另一個(gè)客戶進(jìn)入聊天室:7.在客戶界面上顯示聊天界面:8.在聊天室界面上顯示所有客戶的聊天記錄:9.顯示何留根離開聊天室:10.在何留根的聊天界面上顯示離開狀態(tài):1

15、1.顯示何留根又進(jìn)入聊天室:五、系統(tǒng)的實(shí)現(xiàn)與調(diào)試我做的是“網(wǎng)絡(luò)聊天程序”,這個(gè)程序是和何留根同學(xué)合作的,通過做這個(gè)系統(tǒng),我鞏固和運(yùn)用了很多課上學(xué)過的知識(shí),也學(xué)會(huì)了很多課上沒有講過的知識(shí),感受到了解課外知識(shí)的重要性,可謂是受益匪淺。在最開始建立工程時(shí)就犯了一個(gè)很大的錯(cuò)誤,建錯(cuò)了工程,以致在建類時(shí)總是出錯(cuò),浪費(fèi)了幾個(gè)小時(shí)才發(fā)現(xiàn)要建基于對(duì)話框的程序。這就體現(xiàn)了上課聽講的重要性,由于一時(shí)的疏忽又很有可能造成無可挽回的錯(cuò)誤。我們做的系統(tǒng)很小,如果這是一個(gè)巨大工程,犯了這樣一個(gè)錯(cuò)誤,那是致命的。但是,話說回來,這不叫浪費(fèi)時(shí)間,我們要吃一塹長(zhǎng)一智,下次要記住,做工程,從第一步就應(yīng)該認(rèn)認(rèn)真真,踏踏實(shí)實(shí),避免出

16、錯(cuò)。已進(jìn)入工程,首先就做好了所有的界面設(shè)計(jì)。其中又遇到了很多困難。在插入位圖時(shí),要調(diào)整位圖的大小,這是我不知道的,通過參考書和討論終于完成這一步。從中,我更加堅(jiān)定了討論的重要作用。其次,代碼部分很多很復(fù)雜,但是結(jié)構(gòu)確是很清晰的。我想這應(yīng)該是MFC的一個(gè)很大的優(yōu)點(diǎn)。根據(jù)參考書上的講解和自己的揣摩,我明白了整個(gè)算法的靈魂。這個(gè)程序講的是通信,互聯(lián)網(wǎng)上關(guān)于聊天功能的工具非常多,但是其實(shí)現(xiàn)技術(shù)都是小異。我們做的這個(gè)系統(tǒng)是用WINSOCK實(shí)現(xiàn)的最簡(jiǎn)單的聊天,能夠發(fā)送信息至服務(wù)器,。把通信的思想轉(zhuǎn)化成語言的過程,靠的是C+的基礎(chǔ)。實(shí)現(xiàn)過程中犯了很多錯(cuò)誤,真的很后悔基礎(chǔ)功不牢固,現(xiàn)在就要付出更多的時(shí)間來彌補(bǔ)

17、。有些人,可以隨口說出那些常用的函數(shù),走了一條捷徑,而不知道的人,就要花時(shí)間去找那個(gè)函數(shù),或者說自己寫代碼來實(shí)現(xiàn)那個(gè)函數(shù)的功能。所以,從現(xiàn)在開始,我會(huì)認(rèn)真面對(duì)每一次編程,即使是小程序,也一樣能鍛煉人。到這,這個(gè)學(xué)期的MFC學(xué)習(xí)結(jié)束了,但對(duì)知識(shí)的追求還沒有結(jié)束,我們會(huì)的只是知識(shí)海洋里的一瓢水,還有更多的東西需要我們?nèi)ャ@研。不能說自己會(huì)有多高的覺悟,但小小的收益是無可否認(rèn)的。最后,老師本學(xué)期的精心教導(dǎo)!附1:完成該系統(tǒng)的所有成員與其工作徐夢(mèng)云:服務(wù)器戶端的開發(fā)與美化,后期處理等。何根:客戶端的開發(fā)與美化。附2:系統(tǒng)的主要程序代碼void CListeningSocket:OnAccept(int

18、nErrorCode) /通知服務(wù)器,有客戶端需要連接服務(wù)器CSocket:OnAccept(nErrorCode);/主對(duì)話框處理連接信息if(m_pDlg)m_pDlg->ProcessPendingAccept();void CClientSocket:OnReceive(int nErrorCode) /通知服務(wù)器可以接受數(shù)據(jù)CSocket:OnReceive(nErrorCode);if(m_pDlg) /讓主對(duì)話框處理數(shù)據(jù)m_pDlg->ProcessPendingRead(this);void CChatServerDlg:ProcessPendingAccept()

19、/生成一個(gè)新的套節(jié)字與客戶端通訊CClientSocket* pSocket = new CClientSocket(this);if (m_pSocket->Accept(*pSocket) /將該套節(jié)字保存起來m_connectionList.AddTail(pSocket);elsedelete pSocket;void CChatServerDlg:UpdateClients(char *buffer, int nBufferSize) /通知所有客戶端更新消息for(POSITION pos = m_connectionList.GetHeadPosition();pos !=

20、 NULL;)/將新信息發(fā)送給每個(gè)客戶端CClientSocket* pSocket= (CClientSocket*)m_connectionList.GetNext(pos);if (buffer != NULL)pSocket->Send(buffer,nBufferSize,0);void CChatServerDlg:Onsiliao() /將數(shù)據(jù)發(fā)送給指定客戶int Position=m_people_num.GetCurSel();if(Position=-1)AfxMessageBox("沒有選中聯(lián)系人!",NULL,MB_OK);return ;in

21、tt=0;CString name,temp;m_people_num.GetText(Position,name); /得到選中人的for(POSITIONpos = m_connectionList.GetHeadPosition();pos != NULL; +cnt)/將新信息發(fā)送給指定客戶端CClientSocket* pSocket= (CClientSocket*)m_connectionList.GetNext(pos);m_people_num.GetText(cnt,temp);if(temp=name)pSocket->Send(m_strMsg.GetBuffer(0),m_strMsg.GetLength(),0);break; UpdateData(1);/將數(shù)據(jù)在列表框中顯示出來m_ctrlMsgs.AddString(m_strMsg);m_strMsg.Empty();/清空編輯區(qū)UpdateData(0);void CChatServerDlg:OnSave() ofstream outfile;outfile.open("ServerData.txt",ios:out|ios

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論