

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p><b> 軟件課程設計報告</b></p><p> 電信 學院 09 級 電子 專業(yè)</p><p> 題目 簡易網(wǎng)絡聊天室 </p><p> 學生 學號 </p><p> 指導教師
2、 </p><p> 2012年4月26日 </p><p><b> 簡易網(wǎng)絡聊天系統(tǒng)</b></p><p> 摘要:本設計在VC++6.0平臺下利用MFC對話框工程實現(xiàn)了簡易聊天室的設計,完成了簡易聊天的各項基本功能,界面友好。要求能網(wǎng)絡偵聽,接受多個客戶端的連接,一個聊天服務器和很多客戶端進
3、行通信,接受客戶端發(fā)送的信息,能分析信息的含義并在服務器停止服務時,停止端口偵聽,將停止服務器信息發(fā)給所有客戶端。在實際編程中運用了C++語言,并通過學習socket編程實現(xiàn)了局域網(wǎng)內(nèi)各節(jié)點通信。</p><p> 關(guān)鍵字:MFC 聊天室 VC++編程 CSocket類</p><p><b> 引言</b></p><p> 當今
4、世界正處于信息時代,在互聯(lián)網(wǎng)相當普及的今天,大眾已經(jīng)對互聯(lián)網(wǎng)形成了相當?shù)囊蕾囆?,局域網(wǎng)內(nèi)多節(jié)點通信已經(jīng)是非常普遍的簡單需求。聊天室是適合于陌生人之間進行較為主觀、感興化的討論。所以有大部分的人會進入聊天室聊天,它會給人一個完全自由的聊天世界。</p><p> 基于SOCKET的局域網(wǎng)通信是一種靈活的、易于實現(xiàn)的、低成本的方法。它可以運行在各種使用TCP/IP協(xié)議作為通訊協(xié)議的網(wǎng)絡上。而在SOCKET API的
5、幫助下,開發(fā)基于SOCKET的局域網(wǎng)通信軟件也是易于實現(xiàn)的。</p><p><b> 設計依據(jù)及框圖</b></p><p><b> 2.1 設計平臺</b></p><p> 本設計主要在VC++6.0平臺下,基于MFC的界面編程主要是面向?qū)ο蟮姆椒▉碚{(diào)用Windows API, 提供了文檔框架視圖結(jié)構(gòu)和活動文
6、檔這樣的便于自定義的應用程序框架。同時,在Visual C++內(nèi)部也內(nèi)建了很多對MFC的例如類向?qū)н@樣的支持以減少軟件開發(fā)的時間 。</p><p><b> 2.2 設計思想</b></p><p> 本設計的總體思想是在基于MFC的界面編程基礎上加入windows socket類實現(xiàn)局域網(wǎng)通信。本設計主要分為服務器端和客戶端兩部分組成。服務器端監(jiān)聽各個客戶端節(jié)
7、點發(fā)送的信息并把信息發(fā)送到相應的客戶端。客戶端實現(xiàn)發(fā)送和接受自己節(jié)點的信息。</p><p><b> 2.3 設計框圖</b></p><p><b> 圖1:連接過程流程</b></p><p> 圖一是總體的連接過程流圖,服務器端創(chuàng)建socket對象后啟動監(jiān)聽,等待客戶端與服務器連接,客戶端發(fā)送連接請求后與服務
8、器連接,然后與服務器直接通信。關(guān)閉時服務器關(guān)閉當前通信,結(jié)束監(jiān)聽服務。</p><p> 各模塊功能及主要模塊的流程圖</p><p> 3.1 各模塊功能簡介</p><p> 本設計主要分為以下各個模塊:</p><p> 用戶登錄服務器,客戶端socket類創(chuàng)建,實現(xiàn)相應的監(jiān)聽功能。</p><p>
9、客戶端信息發(fā)送,客戶端判斷信息是否私聊信息,并把信息發(fā)送到服務器端。</p><p> 客戶端信息接受,客戶端接受到服務器發(fā)送的信息后判斷該信息為聊天信息是聊天信息還是用戶列表信息。并在相信位置正確顯示信息。</p><p> 服務器啟動監(jiān)聽,服務器創(chuàng)建socket類,實現(xiàn)監(jiān)聽功能。</p><p> 服務器接受信息后,對信息完成相應的判斷并發(fā)送到相應的客戶端
10、。</p><p><b> 3.2 主要流程圖</b></p><p> 圖2:客戶端登錄流程圖 圖3:客戶端信息發(fā)送流程圖</p><p> 圖2為客戶端登錄流程圖,用戶輸入登錄信息后,程序創(chuàng)建socket對象,與服務器連接,如果連接成功,就把新用戶昵稱發(fā)送到服務器。</p><p
11、> 圖3為客戶端信息發(fā)送流程圖,判斷信息是否是私聊信息,如果是則在發(fā)送信息前加入Privchat和私聊用戶昵稱,然后將信息發(fā)送到服務器。</p><p> 圖4為客戶端信息接受處理流程圖,接受到信息后通過前面8個字母判斷是否為用戶列表信息,如果是,則根據(jù)信息的“|”分割依次獲取用戶昵稱,并在用戶列表框中完成顯示。如果不是用戶列表信息,則按照聊天信息在信息顯示框完整顯示接受到的信息。</p>
12、<p> 圖5為服務器接受信息處理流程圖,服務器接受到信息后判斷是否為新用戶登錄,如果是,則向各個客戶端節(jié)點發(fā)送所有用戶列表。否則,判斷信息是否為私聊信息,如果是,則查找節(jié)點中昵稱和私聊對象相同的用戶,然后把信息發(fā)送到該節(jié)點。不是則判定信息為廣播信息,把信息發(fā)送到每個用戶節(jié)點。</p><p> 圖4:客戶端信息接受處理 圖5:服務器接受信息處理</p><p>
13、<b> 4 軟件調(diào)試分析</b></p><p> 設計最后運行效果如下:</p><p> 圖6:服務器界面截圖</p><p> 圖7:客戶端界面截圖</p><p> 設計主要分為服務器端和客戶端兩個界面。圖6和圖7分別展示了服務器和客戶端的界面效果。實現(xiàn)了群聊,私聊以及顯示所有用戶列表的功能。達到了簡
14、易聊天室的設計要求。</p><p><b> 5 結(jié)語</b></p><p><b> 5.1 結(jié)論與討論</b></p><p> 本設計在VC++6.0平臺下完成了簡易網(wǎng)絡聊天室,實現(xiàn)了簡易聊天室的各項設計要求,設計界面友好。在本設主要是在MFC簡易對話框工程下利用Csocket類實現(xiàn)局域網(wǎng)內(nèi)通信。MFC界面
15、編程比較簡單,本設計的主要難點是服務器和客戶端之間私聊功能實現(xiàn)和用戶列表信息與普通聊天信息的區(qū)別,個人在程序中通過把信息的前面8個字符賦予信息的區(qū)別意義,通過這幾個字符判斷信息的類型,再進行相信的處理。</p><p> 本設計完成了基本要求,但是文字字體大小和顏色設定以及聊天間表情的發(fā)送并不能實現(xiàn),通過查閱相關(guān)資料,該功能的實現(xiàn)需要重載MFC中的RichEdit類,設計難度較大,暫未實現(xiàn)。</p>
16、<p> 通過本課程設計把以前學到的書本知識運用到了實際的設計,對理論知識有了更深刻的理解??吹搅俗约旱脑O計成果,感受到了軟件設定的樂趣。</p><p><b> 參考文獻</b></p><p> 羅莉琴,詹祖橋.Windows網(wǎng)絡編程.北京:人民郵電出版社,2011</p><p> 宋斌.Visual C++6.0
17、教程.北京:北京希望電子出版社 ,1999</p><p> 鄭莉,董江舟.C++語言程序設計.北京:清華大學出版社,2010</p><p><b> 附錄</b></p><p> 本設計中主要用到的算法程序附錄如下(完整程序見電子檔工程附件)</p><p> 客戶端網(wǎng)絡鏈接程序代碼</p>
18、<p> void CChatRoomDlg::OnConnectButton() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> UpdateData(TRUE);</p>
19、<p> char *nikename,*address;</p><p><b> int n;</b></p><p> if (!myServerSocket->Create())</p><p><b> {</b></p><p> myServerSocke
20、t->Close();</p><p> AfxMessageBox("網(wǎng)絡創(chuàng)建錯誤??!");</p><p><b> return;</b></p><p><b> }</b></p><p> n=m_IDC_EDIT_ADDRESS.GetLength()
21、;</p><p> address=new char(n+1);</p><p> sprintf(address,"%s",m_IDC_EDIT_ADDRESS.GetBuffer(n));</p><p> address[n]=0;</p><p> n=m_IDC_EDIT_NIKENAME.GetLen
22、gth();</p><p> nikename=new char(n+1);</p><p> sprintf(nikename,"%s",m_IDC_EDIT_NIKENAME.GetBuffer(n));</p><p> nikename[n]=0;</p><p> if (!myServerSocket
23、->Connect(address,6767))</p><p><b> {</b></p><p> myServerSocket->Close();</p><p> AfxMessageBox("網(wǎng)絡連接錯誤,請檢查服務器地址。");</p><p><b> r
24、eturn;</b></p><p><b> }</b></p><p> m_BNSend.EnableWindow(TRUE); //"發(fā)送信息"按鈕狀態(tài)為有效</p><p> m_BNExit.EnableWindow(TRUE); //"離開聊天室"按鈕狀態(tài)為有效</p
25、><p> myServerSocket->NikeName=nikename;</p><p> //************發(fā)送新用戶昵稱 </p><p> char message2[20];</p><p> strcpy(message2,"NEW_USER:");</p><p&
26、gt; strcat(message2,myServerSocket->NikeName);</p><p> if (myServerSocket->Send(message2,20))</p><p><b> {</b></p><p><b> }</b></p><p&
27、gt;<b> else</b></p><p><b> {</b></p><p> AfxMessageBox("網(wǎng)絡傳輸錯誤!!!");</p><p><b> }</b></p><p><b> }</b><
28、;/p><p><b> 客戶端信息發(fā)送程序</b></p><p> void CChatRoomDlg::OnButton1() //發(fā)送按鈕的函數(shù)</p><p><b> {</b></p><p> // TODO: Add your control notification hand
29、ler code here</p><p><b> int n;</b></p><p> char message[1000];</p><p> CString to_name;</p><p> UpdateData(TRUE);</p><p> if(m_SL==TRUE)
30、//私聊</p><p><b> {</b></p><p> if(m_USER.GetCurSel()>=0)</p><p><b> {</b></p><p> m_USER.GetText(m_USER.GetCurSel(),to_name);</p>&
31、lt;p> m_IDC_EDIT_MESSAGE=myServerSocket->NikeName+"悄悄對"+to_name+"說:\r\n"+m_IDC_EDIT_MESSAGE;</p><p> m_IDC_LIST_CHATBOX_CONTROL.AddString(m_IDC_EDIT_MESSAGE);</p><p>
32、 m_IDC_EDIT_MESSAGE="PrivChat|"+to_name+"|"+m_IDC_EDIT_MESSAGE;</p><p> n=m_IDC_EDIT_MESSAGE.GetLength();</p><p> sprintf(message,"%s",m_IDC_EDIT_MESSAGE.GetBuff
33、er(n));</p><p> message[n]=0; </p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> AfxMessageBox("
34、;沒有選擇私聊對象!");</p><p><b> return ;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p>
35、;<b> {</b></p><p> m_IDC_EDIT_MESSAGE=myServerSocket->NikeName+"對大家說:\r\n "+m_IDC_EDIT_MESSAGE;</p><p> n=m_IDC_EDIT_MESSAGE.GetLength();</p><p> sprint
36、f(message,"%s",m_IDC_EDIT_MESSAGE.GetBuffer(n));</p><p> message[n]=0;</p><p><b> }</b></p><p> if (myServerSocket->Send(message,n+1))</p><p&g
37、t;<b> {</b></p><p> m_IDC_EDIT_MESSAGE="";</p><p> UpdateData(FALSE);</p><p><b> }</b></p><p><b> else</b></p>
38、<p><b> {</b></p><p> AfxMessageBox("網(wǎng)絡傳輸錯誤!");</p><p><b> }</b></p><p><b> }</b></p><p> 3、客戶端信息接受程序</p>
39、<p> BOOL CChatRoomDlg::GetMessage()//顯示聊天信息</p><p><b> {</b></p><p> char buff[2000];</p><p> char name[20];</p><p> int count;</p><
40、p> count=myServerSocket->Receive(buff,2000); </p><p> buff[count]=0;</p><p> char Flag[10];</p><p> for(int i=0;i<8;i++) Flag[i]=buff[i];</p><p> Flag[
41、8]=0; </p><p> if(strcmp(Flag,"USERLIST")==0)//新用戶昵稱列表</p><p><b> {</b></p><p> m_USER.ResetContent();</p><p> CString sTemp;</p>&l
42、t;p><b> int j=8;</b></p><p> for(i=8;buff[i]!=0;i++)</p><p><b> { </b></p><p> if(buff[i]=='|')//昵稱分割符號</p><p><b> {&
43、lt;/b></p><p> for(int m=0;j<i;j++,m++)</p><p> name[m]=buff[j];</p><p> name[m]='\0';</p><p> sTemp.Format("%s",name);//昵稱</p><p
44、> m_USER.AddString(sTemp);</p><p><b> j=i+1;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>&
45、lt;p> else //聊天信息</p><p><b> {</b></p><p> m_IDC_LIST_CHATBOX_CONTROL.AddString(buff);</p><p><b> }</b></p><p> return true;</p>
46、<p><b> }</b></p><p> 服務器端信息處理程序</p><p> void CClientSocket::OnReceive(int nErrorCode) </p><p><b> {</b></p><p> // TODO: Add your sp
47、ecialized code here and/or call the base class</p><p> char buff[1000];</p><p> char all_user[2000];</p><p> char name[20];</p><p><b> int n,m; </b><
48、/p><p> n=this->Receive(buff,1000);</p><p> buff[n]=0;</p><p> char Flag[10];</p><p> for(int i=0;i<8;i++) Flag[i]=buff[i];</p><p> Flag[8]=0;</
49、p><p> //下面兩行代碼用來獲取對話框指針 </p><p> CChatRoomServerApp* pApp=(CChatRoomServerApp*)AfxGetApp(); </p><p> CChatRoomServerDlg * pDlg=(CChatRoomServerDlg *)pApp->m_pMainWnd; </p&g
50、t;<p> if(strcmp(Flag,"NEW_USER")==0)//新用戶加入</p><p><b> {</b></p><p> CString sTemp;</p><p> for(i=9;buff[i]!=0;i++)</p><p> buff[i-9]
51、=buff[i];</p><p> buff[i-9]=0;</p><p> sTemp.Format("%s",buff);//新用戶昵稱sTemp</p><p> pDlg->m_USER.AddString(sTemp);</p><p> //新的在線用戶昵稱名單發(fā)給所有用戶 </p
52、><p> m=pDlg->m_USER.GetCount();</p><p> strcpy(all_user,"USERLIST");</p><p> for(i=0;i<m;i++)</p><p><b> {</b></p><p> pDlg-
53、>m_USER.GetText(i,name);</p><p> strcat(all_user,name);</p><p> strcat(all_user,"|"); </p><p><b> }</b></p><p> strcat(buff,"進入聊天室&q
54、uot;);</p><p> //List->Sends(this,buff,strlen(buff)); </p><p> List->Sends(all_user,strlen(all_user)); </p><p><b> }</b></p><p><b> else<
55、;/b></p><p> if(strcmp(Flag,"CLOSEUSE")==0)//用戶退出</p><p><b> {</b></p><p> CString sTemp;</p><p> for(i=9;buff[i]!=0;i++)</p><p&
56、gt; buff[i-9]=buff[i];</p><p> buff[i-9]=0;</p><p> sTemp.Format("%s",buff);//離線用戶昵稱</p><p> m=pDlg->m_USER.GetCount();</p><p> for(i=0;i<m;i++)//查
57、找離線用戶在列表框的索引號</p><p><b> {</b></p><p> pDlg->m_USER.GetText(i,name);</p><p> if (strcmp(name,buff)==0)</p><p> pDlg->m_USER.DeleteString(i);</p
58、><p><b> }</b></p><p> //新的在線用戶昵稱名單發(fā)給所有用戶 </p><p> m=pDlg->m_USER.GetCount();</p><p> strcpy(all_user,"USERLIST");</p><p> fo
59、r(i=0;i<m;i++)</p><p><b> {</b></p><p> pDlg->m_USER.GetText(i,name);</p><p> strcat(all_user,name);</p><p> strcat(all_user,"|"); <
60、;/p><p><b> }</b></p><p> strcat(buff,"離開聊天室");</p><p> List->Sends(all_user,strlen(all_user)); </p><p> List->Del(this); </p><p
61、> //List->Sends(this,buff,strlen(buff)); </p><p><b> }</b></p><p> else //****</p><p> if(strcmp(Flag,"PrivChat")==0)//私聊</p><p><b
62、> {</b></p><p> CString sTemp;</p><p> for(i=9;buff[i]!='|';i++)</p><p> buff[i-9]=buff[i];</p><p> buff[i-9]=0;</p><p> sTemp.Forma
63、t("%s",buff);//私聊對象昵稱</p><p> for(int k=i+1;buff[k]!=0;k++)</p><p> buff[k-i-1]=buff[k];</p><p> buff[k-i-1]=0;</p><p> m=pDlg->m_USER.GetCount();</
64、p><p> for(i=0;i<m;i++)//查找離線用戶在列表框的索引號</p><p><b> {</b></p><p> pDlg->m_USER.GetText(i,name);</p><p> if (strcmp(name,sTemp)==0)</p><p>
65、;<b> {</b></p><p> List->OnlySend(buff,strlen(buff),i); </p><p><b> }</b></p><p><b> } </b></p><p><b> }</b>&l
66、t;/p><p> else//聊天信息群發(fā)給所有用戶</p><p><b> {</b></p><p> List->Sends(buff,n); </p><p><b> }</b></p><p> //Receive只能接受一次,除非下次發(fā)送觸發(fā)
67、后</p><p> CString sTemp;</p><p> sTemp.Format("收到:%s",buff);</p><p> pDlg->m_ChatList.AddString(sTemp);</p><p> pDlg->m_ChatList.SetTopIndex(pDlg-&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java網(wǎng)絡聊天室課程設計
- tcp課程設計--網(wǎng)絡聊天室
- 網(wǎng)絡編程課程設計---網(wǎng)絡聊天室
- 網(wǎng)絡編程課程設計-java聊天室
- 網(wǎng)絡編程課程設計報告--基于linux網(wǎng)絡聊天室設計
- 軟件工程課程設計--- 文本聊天室
- jsp課程設計報告--在線聊天室
- 軟件課程設計---簡易網(wǎng)絡聊天系統(tǒng)
- 《web開發(fā)》課程設計報告--聊天室
- web課程設計—— 聊天室
- 網(wǎng)絡編程課程設計報告-android_socket_聊天室
- java網(wǎng)絡聊天室畢業(yè)課程設計報告(內(nèi)附代碼)
- java課程設計--聊天室系統(tǒng)
- java課程設計---聊天室系統(tǒng)
- mfc課程設計報告---聊天室程序設計
- 聊天室課程設計---聊天程序的設計和實現(xiàn)
- java課程設計之簡單聊天室
- 計算機網(wǎng)絡課程設計--聊天室
- 網(wǎng)絡編程課程設計-簡單的聊天室程序設計
- 網(wǎng)絡編程課程設計-簡單的聊天室程序設計
評論
0/150
提交評論