2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論