




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《網(wǎng)絡(luò)程序設(shè)計》 課程設(shè)計報告書題目:簡單的聊天室程序?qū)I(yè):軟件工程學(xué)號:20133519學(xué)生姓名:張雪峰指導(dǎo)教師:魏寧完成日期:2015年1月8日 目錄一. 題目及要求 題目及要求1.1題目名稱簡單的點(diǎn)對點(diǎn)聊天室系統(tǒng)1.2題目要求編寫一個簡單的聊天室程序,采用客戶/服務(wù)器模式,分為客戶端程序和服務(wù)器端程序。由于服務(wù)器只能支持一個客戶,實(shí)際上是一個點(diǎn)對點(diǎn)通信的程序??蛻舳顺绦蚝头?wù)器程序通過網(wǎng)絡(luò)交換聊天字符串內(nèi)容,并在窗口的列表框中顯示。1.3課設(shè)目的為了讓學(xué)生理解并掌握網(wǎng)絡(luò)套接字的使用學(xué)會使用MFC圖形界面編寫簡單的桌面應(yīng)用學(xué)會如何從CasyncSocket類派生出自己的WinSock類學(xué)習(xí)流式套接字對象的使用學(xué)習(xí)處理網(wǎng)絡(luò)事件的方法
系統(tǒng)概要設(shè)計2.1聊天室的設(shè)計目標(biāo)本課題是建立聊天通信模型,設(shè)計一個聊天室軟件,包括服務(wù)器端和客戶端。服務(wù)器端功能:初始化socket,創(chuàng)建服務(wù)器端。維護(hù)一個鏈表,保存所有用戶的IP地址、端口信息。接受用戶傳送來的聊天信息,然后向鏈表中的所用用戶轉(zhuǎn)發(fā)。接受用戶傳送來的連接判斷命令,并向用戶發(fā)出響應(yīng)命令。客戶端功能:客戶端界面上的兩個文本框,一個用于顯示接受的聊天信息,一個用來接受用戶輸入的聊天信息。當(dāng)按下“發(fā)送”按鈕時將信息發(fā)送給服務(wù)器。 通過本課題的課程設(shè)計,可以比較深入的了解和掌握WINSOCK控件基本屬性、方法和事件,理解網(wǎng)絡(luò)聊天通信的概念,輸控制協(xié)議(TCP)進(jìn)行數(shù)據(jù)交流,初步掌握網(wǎng)絡(luò)聊天通信程序的設(shè)計方法。并能鞏固和擴(kuò)展大學(xué)期間的學(xué)習(xí)內(nèi)容,進(jìn)行項(xiàng)目的設(shè)計開發(fā)訓(xùn)練,更好的適應(yīng)社會的需求。當(dāng)前是數(shù)字信息時代,網(wǎng)絡(luò)時代,任何一種編輯工具都不能忽視在網(wǎng)絡(luò)上的應(yīng)用,并且隨著Internet的普及和寬帶技術(shù)的成熟,越來越多的用戶進(jìn)入網(wǎng)絡(luò)世界中享用瀏覽新聞、查詢信息、發(fā)送郵件、在線觀看電影等服務(wù),享受網(wǎng)絡(luò)帶來的便利和辦公的高效,與此同時一個新型的Web應(yīng)用程序?yàn)榫W(wǎng)民之間提供了一個實(shí)時通信的功能和場所,這就是聊天室。在網(wǎng)絡(luò)早期就開始盛行,不論是BBS,IRC都有類似網(wǎng)上聊天室的機(jī)制。聊天室為網(wǎng)友提供了實(shí)時性對話的渠道,是網(wǎng)絡(luò)上極為流行的一項(xiàng)服務(wù)。聊天室適用于網(wǎng)上會議或閑聊的一些場合。聊天室為網(wǎng)友提供了較好的交友環(huán)境,網(wǎng)友之間相互以文字交談,在形式上有點(diǎn)類似筆友的性質(zhì),卻大大節(jié)省了書信往返的時間,這也是網(wǎng)上交友之所以如此熱門的原因。2.2概要設(shè)計本系統(tǒng)用到了TCP協(xié)議的點(diǎn)對點(diǎn)開發(fā)模型,主要使用CasyncSocket流式套接字進(jìn)行網(wǎng)絡(luò)事件的監(jiān)聽以及連接,具體的流程圖如下:圖2-1服務(wù)端流程圖圖2-2客戶端流程圖
系統(tǒng)詳細(xì)設(shè)計3.1詳細(xì)設(shè)計服務(wù)端主要函數(shù):voidCMySocket::OnAccept(intnErrorCode)用于處理Socket的Accept事件voidCMySocket::OnClose(intnErrorCode)用于處理Socket的Close事件voidCMySocket::OnReceive(intnErrorCode)用于處理Socket的Receive事件CTalksDlg::OnInitDialog()初始化圖形界面的變量值CTalksDlg::OnButtonListen()監(jiān)聽按鈕的事件響應(yīng)函數(shù)CTalksDlg::OnButtonClose()關(guān)閉監(jiān)聽按鈕的事件響應(yīng)函數(shù)CTalksDlg::OnSendMsg()發(fā)送按鈕的事件響應(yīng)函數(shù)客戶端主要函數(shù):voidCMySocket::OnConnect(intnErrorCode)用于處理Socket的Connect事件voidCMySocket::OnClose(intnErrorCode)用于處理Socket的Close事件voidCMySocket::OnReceive(intnErrorCode)用于處理Socket的Receive事件CTalksDlg::OnInitDialog()初始化圖形界面的變量值CTalkcDlg::OnButtonConnect()連接服務(wù)器按鈕的事件響應(yīng)函數(shù)CTalksDlg::OnButtonClose()關(guān)閉監(jiān)聽按鈕的事件響應(yīng)函數(shù)CTalksDlg::OnSendMsg()發(fā)送按鈕的事件響應(yīng)函數(shù)3.1.1CAsyncSocket類它是一個異步非阻塞Socket封裝類,CAsyncSocket::Create()有一個參數(shù)指明了你想要處理哪些Socket事件,你關(guān)心的事件被指定以后,這個Socket默認(rèn)就被用作了異步方式。CAsyncSocket的Create()函數(shù),除了創(chuàng)建了一個SOCKET以外,還創(chuàng)建了個CSocketWnd窗口對象,并使用WSAAsyncSelect()將這個SOCKET與該窗口對象關(guān)聯(lián),以讓該窗口對象處理來自Socket的事件(消息),然而CSocketWnd收到Socket事件之后,只是簡單地回調(diào)CAsyncSocket::OnReceive()等虛函數(shù)。所以CAsyncSocket的派生類,只需要在這些虛函數(shù)里添加發(fā)送和接收的代碼。構(gòu)造一個CAsyncSocket對象并使用該對象創(chuàng)建基礎(chǔ)SOCKET句柄。套接字的創(chuàng)建遵循兩階段構(gòu)造的MFC模式。例如:CAsyncSocketsock;sock.Create();對于服務(wù)器套接字,必須指定端口。對于客戶端套接字,通常接受此參數(shù)的默認(rèn)值,該值允許WindowsSockets選擇端口。套接字類型:SOCK_STREAM(默認(rèn)值)或SOCK_DGRAM。套接字“地址”,如“”或“”。該地址為網(wǎng)絡(luò)上的網(wǎng)際協(xié)議(IP)地址。很可能要始終依賴此參數(shù)的默認(rèn)值。如果套接字是客戶端,則使用CAsyncSocket::Connect將此套接字對象連接到服務(wù)器套接字,銷毀CAsyncSocket對象。3.1.2利用CSocket進(jìn)行有連接的通信CAsyncSocket類逐個封裝了WinSockAPI,為高級網(wǎng)絡(luò)程序員提供了更加有力而靈活的方法。這個類基于程序員了解網(wǎng)絡(luò)通訊的假設(shè),目的是為了在MFC中使用WinSock,程序員有責(zé)任處理諸如阻塞、字節(jié)順序和在Unicode與MBCS間轉(zhuǎn)換字符的任務(wù)。為了提供更方便的接口以自動處理這些任務(wù),MFC給出了CSocket類,這個類是由CAsyncSocket類繼承下來的,它提供了比CAsyncSocket更高層的WinSockAPI接口。Csocket類和CsocketFile類可以與Carchive類一起合作來管理發(fā)送和接收的數(shù)據(jù),這使管理數(shù)據(jù)收發(fā)更加便利。CSocket對象提供阻塞模式,這對于Carchive的同步操作是至關(guān)重要的。阻塞函數(shù)(如Receive()、Send()、ReceiveFrom()、SendTo()和Accept())直到操作完成后才返回控制權(quán)。3.2重要部分代碼實(shí)現(xiàn)及分析3.2.1客戶端實(shí)現(xiàn)首先啟動VC6.0,利用MFCAppWizard[EXE]建立一個新的MFC工程,工程名為tcpclient,在MFCAppWizardStep1的時候選擇Dialogbased即基于對話框,在Step4時勾選WindowsSockets選項(xiàng)(如圖3.11),其他默認(rèn)值下一步。圖3.11MFC的設(shè)置客戶端主要分為三個窗口,第一個是連接窗口,需要輸入連接到服務(wù)器的相關(guān)設(shè)置信息;第二個是聊天信息顯示窗口,該窗口顯示登錄服務(wù)器以來發(fā)送和接收到的消息;第三個是消息編輯發(fā)送窗口,需要輸入你要發(fā)送的信息內(nèi)容并發(fā)送。設(shè)計步驟:①創(chuàng)建字符串ipstr(保存IP),portstr(保存端口),clientname(用戶名),整型port(端口號)。②利用GetDlgItemText將各個編輯框中的信息賦給相應(yīng)的變量。③監(jiān)視端口號和IP格式并設(shè)置相應(yīng)錯誤提示(如下圖)。圖3.13連接錯誤提示圖3.14端口或IP錯誤提示④創(chuàng)建套接字clconect,設(shè)置成功創(chuàng)建后相關(guān)控件為只讀。⑤設(shè)置建立連接后相應(yīng)提示。接下來就是對話框中的發(fā)送(回車)按鈕的函數(shù),代碼設(shè)置如下:voidCTcpclientDlg::Onsend(){CStringstr;GetDlgItemText(IDC_EDIT4,str);str=clientname+":"+str;intlen=str.GetLength();if(clconect.Send(str,len)>1)SetDlgItemText(IDC_EDIT4,"");}定義字符串str用于保存輸入的消息,調(diào)整格式后使用CSocket的操作函數(shù)send將消息發(fā)送到服務(wù)器。要顯示客戶端接收到來自服務(wù)器其他用戶的信息,代碼設(shè)置如下:voidCTcpclientDlg::onrev(){CStringstr,str1;charss[256];for(intj=0;j<256;j++)ss[j]='\0';clconect.Receive(ss,256);if(ss!="")str.Format("%s",ss);GetDlgItemText(IDC_EDIT3,str1);str=str1+"\r\n"+str;SetDlgItemText(IDC_EDIT3,str);CEdit*ce=((CEdit*)GetDlgItem(IDC_EDIT3));ce->LineScroll(ce->GetLineCount()-1);;}設(shè)計步驟:①創(chuàng)建字符串str、str1,字符數(shù)組ss。②接受來自服務(wù)器套接字的信息數(shù)據(jù)保存到ss中,調(diào)整格式后將其打印到消息區(qū)。(7)當(dāng)與服務(wù)器斷開連接時彈出警告,如下圖:圖3.15失去連接提示代碼設(shè)置如下:voidCTcpclientDlg::oncl(){MessageBox("失去連接或者找不到服務(wù)器");CWnd*cw=GetDlgItem(IDC_EDIT1);cw->EnableWindow(true);cw=GetDlgItem(IDC_EDIT2);cw->EnableWindow(true);cw=GetDlgItem(IDC_connet);cw->EnableWindow(true);cw=GetDlgItem(IDC_EDIT5);cw->EnableWindow(true);}當(dāng)失去與服務(wù)器的連接后,重新將連接服務(wù)器設(shè)置編輯框啟用等待下次連接。(8)在退出程序時的提示,如下圖:圖3.16退出確認(rèn)代碼設(shè)置如下:voidCTcpclientDlg::OnClose(){intconfirm=MessageBox("確定退出嗎","請確定",MB_YESNO|MB_ICONQUESTION);if(confirm==IDYES){CStringenterinfo=clientname+"退出了聊天室";intlen=enterinfo.GetLength();clconect.Send(enterinfo,len);CDialog::OnClose();}}設(shè)計步驟:①當(dāng)退出程序時,彈出確認(rèn)對話框。②當(dāng)選擇“是”時,將用戶退出信息發(fā)送至服務(wù)器并關(guān)閉對話框。至此客戶端的核心部分介紹完畢。3.2.2服務(wù)端的實(shí)現(xiàn)和客戶端一樣,仍然建立一個基于對話框的工程,工程名為tcpserver,同樣,注意一定不要忘記在Step4時勾選WindowsSockets選項(xiàng)。其他默認(rèn)下一步。客戶端主要分為三個窗口,第一個是服務(wù)器信息設(shè)置窗口,需要輸入服務(wù)器的相關(guān)設(shè)置信息;第二個是聊天信息顯示窗口,該窗口顯示啟動服務(wù)器以來發(fā)送和接收到的消息;第三個是消息編輯發(fā)送窗口,需要輸入你要發(fā)送的信息內(nèi)容并發(fā)送。新建一個對話框,并添加各種控件(見控件表3.2)如下圖:單擊啟動服務(wù)器按鈕時的處理網(wǎng)絡(luò)連接的函數(shù)。、設(shè)計步驟:①創(chuàng)建字符串ipstr(保存IP),portstr(保存端口),整型port(端口號)。②利用GetDlgItemText將各個編輯框中的信息賦給相應(yīng)的變量。③監(jiān)視端口號和IP格式并設(shè)置相應(yīng)錯誤提示④設(shè)置建立連接后相應(yīng)提示。(5)接下來就是對話框中的發(fā)送(回車)按鈕的函數(shù),代碼設(shè)置如下:voidCTcpseverDlg::Onsend(){CStringstr,history;GetDlgItemText(IDC_EDIT1,history);GetDlgItemText(IDC_EDIT2,str);str=severname+":"+str;intlen=str.GetLength();intsended;for(inti=1;i<=csnum;i++)if(csrev[i])if(sended=csrev[i].Send(str,len)){SetDlgItemText(IDC_EDIT2,"");SetDlgItemText(IDC_EDIT1,history+"\r\n"+str);CEdit*ce=((CEdit*)GetDlgItem(IDC_EDIT1));ce->LineScroll(ce->GetLineCount()-1);;}}定義字符串str用于保存輸入的消息,調(diào)整格式后使用CSocket的操作函數(shù)send將消息發(fā)送到各個客戶端。(6)要顯示服務(wù)器接收到來自客戶端其他用戶的信息,代碼設(shè)置如下:voidCTcpseverDlg::onrev(intmynum){-CStringstr,str1;inti;charss[100];for(intj=0;j<100;j++)ss[j]='\0';csrev[mynum].Receive(ss,100);str.Format("%s",ss);for(i=1;i<=csnum;i++)if(csrev[i])if(csrev[i])csrev[i].Send(str,100);GetDlgItemText(IDC_EDIT1,str1);str=str1+"\r\n"+str;SetDlgItemText(IDC_EDIT1,str);CEdit*ce=((CEdit*)GetDlgItem(IDC_EDIT1));ce->LineScroll(ce->GetLineCount()-1);;}設(shè)計步驟:①創(chuàng)建字符串str、str1,字符數(shù)組ss。②接受來自服務(wù)器套接字的信息數(shù)據(jù)保存到ss中,調(diào)整格式后將其打印到消息區(qū)。當(dāng)有新用戶進(jìn)入時,顯示“XXX進(jìn)入”。代碼如下:voidCTcpseverDlg::onac(){CStringstr1,str;GetDlgItemText(IDC_EDIT1,str1);CStringstr2="\r\n進(jìn)入";str=str1+str2;SetDlgItemText(IDC_EDIT1,str);cslisten.Accept(csrev[++csnum]);csrev[csnum].setp(this,csnum);}在退出程序時的提示,如下圖:圖3.24退出確認(rèn)代碼設(shè)置如下:voidCTcpseverDlg::OnClose(){CStringstr="服務(wù)器即將退出";intconfirm=MessageBox("確定退出服務(wù)器?所有用戶都將斷開","請確定",MB_YESNO|MB_ICONQUESTION);if(confirm==IDYES){intlen=str.GetLength();for(inti=1;i<=csnum;i++)if(csrev[i])csrev[i].Send(str,len);str=severname+"退出,與服務(wù)器連接已斷開";len=str.GetLength();for(i=1;i<=csnum;i++)if(csrev[i])csrev[i].Send(str,len);CDialog::OnClose();}}設(shè)計步驟:當(dāng)退出程序時,彈
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國植物提取物行業(yè)發(fā)展動態(tài)及投資規(guī)劃研究報告
- 基于腦機(jī)接口的注意力檢測與增強(qiáng)系統(tǒng)研究
- 2025-2030年中國拋丸機(jī)市場運(yùn)行態(tài)勢及發(fā)展建議分析報告
- 2025-2030年中國心電圖機(jī)行業(yè)需求分析及投資戰(zhàn)略研究報告
- 車位贈予合同范本
- 2025-2030年中國合同能源管理行業(yè)運(yùn)營狀況及發(fā)展前景預(yù)測分析報告
- 科技論壇的主持人溝通技巧
- 儀器回收合同范本
- 社交媒體內(nèi)容營銷與品牌推廣的融合
- 文獻(xiàn)檢索與利用
- 2學(xué)會寬容 第1課時(說課稿)-2023-2024學(xué)年道德與法治六年級下冊統(tǒng)編版
- 公共圖書館情緒療愈空間設(shè)計研究:動因、現(xiàn)狀與實(shí)現(xiàn)機(jī)制
- 靜脈治療??谱o(hù)士培訓(xùn)
- 【課件】Unit+6+section+B+1a~2b+課件人教版七年級英語上冊
- 牛買賣合同范本
- 釘釘操作指南培訓(xùn)教育課件
- 人音版九下級下冊音樂 5.2.2報花名 教案
- 金庸人物課件
- 2024年農(nóng)業(yè)農(nóng)村基礎(chǔ)知識考試題庫(附答案)
- 相互批評意見500條【5篇】
評論
0/150
提交評論