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

下載本文檔

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

文檔簡介

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

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

3、來的消息分發(fā)給所有其他客戶端,為了解決這個問題,在服務(wù)器程序中建立一個套接口鏈表,用來保存所有與客戶端建立了連接的服務(wù)端口。下面描述了多人聊天的實(shí)現(xiàn)原理:當(dāng)客戶端client n向?qū)?yīng)的服務(wù)端口n發(fā)送了消息message,服務(wù)端口n將message復(fù)制給所有套接口列表(userlist)中的套接口緩沖區(qū),然后向每個服務(wù)端口發(fā)送write消息,使每個服務(wù)端口將message發(fā)送給對應(yīng)的客戶端。這樣,所有客戶端就都獲得了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表時多人聊天程序的核心,它是一個動態(tài)變化的鏈表,為空表示沒有客戶端建立了連接,不為空時每個元素就代表有一個客戶端與服務(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ù)器端的效果截圖 用戶“xiaoq”的登錄界面 用戶“xiaoqq”的登錄界面功能描述1、 多人會話。此程序分為服務(wù)器端和客戶端,當(dāng)客戶端要進(jìn)入聊天室的時候,就必須通過網(wǎng)絡(luò)連接到服務(wù)端,以實(shí)現(xiàn)和其它客戶端的通訊功能。其中最簡單的一種通訊方式就是多人會話,運(yùn)用多線程同時對多個用戶的信息進(jìn)行監(jiān)聽,服務(wù)器通過轉(zhuǎn)發(fā)消息,讓所有人都可以得到消息,實(shí)現(xiàn)多人會話。2、 一對一會話。此程序的服務(wù)器端除了能夠提供多人會話的功能外,還提供了私人聊天功能,可以實(shí)現(xiàn)一對一的聊天。就是在消息轉(zhuǎn)發(fā)的時候,私聊的消息只發(fā)給私聊的對象,而其他人看不

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

7、ge顯示找到客戶端并顯示登陸失敗發(fā)送id和ip設(shè)計(jì)步驟:本聊天程序?qū)崿F(xiàn)工具為visual c+ 6.0 mfc,主要利用其中用于網(wǎng)絡(luò)編程的csocket類實(shí)現(xiàn)網(wǎng)絡(luò)通訊功能。主要程序分為兩部分:1、 服務(wù)器端,界面如下圖所示:主要代碼如下所示:(1)、cchatroomserverdlg函數(shù)用來對服務(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;/開始服務(wù)器按鈕void cchatroomserverdlg:onbuttonstart() m_idc_button_start.enablewindow(false);/讓開啟按鈕失效 if (!listensocket.create(6767)/綁定端口 afxmessagebox("綁定端口失敗!");if (!listensocket.listen()/服務(wù)器偵聽afxmessagebox("偵聽失敗!");afxmessagebox("服務(wù)器開啟成功!");cs

10、tring ttmep;ttmep="系統(tǒng)消息:服務(wù)器已開啟成功!"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ù)器在線用戶列表m_idc_button_start.enablewindow(true);void cchatroomserverdlg:onbuttonsend() int n;char message1000;updatedata(true);if (m_idc_button_message="")

12、messagebox("請輸入消息!","提示",mb_ok);elsem_idc_button_message="服務(wù)器端說:"+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ù)用于管理用戶列表及會話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);/離線用戶昵稱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);/將新的在線用戶昵稱名單發(fā)給所有用戶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,"離開聊天室!");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ā)給所有用戶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è)定用戶的多人會話與一對一會話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;/向所有用戶發(fā)送消息bool cclientsocketlist:sends(char *buff,int n)cclientsocket *curr=head;while (curr)curr->send(buff,n);curr=curr->next;return true;/僅僅向私聊用戶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、 客戶端,截圖如下所示:主要代碼: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)建錯誤!");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ò)連接錯誤,請檢查服務(wù)器地址。"); return; m_bnsend.enablewindow(true);m_bnexit.enablewindow(true);myserversocket->nikename=nikename;/發(fā)送新用戶昵稱char message220;strcpy(message2,"new_user|");strcat(message2,m

25、yserversocket->nikename);if (myserversocket->send(message2,20)/連接聊天室服務(wù)器afxmessagebox("連接成功!");elseafxmessagebox("網(wǎng)絡(luò)傳輸錯誤!");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("請輸入要發(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+"悄悄對"+to_name+"說:"+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("沒有私聊對象!");return;elsem_idc_edit_message=myserversocket->

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

評論

0/150

提交評論