聊天程序設(shè)計(jì)報(bào)告計(jì)算機(jī)網(wǎng)絡(luò)_第1頁(yè)
聊天程序設(shè)計(jì)報(bào)告計(jì)算機(jī)網(wǎng)絡(luò)_第2頁(yè)
聊天程序設(shè)計(jì)報(bào)告計(jì)算機(jī)網(wǎng)絡(luò)_第3頁(yè)
聊天程序設(shè)計(jì)報(bào)告計(jì)算機(jī)網(wǎng)絡(luò)_第4頁(yè)
聊天程序設(shè)計(jì)報(bào)告計(jì)算機(jī)網(wǎng)絡(luò)_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、目 錄 【1】 設(shè)計(jì)原理1【2】 功能描述4【3】 設(shè)計(jì)步驟6【4】 使用方法說(shuō)明17【5】 實(shí)驗(yàn)結(jié)果及分析20設(shè)計(jì)原理計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)發(fā)展至今已經(jīng)大大超越了人們當(dāng)初的預(yù)想,無(wú)論是人們?nèi)粘5墓ぷ鬟€是學(xué)習(xí),我們都越來(lái)越多的依靠到互聯(lián)網(wǎng)。各種實(shí)時(shí)性的聊天娛樂(lè)軟件也同時(shí)誕生,而且為我們的即時(shí)通訊帶來(lái)了眾多的方便,比如說(shuō)大家所熟知的騰訊qq、微軟的msn、移動(dòng)的fetion等,都是做的比較成功的實(shí)時(shí)聊天工具。隨著網(wǎng)絡(luò)的日益普及,各種聊天工具也層出不窮,但當(dāng)我們學(xué)習(xí)了tcp/ip協(xié)議與網(wǎng)絡(luò)編程這門(mén)課程之后,我們便會(huì)覺(jué)得,其實(shí)要實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)絡(luò)通訊其實(shí)并不難。接下來(lái)的課程設(shè)計(jì)就是針對(duì)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)聊天程序,利

2、用mfc為開(kāi)發(fā)工具,實(shí)現(xiàn)基本的通訊功能。此程序主要分為兩部分:服務(wù)器端和客戶(hù)端。服務(wù)器端用于提供一個(gè)網(wǎng)絡(luò)端口,等待客戶(hù)端發(fā)出請(qǐng)求,登錄到此服務(wù)端,然后進(jìn)行網(wǎng)絡(luò)通訊和消息的轉(zhuǎn)發(fā);客戶(hù)端可通過(guò)服務(wù)器端的ip地址發(fā)送連接請(qǐng)求,然后登陸聊天室。在服務(wù)器端的成員列表欄中會(huì)顯示在線(xiàn)的所有人名單,有人退出聊天室,成員列表會(huì)自動(dòng)除名。服務(wù)器端同時(shí)也提供了成員之間的私聊功能,此時(shí)服務(wù)器端作為一個(gè)轉(zhuǎn)發(fā)站,進(jìn)行消息的轉(zhuǎn)發(fā)。整個(gè)程序的主體使用了csocket類(lèi)的方法,實(shí)現(xiàn)了網(wǎng)絡(luò)通訊聊天。整個(gè)程序設(shè)計(jì)為兩個(gè)部分:服務(wù)器 (chatroomserver)和客戶(hù)端 (chatroom)多人聊天的關(guān)鍵在于要將每個(gè)客戶(hù)端發(fā)送過(guò)

3、來(lái)的消息分發(fā)給所有其他客戶(hù)端,為了解決這個(gè)問(wèn)題,在服務(wù)器程序中建立一個(gè)套接口鏈表,用來(lái)保存所有與客戶(hù)端建立了連接的服務(wù)端口。下面描述了多人聊天的實(shí)現(xiàn)原理:當(dāng)客戶(hù)端client n向?qū)?yīng)的服務(wù)端口n發(fā)送了消息message,服務(wù)端口n將message復(fù)制給所有套接口列表(userlist)中的套接口緩沖區(qū),然后向每個(gè)服務(wù)端口發(fā)送write消息,使每個(gè)服務(wù)端口將message發(fā)送給對(duì)應(yīng)的客戶(hù)端。這樣,所有客戶(hù)端就都獲得了message消息,實(shí)現(xiàn)了多人聊天功能。bool cclientsocketlist:sends(char *buff,int n)cclientsocket *curr=head

