版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 面向對象程序設計課程設計</p><p><b> 設計說明書</b></p><p> 起止日期:2012年5月27日至2012年6月1日</p><p><b> 計算機與通信學院</b></p><p> 2012年 5 月30 日</p><
2、;p> 網絡聊天程序設計</p><p><b> 網絡聊天程序設計</b></p><p> 課題的介紹和課題的任務</p><p><b> 課題介紹:</b></p><p> 近年來隨著PC的廣泛應用和網絡的不斷發(fā)展,目前網絡技術已經成為了計算機領域內的最熱門的發(fā)展方向。<
3、;/p><p> 聊天室。在網絡早期就開始盛行,不論是BBS,IRC 都有類似網上聊天室的機制。聊天室適用于網上會議或閑聊的一些場合。聊天室為網友提供了較好的交友環(huán)境,網友之間相互以文字交談,在形式上有點類似筆友的性質,卻大大節(jié)省了書信往返的時間,這也是網上交友之所以如此熱門的原因。</p><p><b> 課題任務:</b></p><
4、;p> 1、綜合運用本課程及計算機網絡的相關知識設計并實現(xiàn)一個網絡應用程序,以Visual C++6.0作為開發(fā)平臺,通過實踐復習鞏固課堂所學的理論知識,提高對所學知識的綜合應用能力,進一步加強winsock編程技術。</p><p> 2、采用客戶/服務器模式,分為客戶端程序和服務器程序。服務器采用WINSOCK I/O模型中的任一種,支持多個客戶同時在線聊天??蛻舳顺绦蚝头掌鞒绦蛲ㄟ^網絡交換聊天字
5、符串內容,服務器窗口的列表框中顯示當前在線用戶,支持服務器與客戶端之間的私聊</p><p><b> 二、設計的要求</b></p><p> 用WINSOCK實現(xiàn)簡單的網絡聊天;</p><p> 在MFC開發(fā)平臺上編寫一個聊天系統(tǒng); </p><p> 得server和client之間可以相互通信; <
6、;/p><p> 多人能夠發(fā)送信息至服務器,首先顯示進入聊天室的成員名,然后顯示對方名字和聊天信息,可以并發(fā)執(zhí)行。</p><p> 服務器與單個客戶端之間可以進行私聊</p><p> 三、系統(tǒng)的分析和系統(tǒng)中類的設計</p><p> 在此主要介紹服務器端的構建(即本人所負責的部分),不是本人負責的部分不過多介紹</p>
7、<p> 建立連接過程流程圖如下:</p><p> 程序個模塊代碼如下:</p><p><b> 1.客戶端</b></p><p> (1)通過AppWizard生成基于對話框的應用程序ChatClient,在向導的第二步選擇WindowsSockets的支持,其余步驟均用默認值。</p><p>
8、; ?。?)增加一個登錄服務器的對話框資源,其ID為IDD_SETUP,然后通過ClassWizard生成對應的基于CDialog的類CSetupDlg。</p><p> ?。?)給對話框CSetupDlg增加3個編輯框,用來輸入登錄信息(聊天代號、服務器地址以及服務器端口號),</p><p> ?。?)通過ClassWizard生成對應的基于CSocket的類CChatSocket。
9、</p><p> ?。?)給CChatSocket類聲明一個主對話框CChatClientDlg指針類型的私有成員變量,其代碼如下:</p><p> protected:</p><p> CChatClientDlg* m_pDlg;</p><p> 并且在ChatSocket類的頭文件開始處增加如下代碼:</p>
10、<p> class CChatClientDlg; //主對話框類</p><p> (6)給ChatSocket類重載一個構造函數(shù),其定義如下:</p><p> CChatSocket::CChatSocket(CChatClientDlg* pDlg)</p><p><b> {</b></p>&
11、lt;p> m_pDlg = pDlg;</p><p><b> }</b></p><p> 并且在ChatSocket類的CPP文件開始處增加如下語句:</p><p> #include "ChatClientDlg.h"</p><p> ?。?)通過ClassWizard響應
12、類的ChatSocket的OnReceive函數(shù),表示可以接收數(shù)據了,其代碼如下:</p><p> //通知客戶端可以接受數(shù)據</p><p> void CChatSocket::OnReceive(int nErrorCode) {</p><p> CSocket::OnReceive(nErrorCode);</p><p>
13、; if(m_pDlg){</p><p> PlaySound("F:\msg.wav",NULL,SND_ASYNC|SND_NODEFAULT);</p><p> m_pDlg->ProcessPendingRead();</p><p><b> }</b></p><p>
14、;<b> }</b></p><p> ?。?)在主對話框ChatClientDlg的頭文件中定義ChatSocket指針類型的私有成員變量,其代碼如下:</p><p> CChatSocket* m_pSocket;</p><p> 并且在CChatClientDlg類的頭文件開始處增加如下代碼:</p><p
15、> class CChatSocket;//基于CSocket的新類CChatSocket</p><p> ?。?)給對話框CChatClientDlg增加處理接收數(shù)據的共有成員函數(shù)ProcessPendingRead,其定義如下:</p><p> void CChatClientDlg::ProcessPendingRead()//處理接收的數(shù)據{</p>&
16、lt;p><b> //定義緩沖區(qū)</b></p><p> char buffer[BUFFER_SIZE];</p><p><b> //接收數(shù)據</b></p><p> int nReceived = m_pSocket->Receive(buffer,BUFFER_SIZE,0);</
17、p><p> buffer[nReceived] = 0;</p><p> //將數(shù)據在列表框中顯示出來</p><p> CString str;</p><p> str.Format("%s",buffer);</p><p> m_ctrlMsgs.AddString(str);&
18、lt;/p><p><b> }</b></p><p> (10)給對話框CChatClientDlg增加發(fā)送數(shù)據的私有成員函數(shù)SendMsg:</p><p> //發(fā)送數(shù)據到服務器</p><p> void CChatClientDlg::SendMsg(CString strMsg){</p>
19、<p> CString str;</p><p> str.Format("%s:%s",m_strClientName,strMsg);</p><p> m_pSocket->Send(str.GetBuffer(0),str.GetLength(),0);</p><p><b> }</b>
20、;</p><p> 并且在CChatClientDlg類的頭文件開始處定義緩沖區(qū)的大小,其代碼如下:</p><p> #defineBUFFER_SIZE200</p><p> ?。?1)給對話框CChatClientDlg增加表示聊天代號的CString類型私有成員變量m_strClientName。</p><p> ?。?/p>
21、12)在對話框CChatClientDlg的OnInitialUpdate函數(shù)中增加登錄服務器的代碼:</p><p> BOOL CChatClientDlg::OnInitDialog()//登錄服務器{</p><p> CDialog::OnInitDialog();</p><p> ASSERT((IDM_ABOUTBOX & 0xFFF0
22、) == IDM_ABOUTBOX);</p><p> ASSERT(IDM_ABOUTBOX < 0xF000);</p><p> CMenu* pSysMenu = GetSystemMenu(FALSE);</p><p> if (pSysMenu != NULL) {</p><p> CStrin
23、g strAboutMenu;</p><p> strAboutMenu.LoadString(IDS_ABOUTBOX);</p><p> if (!strAboutMenu.IsEmpty()) {</p><p> pSysMenu->AppendMenu(MF_SEPARATOR); pSysMen
24、u->AppendMenu(MF_STRING,IDM_ABOUTBOX, strAboutMenu);</p><p><b> }</b></p><p><b> }</b></p><p> SetIcon(m_hIcon, TRUE);// Set big icon</p><
25、;p> SetIcon(m_hIcon, FALSE);// Set small icon </p><p><b> //顯示登錄對話框</b></p><p> CSetupDlg dlg;</p><p> if(dlg.DoModal()==IDOK) {</p><p> //
26、創(chuàng)建一個新的Socket</p><p> m_pSocket = new CChatSocket(this);</p><p> if (!m_pSocket->Create()) {</p><p> delete m_pSocket;</p><p> m_pSocket = NULL;</p>
27、;<p> AfxMessageBox("create socket failed");</p><p> return FALSE;</p><p><b> }</b></p><p><b> //連接服務器</b></p><p> while
28、 (!m_pSocket->Connect(dlg.m_strServer,dlg.m_nPort + 700)) {</p><p> if (AfxMessageBox("Failed to connect to server\nTry again?",MB_YESNO) == IDNO) {</p><p> delete m_pSock
29、et;</p><p> m_pSocket = NULL;</p><p> return FALSE;</p><p><b> }</b></p><p><b> }</b></p><p> m_strClientName = dlg.m_strName;
30、</p><p><b> }</b></p><p><b> else</b></p><p> return FALSE;</p><p> //發(fā)送登錄消息給服務器</p><p> SendMsg("進入聊天室");</p>
31、;<p> return TRUE; // return TRUE unless you set the focus to a control</p><p><b> }</b></p><p> ?。?3)給主對話框CChatClientDlg增加一個CListBox類型的變量m_strMsg。</p><p> ?。?/p>
32、14)給住對話框CChatClientDlg增加一個輸入發(fā)送信息的編輯框,并生成對應的CString類型的變量m_strMsg。</p><p> ?。?5)給主對話框CChatClientDlg增加一個【send】按鈕,其響應函數(shù)定義如下:</p><p> void CChatClientDlg::OnSend() //響應控件send{</p><p>
33、UpdateData(TRUE); </p><p> SendMsg(m_strMsg);</p><p> m_strMsg.Empty();////清空編輯區(qū)</p><p> UpdateData(FALSE);</p><p><b> } </b></p><p> ?。?6)
34、給主對話框增添一個【離開】按鈕,其響應函數(shù)定義如下:</p><p> void CChatClientDlg::leave()//離開{</p><p> SendMsg("離開聊天室");</p><p> m_ctrlMsgs.AddString("離開狀態(tài)");</p><p> m_p
35、Socket->Close();</p><p><b> }</b></p><p> ?。?7)給主對話框增添一個【連接】按鈕,其響應函數(shù)如下:</p><p> void CChatClientDlg::land()//連接{</p><p> OnInitDialog();</p>&l
36、t;p><b> }</b></p><p><b> 四、系統(tǒng)的數(shù)據設計</b></p><p> 沒有涉及到數(shù)據設計,只有文件保存。</p><p> 五、系統(tǒng)的實現(xiàn)及調試</p><p> 1.服務端初始化, 進入聊天室界面:</p><p> 2.客
37、戶端初始化,端口號與服務器對應:</p><p> 4. 進入聊天界面:</p><p> 5.聊天室顯示進入的客戶:</p><p> 6.另一個客戶進入聊天室:</p><p> 7.在客戶界面上顯示聊天界面:</p><p> 8.在聊天室界面上顯示所有客戶的聊天記錄:</p><p
38、> 9.顯示何留根離開聊天室:</p><p> 10.在何留根的聊天界面上顯示離開狀態(tài):</p><p> 11.顯示何留根又進入聊天室:</p><p> 五、系統(tǒng)的實現(xiàn)及調試</p><p> 我做的是“網絡聊天程序”,這個程序是和何留根同學合作的,通過做這個系統(tǒng),我鞏固和運用了很多課上學過的知識,也學會了很多課上沒有講
39、過的知識,感受到了解課外知識的重要性,可謂是受益匪淺。</p><p> 在最開始建立工程時就犯了一個很大的錯誤,建錯了工程,以致在建類時總是出錯,浪費了幾個小時才發(fā)現(xiàn)要建基于對話框的程序。這就體現(xiàn)了上課聽講的重要性,由于一時的疏忽又很有可能造成無可挽回的錯誤。我們做的系統(tǒng)很小,如果這是一個巨大工程,犯了這樣一個錯誤,那是致命的。但是,話說回來,這不叫浪費時間,我們要吃一塹長一智,下次要記住,做工程,從第一步就
40、應該認認真真,踏踏實實,避免出錯。已進入工程,首先就做好了所有的界面設計。其中又遇到了很多困難。在插入位圖時,要調整位圖的大小,這是我不知道的,通過參考書和討論終于完成這一步。從中,我更加堅定了討論的重要作用。其次,代碼部分很多很復雜,但是結構確是很清晰的。我想這應該是MFC的一個很大的優(yōu)點。根據參考書上的講解和自己的揣摩,我明白了整個算法的靈魂。</p><p> 這個程序講的是通信,互聯(lián)網上關于聊天功能的
41、工具非常多,但是其實現(xiàn)技術都是大同小異。我們做的這個系統(tǒng)是用WINSOCK實現(xiàn)的最簡單的聊天,能夠發(fā)送信息至服務器,。把通信的思想轉化成語言的過程,靠的是C++的基礎。實現(xiàn)過程中犯了很多錯誤,真的很后悔基礎功不牢固,現(xiàn)在就要付出更多的時間來彌補。有些人,可以隨口說出那些常用的函數(shù),走了一條捷徑,而不知道的人,就要花時間去找那個函數(shù),或者說自己寫代碼來實現(xiàn)那個函數(shù)的功能。所以,從現(xiàn)在開始,我會認真面對每一次編程,即使是小程序,也一樣能鍛煉
42、人。</p><p> 到這,這個學期的MFC學習結束了,但對知識的追求還沒有結束,我們會的只是知識海洋里的一瓢水,還有更多的東西需要我們去鉆研。不能說自己會有多高的覺悟,但小小的收益是無可否認的。</p><p> 最后,謝謝xx老師本學期的精心教導!</p><p> 附1:完成該系統(tǒng)的所有成員名單及其工作</p><p> 徐夢
43、云:服務器戶端的開發(fā)及美化,后期處理等。</p><p> 何劉根:客戶端的開發(fā)及美化。</p><p> 附2:系統(tǒng)的主要程序代碼</p><p> void CListeningSocket::OnAccept(int nErrorCode) //通知服務器,有客戶端需要連接服務器</p><p><b> {<
44、/b></p><p> CSocket::OnAccept(nErrorCode);</p><p> //主對話框處理連接信息</p><p> if(m_pDlg)</p><p> m_pDlg->ProcessPendingAccept();</p><p><b> }<
45、;/b></p><p> void CClientSocket::OnReceive(int nErrorCode) </p><p> {//通知服務器可以接受數(shù)據</p><p> CSocket::OnReceive(nErrorCode);</p><p> if(m_pDlg)</p><p&g
46、t; { //讓主對話框處理數(shù)據</p><p> m_pDlg->ProcessPendingRead(this);</p><p><b> }</b></p><p><b> }</b></p><p> void CChatServerDlg::ProcessPendin
47、gAccept()</p><p><b> {</b></p><p> //生成一個新的套節(jié)字與客戶端通訊</p><p> CClientSocket* pSocket = new CClientSocket(this);</p><p> if (m_pSocket->Accept(*pSocket
48、)) </p><p> {//將該套節(jié)字保存起來</p><p> m_connectionList.AddTail(pSocket);</p><p><b> }</b></p><p><b> else</b></p><p><b>
49、 {</b></p><p> delete pSocket;</p><p><b> }</b></p><p><b> }</b></p><p> void CChatServerDlg::UpdateClients(char *buffer, int nBufferS
50、ize) //通知所有客戶端更新消息</p><p><b> {</b></p><p> for(POSITION pos = m_connectionList.GetHeadPosition();pos != NULL;)</p><p> {//將新信息發(fā)送給每個客戶端</p><p> CClientS
51、ocket* pSocket= (CClientSocket*)m_connectionList.GetNext(pos);</p><p> if (buffer != NULL)</p><p> pSocket->Send(buffer,nBufferSize,0);</p><p><b> }</b></p>
52、<p><b> }</b></p><p> void CChatServerDlg::Onsiliao() </p><p> {//將數(shù)據發(fā)送給指定客戶</p><p> int Position=m_people_num.GetCurSel();</p><p> if(Position==
53、-1)</p><p><b> {</b></p><p> AfxMessageBox("沒有選中聯(lián)系人!",NULL,MB_OK);</p><p><b> return ;</b></p><p><b> }</b></p>
54、<p> int cnt=0;</p><p> CString name,temp;</p><p> m_people_num.GetText(Position,name); //得到選中人的姓名</p><p> for(POSITION pos = m_connectionList.GetHeadPosition();pos != NUL
55、L; ++cnt)</p><p> {//將新信息發(fā)送給指定客戶端</p><p> CClientSocket* pSocket= (CClientSocket*)m_connectionList.GetNext(pos);</p><p> m_people_num.GetText(cnt,temp);</p><p> if(
56、temp==name)</p><p><b> {</b></p><p> pSocket->Send(m_strMsg.GetBuffer(0),m_strMsg.GetLength(),0);</p><p><b> break;</b></p><p><b>
57、 }</b></p><p><b> }</b></p><p> UpdateData(1);</p><p> //將數(shù)據在列表框中顯示出來</p><p> m_ctrlMsgs.AddString(m_strMsg);</p><p> m_strMsg.Empt
58、y();////清空編輯區(qū)</p><p> UpdateData(0);</p><p><b> }</b></p><p> void CChatServerDlg::OnSave() </p><p><b> {</b></p><p> ofstream
59、 outfile;</p><p> outfile.open("ServerData.txt",ios::out|ios::app);//以追加打開文件</p><p> if(!outfile)</p><p><b> {</b></p><p> MessageBox("保存
60、失敗!",NULL,MB_OK);</p><p><b> return ;</b></p><p><b> }</b></p><p> CString str; </p><p><b> string s;</b></p><p&
61、gt;<b> int i,n;</b></p><p> for(i=0;i<m_ctrlMsgs.GetCount();i++) //遍歷ListBox</p><p><b> {</b></p><p> n=m_ctrlMsgs.GetTextLen(i);</p><p>
62、; m_ctrlMsgs.GetText(i,str.GetBuffer(n));</p><p> s=str; //把CString轉換string,否則亂碼</p><p> outfile<<s<<endl;</p><p><b> }</b></p><p> outfil
63、e.close();</p><p><b> }</b></p><p> void CChatServerDlg::OnRead() </p><p><b> {</b></p><p> ifstream infile("ServerData.txt"); //讀
64、取文件</p><p> if(!infile)</p><p><b> {</b></p><p> MessageBox("親,木有聊天記錄哦!",NULL,MB_OK);</p><p><b> return ;</b></p><p>
65、<b> }</b></p><p> char s[1005];</p><p> CString temp;</p><p> while(infile.getline(s,1000,'\n'))</p><p><b> {</b></p><p&
66、gt; string str(s);</p><p> temp.Format("%s",str.c_str());</p><p> ((CChatServerDlg</p><p> *)(AfxGetApp()->m_pMainWnd))->m_ctrlMsgs.AddString(temp); </p>
67、<p> ((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ctrlMsgs.SetTopIndex(0);</p><p><b> }</b></p><p> infile.close();</p><p><b> }</b></p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- mfc聊天軟件課程設計---網絡聊天程序設計
- mfc課程設計報告---聊天室程序設計
- 網絡編程課程設計-簡單的聊天室程序設計
- 網絡編程課程設計-簡單的聊天室程序設計
- 軟件課程設計---簡易網絡聊天系統(tǒng)
- vc++課程設計--聊天室程序設計
- vc++網絡聊天軟件課程設計
- 軟件課程設計---局域網聊天程序
- java課程設計-聊天程序
- java課程設計--簡單的網絡聊天程序
- 軟件課程設計報告--局域網聊天程序
- 聊天室課程設計---聊天程序的設計和實現(xiàn)
- java課程設計聊天小程序
- tcpip網絡聊天課程設計
- 軟件課程設計報告---簡易網絡聊天室
- java課程設計報告--聊天小程序
- mfc程序設計課程設計---考勤系統(tǒng)
- 課程設計一個簡單的網絡聊天程序
- java網絡聊天室課程設計
- 網絡編程課程設計---網絡聊天室
評論
0/150
提交評論