版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 軟件課程設(shè)計(jì)報(bào)告</b></p><p> 電信 學(xué)院 09 級(jí) 電子 專業(yè)</p><p> 題目 簡(jiǎn)易網(wǎng)絡(luò)聊天室 </p><p> 學(xué)生 學(xué)號(hào) </p><p> 指導(dǎo)教師
2、 </p><p> 2012年4月26日 </p><p><b> 簡(jiǎn)易網(wǎng)絡(luò)聊天系統(tǒng)</b></p><p> 摘要:本設(shè)計(jì)在VC++6.0平臺(tái)下利用MFC對(duì)話框工程實(shí)現(xiàn)了簡(jiǎn)易聊天室的設(shè)計(jì),完成了簡(jiǎn)易聊天的各項(xiàng)基本功能,界面友好。要求能網(wǎng)絡(luò)偵聽,接受多個(gè)客戶端的連接,一個(gè)聊天服務(wù)器和很多客戶端進(jìn)
3、行通信,接受客戶端發(fā)送的信息,能分析信息的含義并在服務(wù)器停止服務(wù)時(shí),停止端口偵聽,將停止服務(wù)器信息發(fā)給所有客戶端。在實(shí)際編程中運(yùn)用了C++語言,并通過學(xué)習(xí)socket編程實(shí)現(xiàn)了局域網(wǎng)內(nèi)各節(jié)點(diǎn)通信。</p><p> 關(guān)鍵字:MFC 聊天室 VC++編程 CSocket類</p><p><b> 引言</b></p><p> 當(dāng)今
4、世界正處于信息時(shí)代,在互聯(lián)網(wǎng)相當(dāng)普及的今天,大眾已經(jīng)對(duì)互聯(lián)網(wǎng)形成了相當(dāng)?shù)囊蕾囆裕钟蚓W(wǎng)內(nèi)多節(jié)點(diǎn)通信已經(jīng)是非常普遍的簡(jiǎn)單需求。聊天室是適合于陌生人之間進(jìn)行較為主觀、感興化的討論。所以有大部分的人會(huì)進(jìn)入聊天室聊天,它會(huì)給人一個(gè)完全自由的聊天世界。</p><p> 基于SOCKET的局域網(wǎng)通信是一種靈活的、易于實(shí)現(xiàn)的、低成本的方法。它可以運(yùn)行在各種使用TCP/IP協(xié)議作為通訊協(xié)議的網(wǎng)絡(luò)上。而在SOCKET API的
5、幫助下,開發(fā)基于SOCKET的局域網(wǎng)通信軟件也是易于實(shí)現(xiàn)的。</p><p><b> 設(shè)計(jì)依據(jù)及框圖</b></p><p><b> 2.1 設(shè)計(jì)平臺(tái)</b></p><p> 本設(shè)計(jì)主要在VC++6.0平臺(tái)下,基于MFC的界面編程主要是面向?qū)ο蟮姆椒▉碚{(diào)用Windows API, 提供了文檔框架視圖結(jié)構(gòu)和活動(dòng)文
6、檔這樣的便于自定義的應(yīng)用程序框架。同時(shí),在Visual C++內(nèi)部也內(nèi)建了很多對(duì)MFC的例如類向?qū)н@樣的支持以減少軟件開發(fā)的時(shí)間 。</p><p><b> 2.2 設(shè)計(jì)思想</b></p><p> 本設(shè)計(jì)的總體思想是在基于MFC的界面編程基礎(chǔ)上加入windows socket類實(shí)現(xiàn)局域網(wǎng)通信。本設(shè)計(jì)主要分為服務(wù)器端和客戶端兩部分組成。服務(wù)器端監(jiān)聽各個(gè)客戶端節(jié)
7、點(diǎn)發(fā)送的信息并把信息發(fā)送到相應(yīng)的客戶端??蛻舳藢?shí)現(xiàn)發(fā)送和接受自己節(jié)點(diǎn)的信息。</p><p><b> 2.3 設(shè)計(jì)框圖</b></p><p><b> 圖1:連接過程流程</b></p><p> 圖一是總體的連接過程流圖,服務(wù)器端創(chuàng)建socket對(duì)象后啟動(dòng)監(jiān)聽,等待客戶端與服務(wù)器連接,客戶端發(fā)送連接請(qǐng)求后與服務(wù)
8、器連接,然后與服務(wù)器直接通信。關(guān)閉時(shí)服務(wù)器關(guān)閉當(dāng)前通信,結(jié)束監(jiān)聽服務(wù)。</p><p> 各模塊功能及主要模塊的流程圖</p><p> 3.1 各模塊功能簡(jiǎn)介</p><p> 本設(shè)計(jì)主要分為以下各個(gè)模塊:</p><p> 用戶登錄服務(wù)器,客戶端socket類創(chuàng)建,實(shí)現(xiàn)相應(yīng)的監(jiān)聽功能。</p><p>
9、客戶端信息發(fā)送,客戶端判斷信息是否私聊信息,并把信息發(fā)送到服務(wù)器端。</p><p> 客戶端信息接受,客戶端接受到服務(wù)器發(fā)送的信息后判斷該信息為聊天信息是聊天信息還是用戶列表信息。并在相信位置正確顯示信息。</p><p> 服務(wù)器啟動(dòng)監(jiān)聽,服務(wù)器創(chuàng)建socket類,實(shí)現(xiàn)監(jiān)聽功能。</p><p> 服務(wù)器接受信息后,對(duì)信息完成相應(yīng)的判斷并發(fā)送到相應(yīng)的客戶端
10、。</p><p><b> 3.2 主要流程圖</b></p><p> 圖2:客戶端登錄流程圖 圖3:客戶端信息發(fā)送流程圖</p><p> 圖2為客戶端登錄流程圖,用戶輸入登錄信息后,程序創(chuàng)建socket對(duì)象,與服務(wù)器連接,如果連接成功,就把新用戶昵稱發(fā)送到服務(wù)器。</p><p
11、> 圖3為客戶端信息發(fā)送流程圖,判斷信息是否是私聊信息,如果是則在發(fā)送信息前加入Privchat和私聊用戶昵稱,然后將信息發(fā)送到服務(wù)器。</p><p> 圖4為客戶端信息接受處理流程圖,接受到信息后通過前面8個(gè)字母判斷是否為用戶列表信息,如果是,則根據(jù)信息的“|”分割依次獲取用戶昵稱,并在用戶列表框中完成顯示。如果不是用戶列表信息,則按照聊天信息在信息顯示框完整顯示接受到的信息。</p>
12、<p> 圖5為服務(wù)器接受信息處理流程圖,服務(wù)器接受到信息后判斷是否為新用戶登錄,如果是,則向各個(gè)客戶端節(jié)點(diǎn)發(fā)送所有用戶列表。否則,判斷信息是否為私聊信息,如果是,則查找節(jié)點(diǎn)中昵稱和私聊對(duì)象相同的用戶,然后把信息發(fā)送到該節(jié)點(diǎn)。不是則判定信息為廣播信息,把信息發(fā)送到每個(gè)用戶節(jié)點(diǎn)。</p><p> 圖4:客戶端信息接受處理 圖5:服務(wù)器接受信息處理</p><p>
13、<b> 4 軟件調(diào)試分析</b></p><p> 設(shè)計(jì)最后運(yùn)行效果如下:</p><p> 圖6:服務(wù)器界面截圖</p><p> 圖7:客戶端界面截圖</p><p> 設(shè)計(jì)主要分為服務(wù)器端和客戶端兩個(gè)界面。圖6和圖7分別展示了服務(wù)器和客戶端的界面效果。實(shí)現(xiàn)了群聊,私聊以及顯示所有用戶列表的功能。達(dá)到了簡(jiǎn)
14、易聊天室的設(shè)計(jì)要求。</p><p><b> 5 結(jié)語</b></p><p><b> 5.1 結(jié)論與討論</b></p><p> 本設(shè)計(jì)在VC++6.0平臺(tái)下完成了簡(jiǎn)易網(wǎng)絡(luò)聊天室,實(shí)現(xiàn)了簡(jiǎn)易聊天室的各項(xiàng)設(shè)計(jì)要求,設(shè)計(jì)界面友好。在本設(shè)主要是在MFC簡(jiǎn)易對(duì)話框工程下利用Csocket類實(shí)現(xiàn)局域網(wǎng)內(nèi)通信。MFC界面
15、編程比較簡(jiǎn)單,本設(shè)計(jì)的主要難點(diǎn)是服務(wù)器和客戶端之間私聊功能實(shí)現(xiàn)和用戶列表信息與普通聊天信息的區(qū)別,個(gè)人在程序中通過把信息的前面8個(gè)字符賦予信息的區(qū)別意義,通過這幾個(gè)字符判斷信息的類型,再進(jìn)行相信的處理。</p><p> 本設(shè)計(jì)完成了基本要求,但是文字字體大小和顏色設(shè)定以及聊天間表情的發(fā)送并不能實(shí)現(xiàn),通過查閱相關(guān)資料,該功能的實(shí)現(xiàn)需要重載MFC中的RichEdit類,設(shè)計(jì)難度較大,暫未實(shí)現(xiàn)。</p>
16、<p> 通過本課程設(shè)計(jì)把以前學(xué)到的書本知識(shí)運(yùn)用到了實(shí)際的設(shè)計(jì),對(duì)理論知識(shí)有了更深刻的理解??吹搅俗约旱脑O(shè)計(jì)成果,感受到了軟件設(shè)定的樂趣。</p><p><b> 參考文獻(xiàn)</b></p><p> 羅莉琴,詹祖橋.Windows網(wǎng)絡(luò)編程.北京:人民郵電出版社,2011</p><p> 宋斌.Visual C++6.0
17、教程.北京:北京希望電子出版社 ,1999</p><p> 鄭莉,董江舟.C++語言程序設(shè)計(jì).北京:清華大學(xué)出版社,2010</p><p><b> 附錄</b></p><p> 本設(shè)計(jì)中主要用到的算法程序附錄如下(完整程序見電子檔工程附件)</p><p> 客戶端網(wǎng)絡(luò)鏈接程序代碼</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)絡(luò)創(chuàng)建錯(cuò)誤??!");</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)絡(luò)連接錯(cuò)誤,請(qǐng)檢查服務(wù)器地址。");</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)絡(luò)傳輸錯(cuò)誤!!!");</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+"悄悄對(duì)"+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、;沒有選擇私聊對(duì)象!");</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+"對(duì)大家說:\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)絡(luò)傳輸錯(cuò)誤!");</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]=='|')//昵稱分割符號(hào)</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> 服務(wù)器端信息處理程序</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> //下面兩行代碼用來獲取對(duì)話框指針 </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,"進(jìn)入聊天室&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、找離線用戶在列表框的索引號(hào)</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);//私聊對(duì)象昵稱</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++)//查找離線用戶在列表框的索引號(hào)</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等.壓縮文件請(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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java網(wǎng)絡(luò)聊天室課程設(shè)計(jì)
- tcp課程設(shè)計(jì)--網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)---網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-java聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告--基于linux網(wǎng)絡(luò)聊天室設(shè)計(jì)
- 軟件工程課程設(shè)計(jì)--- 文本聊天室
- jsp課程設(shè)計(jì)報(bào)告--在線聊天室
- 軟件課程設(shè)計(jì)---簡(jiǎn)易網(wǎng)絡(luò)聊天系統(tǒng)
- 《web開發(fā)》課程設(shè)計(jì)報(bào)告--聊天室
- web課程設(shè)計(jì)—— 聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告-android_socket_聊天室
- java網(wǎng)絡(luò)聊天室畢業(yè)課程設(shè)計(jì)報(bào)告(內(nèi)附代碼)
- java課程設(shè)計(jì)--聊天室系統(tǒng)
- java課程設(shè)計(jì)---聊天室系統(tǒng)
- mfc課程設(shè)計(jì)報(bào)告---聊天室程序設(shè)計(jì)
- 聊天室課程設(shè)計(jì)---聊天程序的設(shè)計(jì)和實(shí)現(xiàn)
- java課程設(shè)計(jì)之簡(jiǎn)單聊天室
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)--聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論