4、;while (curr)curr->send(buff,n);curr=curr->next;return true;userlist表時(shí)多人聊天程序的核心,它是一個(gè)動(dòng)態(tài)變化的鏈表,為空表示沒(méi)有客戶(hù)端建立了連接,不為空時(shí)每個(gè)元素就代表有一個(gè)客戶(hù)端與服務(wù)器建立了連接。以下程序是私聊功能的實(shí)現(xiàn):bool cclientsocketlist:onlysend(char *buff,int n,int who)cclientsocket *curr=head;while (curr && who>0)curr=curr->next;who-;curr->

5、send(buff,n);return true;以下是此程序的效果截圖: 服務(wù)器端的效果截圖 用戶(hù)“xiaoq”的登錄界面 用戶(hù)“xiaoqq”的登錄界面功能描述1、 多人會(huì)話(huà)。此程序分為服務(wù)器端和客戶(hù)端,當(dāng)客戶(hù)端要進(jìn)入聊天室的時(shí)候,就必須通過(guò)網(wǎng)絡(luò)連接到服務(wù)端,以實(shí)現(xiàn)和其它客戶(hù)端的通訊功能。其中最簡(jiǎn)單的一種通訊方式就是多人會(huì)話(huà),運(yùn)用多線(xiàn)程同時(shí)對(duì)多個(gè)用戶(hù)的信息進(jìn)行監(jiān)聽(tīng),服務(wù)器通過(guò)轉(zhuǎn)發(fā)消息,讓所有人都可以得到消息,實(shí)現(xiàn)多人會(huì)話(huà)。2、 一對(duì)一會(huì)話(huà)。此程序的服務(wù)器端除了能夠提供多人會(huì)話(huà)的功能外,還提供了私人聊天功能,可以實(shí)現(xiàn)一對(duì)一的聊天。就是在消息轉(zhuǎn)發(fā)的時(shí)候,私聊的消息只發(fā)給私聊的對(duì)象,而其他人看不

6、到此消息,但是此消息會(huì)通過(guò)服務(wù)器端轉(zhuǎn)發(fā),然后再到達(dá)目的客戶(hù)端。3、 個(gè)性化的昵稱(chēng)。為了區(qū)別用戶(hù),此程序還允許用戶(hù)可以自定義個(gè)性化的昵稱(chēng)。在用戶(hù)登錄的時(shí)候,用戶(hù)可以為自己設(shè)定一個(gè)昵稱(chēng),以便在多人會(huì)話(huà)的時(shí)候作為身份識(shí)別。同時(shí)服務(wù)器端也會(huì)以此昵稱(chēng)作為客戶(hù)端的登錄身份,服務(wù)器管理員,同樣也顯示在其他用戶(hù)的在線(xiàn)列表欄中。4、服務(wù)器登陸。服務(wù)器端開(kāi)啟之后處于監(jiān)聽(tīng)狀態(tài),多線(xiàn)程工作,接受每一個(gè)用戶(hù)的連接請(qǐng)求。而客戶(hù)端只需輸入服務(wù)器端的ip地址即可,端口在服務(wù)器端自動(dòng)生成。啟動(dòng)登陸等待客戶(hù)端登陸客戶(hù)端用戶(hù)創(chuàng)建子套接字messagechatserverchatclientmessage登陸成功連接上發(fā)送messa

7、ge顯示找到客戶(hù)端并顯示登陸失敗發(fā)送id和ip設(shè)計(jì)步驟:本聊天程序?qū)崿F(xiàn)工具為visual c+ 6.0 mfc,主要利用其中用于網(wǎng)絡(luò)編程的csocket類(lèi)實(shí)現(xiàn)網(wǎng)絡(luò)通訊功能。主要程序分為兩部分:1、 服務(wù)器端,界面如下圖所示:主要代碼如下所示:(1)、cchatroomserverdlg函數(shù)用來(lái)對(duì)服務(wù)器端進(jìn)行初始化void cchatroomserverdlg:onpaint() if (isiconic()cpaintdc dc(this); / device context for paintingsendmessage(wm_iconerasebkgnd, (wparam) dc.gets

8、afehdc(), 0);int cxicon = getsystemmetrics(sm_cxicon);int cyicon = getsystemmetrics(sm_cyicon);crect rect;getclientrect(&rect);int x = (rect.width() - cxicon + 1) / 2;int y = (rect.height() - cyicon + 1) / 2;dc.drawicon(x, y, m_hicon);elsecdialog:onpaint();hcursor cchatroomserverdlg:onquerydragi

9、con()return (hcursor) m_hicon;/開(kāi)始服務(wù)器按鈕void cchatroomserverdlg:onbuttonstart() m_idc_button_start.enablewindow(false);/讓開(kāi)啟按鈕失效 if (!listensocket.create(6767)/綁定端口 afxmessagebox("綁定端口失??!");if (!listensocket.listen()/服務(wù)器偵聽(tīng)afxmessagebox("偵聽(tīng)失?。?quot;);afxmessagebox("服務(wù)器開(kāi)啟成功!");cs

10、tring ttmep;ttmep="系統(tǒng)消息:服務(wù)器已開(kāi)啟成功!"m_chatlist.addstring(ttmep);m_idc_button_stop.enablewindow(true);/恢復(fù)停止按鈕void cchatroomserverdlg:onbuttonstop() m_idc_button_stop.enablewindow(false);char s30="聊天服務(wù)器停止工作了!"listensocket.ccsl.sends(s,30);/廣播聊天服務(wù)器停止消息cclientsocket *p=listensocket.ccs

11、l.head;while (p)p->close();listensocket.ccsl.del(p);/釋放鏈表中的套接字p=listensocket.ccsl.head;listensocket.close();m_user.resetcontent();/清楚服務(wù)器在線(xiàn)用戶(hù)列表m_idc_button_start.enablewindow(true);void cchatroomserverdlg:onbuttonsend() int n;char message1000;updatedata(true);if (m_idc_button_message="")

12、messagebox("請(qǐng)輸入消息!","提示",mb_ok);elsem_idc_button_message="服務(wù)器端說(shuō):"+m_idc_button_message;n=m_idc_button_message.getlength();sprintf(message,"%s",m_idc_button_message.getbuffer(n);messagen=0;listensocket.ccsl.sends(message,1000);m_idc_button_message=""u

13、pdatedata(false);(2)、cclientsocket函數(shù)用于管理用戶(hù)列表及會(huì)話(huà)void cclientsocket:onreceive(int nerrorcode)char buff1000;char all_user2000;char name20;int n;int m;n=this->receive(buff,1000);buffn=0;char flag10;for (int i=0;i<8;i+)flagi=buffi;flag8=0;cchatroomserverapp *papp=(cchatroomserverapp*)afxgetapp();cc

14、hatroomserverdlg *pdlg=(cchatroomserverdlg*)papp->m_pmainwnd;if (strcmp(flag,"new_user")=0)cstring stemp;for (i=9;buffi!=0;i+)buffi-9=buffi;buffi-9=0;stemp.format("%s",buff);pdlg->m_user.addstring(stemp);m=pdlg->m_user.getcount();strcpy(all_user,"userlist");for

15、 (i=0;i<m;i+)pdlg->m_user.gettext(i,name);strcat(all_user,name);strcat(all_user,"|");strcat(buff,"進(jìn)入聊天室");list->sends(all_user,strlen(all_user);elseif (strcmp(flag,"closeuse")=0)cstring stemp;for (i=9;buffi!=0;i+)buffi-9=buffi;buffi-9=0;stemp.format("%s&qu

16、ot;,buff);/離線(xiàn)用戶(hù)昵稱(chēng)m=pdlg->m_user.getcount();for (i=0;i<m;i+)pdlg->m_user.gettext(i,name);if (strcmp(name,buff)=0)pdlg->m_user.deletestring(i);/將新的在線(xiàn)用戶(hù)昵稱(chēng)名單發(fā)給所有用戶(hù)m=pdlg->m_user.getcount();strcpy(all_user,"userlist");for (i=0;i<m;i+)pdlg->m_user.gettext(i,name);strcat(all_

17、user,name);strcat(all_user,"|");strcat(buff,"離開(kāi)聊天室!");list->sends(all_user,strlen(all_user);list->del(this);else if (strcmp(flag,"privchat")=0)/私聊cstring stemp;for (i=9;buffi!='|'i+)buffi-9=buffi;buffi-9=0;stemp.format("%s",buff);for (int k=i+1;b

18、uffk!=0;k+)buffk-i-1=buffk;buffk-i-1=0;m=pdlg->m_user.getcount();for (i=0;i<m;i+)pdlg->m_user.gettext(i,name);if (strcmp(name,stemp)=0)list->onlysend(buff,strlen(buff),i);elselist->sends(buff,n);/將聊天信息群發(fā)給所有用戶(hù)cstring stemp;stemp.format("收到:%s",buff);pdlg->m_chatlist.addstr

19、ing(stemp);pdlg->m_chatlist.settopindex(pdlg->m_chatlist.getcount()-1);csocket:onreceive(nerrorcode);(3)、一下代碼用于設(shè)定用戶(hù)的多人會(huì)話(huà)與一對(duì)一會(huì)話(huà)bool cclientsocketlist:add(cclientsocket *add)cclientsocket *tmp=head;if (!head)head=add;return false;while (tmp->next)tmp=tmp->next;tmp->next=add;return true;

20、/從鏈表隊(duì)列中刪除socketbool cclientsocketlist:del(cclientsocket *d)cclientsocket *p1=head;cclientsocket *p2;if (!head)return false;if (head=d)head=p1->next;p1->close();delete p1;return true;for (;p1->next!=null;p1=p1->next)if (p1->next=d)p2=p1->next;p1->next=p2->next;p2->close();d

21、elete p2;return true;return false;/向所有用戶(hù)發(fā)送消息bool cclientsocketlist:sends(char *buff,int n)cclientsocket *curr=head;while (curr)curr->send(buff,n);curr=curr->next;return true;/僅僅向私聊用戶(hù)who發(fā)送信息bool cclientsocketlist:onlysend(char *buff,int n,int who)cclientsocket *curr=head;while (curr &&

22、who>0)curr=curr->next;who-;curr->send(buff,n);return true;1、 客戶(hù)端,截圖如下所示:主要代碼:void cchatroomdlg:onconnectbutton() /連接聊天室服務(wù)器/ todo: add your control notification handler code hereupdatedata(true);char *nikename;char *address;int n;if (!myserversocket->create()myserversocket->close();afx

23、messagebox("網(wǎng)絡(luò)創(chuàng)建錯(cuò)誤!");return;n=m_idc_edit_address.getlength();address=new char(n+1);sprintf(address,"%s",m_idc_edit_address.getbuffer(n);addressn=0;n=m_idc_edit_nikename.getlength();nikename=new char(n+1);sprintf(nikename,"%s",m_idc_edit_nikename.getbuffer(n);nikenamen=

24、0;if (!myserversocket->connect(address,6767)myserversocket->close();afxmessagebox("網(wǎng)絡(luò)連接錯(cuò)誤,請(qǐng)檢查服務(wù)器地址。"); return; m_bnsend.enablewindow(true);m_bnexit.enablewindow(true);myserversocket->nikename=nikename;/發(fā)送新用戶(hù)昵稱(chēng)char message220;strcpy(message2,"new_user|");strcat(message2,m

25、yserversocket->nikename);if (myserversocket->send(message2,20)/連接聊天室服務(wù)器afxmessagebox("連接成功!");elseafxmessagebox("網(wǎng)絡(luò)傳輸錯(cuò)誤!");void cchatroomdlg:onsendbutton() / todo: add your control notification handler code hereint n;char message1000;cstring to_name;updatedata(true);if (m_i

26、dc_edit_message="")messagebox("請(qǐng)輸入要發(fā)送的消息!","提示",mb_ok);elseif (m_sl=true)/私聊if (m_user.getcursel()>=0)m_user.gettext(m_user.getcursel(),to_name);m_idc_edit_message=myserversocket->nikename+"悄悄對(duì)"+to_name+"說(shuō):"+m_idc_edit_message;m_chatlist.addstr

27、ing(m_idc_edit_message);m_idc_edit_message="privchat|"+to_name+"|"+m_idc_edit_message;n=m_idc_edit_message.getlength();sprintf(message,"%s",m_idc_edit_message.getbuffer(n);messagen=0;elseafxmessagebox("沒(méi)有私聊對(duì)象!");return;elsem_idc_edit_message=myserversocket->

28、;nikename+"對(duì)大家說(shuō):"+m_idc_edit_message;n=m_idc_edit_message.getlength();sprintf(message,"%s",m_idc_edit_message.getbuffer(n);messagen=0;if (myserversocket->send(message,n+1)m_idc_edit_message=""updatedata(false);elseafxmessagebox("網(wǎng)絡(luò)傳輸錯(cuò)誤!");void cchatroomdlg:

29、onexitbutton() / todo: add your control notification handler code herechar message220;strcpy(message2,"closeuse|");strcat(message2,myserversocket->nikename);if (myserversocket->send(message2,20)/離開(kāi)聊天室elseafxmessagebox("網(wǎng)絡(luò)傳輸錯(cuò)誤!");cdialog:onok();bool cchatroomdlg:getmessage()/顯示聊天信息char buff2000;char name20;int count;count=myserversocket->receive(buff,2000);buffcount=0;char flag10;for (int i=0;i<8;i+)flagi=buffi;flag8=0; if (strcmp(flag,"userlist")=0)/新

溫馨提示

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

評(píng)論

0/150

提交評(píng)論