即時(shí)通信系統(tǒng)_第1頁(yè)
即時(shí)通信系統(tǒng)_第2頁(yè)
即時(shí)通信系統(tǒng)_第3頁(yè)
即時(shí)通信系統(tǒng)_第4頁(yè)
即時(shí)通信系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

XUCHANGUNIVERSITY本科生課程設(shè)計(jì)即時(shí)通信系統(tǒng)院系計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)班級(jí)學(xué)號(hào)學(xué)生姓名指導(dǎo)教師職稱講師2011年12月獨(dú)創(chuàng)性聲明本人鄭重聲明:所呈交的課程設(shè)計(jì)論文(設(shè)計(jì))是本人在指導(dǎo)老師指導(dǎo)下取得的研究成果。除了文中特別加以注釋和致謝的地方外,論文(設(shè)計(jì))中不包含其他人已經(jīng)發(fā)表或撰寫的研究成果。與本研究成果相關(guān)的所有人所做出的任何貢獻(xiàn)均已在論文(設(shè)計(jì))中作了明確的說明并表示了謝意。簽名:年—月—日授權(quán)聲明本人完全了解許昌學(xué)院有關(guān)保留、使用本科生課程設(shè)計(jì)論文(設(shè)計(jì))的規(guī)定,即:有權(quán)保留并向國(guó)家有關(guān)部門或機(jī)構(gòu)送交課程設(shè)計(jì)論文(設(shè)計(jì))的復(fù)印件和磁盤,允許課程設(shè)計(jì)論文(設(shè)計(jì))被查閱和借閱。本人授權(quán)許昌學(xué)院可以將課程設(shè)計(jì)論文(設(shè)計(jì))的全部或部分內(nèi)容編入有關(guān)數(shù)據(jù)庫(kù)進(jìn)行檢索,可以采用影印、縮印或掃描等復(fù)制手段保存、匯編論文(設(shè)計(jì))。本人論文(設(shè)計(jì))中有原創(chuàng)性數(shù)據(jù)需要保密的部分為:。簽名:年—月—日指導(dǎo)教師簽名:年—月—日摘要本文介紹了即時(shí)通信系統(tǒng)的程序設(shè)計(jì)和功能實(shí)現(xiàn)。該系統(tǒng)主要是基于TCP與UDP的C/S模式通信系統(tǒng)。該項(xiàng)目由兩個(gè)主程序組成:服務(wù)器端應(yīng)用程序,客戶機(jī)端應(yīng)用程序。服務(wù)器啟動(dòng)監(jiān)聽進(jìn)程,監(jiān)聽連接申請(qǐng),對(duì)于來申請(qǐng)的客戶機(jī),或者說申請(qǐng)的ID,服務(wù)器進(jìn)程將會(huì)對(duì)進(jìn)行判別和分類,滿足服務(wù)器要求就進(jìn)行連接,從而實(shí)現(xiàn)客戶端的通信。該系統(tǒng)界面友好,操作簡(jiǎn)單,適應(yīng)性強(qiáng),擴(kuò)展性強(qiáng)。關(guān)鍵字:即時(shí)通信;服務(wù)器;客戶端;ABSTRACTThispaperintroducestheInstantMessagingsystemsprogramdesignandfunctionrealization.ThesystemismainlybasedonTCPandUDPC/Smodecommunicationsystem.Theprojectconsistsoftwomainprogramcomposition:theserverapplication,theclientapplication.Monitorprocessserverstartup,monitorconnectionapplication,toapplyfortheclient,orapplyforID,theserverprocesswillbetodiscriminationandclassification,andsatisfytherequirementswillconnectserver,soastorealizetheclientcommunication.Thesystemfriendlyinterface,simpleoperation,strongadaptabilityandexpandability.Keyword:InstantMessaging;Theserver.Theclient;目錄TOC\o"1-5"\h\z目錄4第1章引言61.1概述61.2研究背景61.3系統(tǒng)簡(jiǎn)介61.4系統(tǒng)開發(fā)方法6第2章系統(tǒng)分析7可行性分析7功能分析7第3章系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)93.1項(xiàng)目系統(tǒng)模型93.2開發(fā)及運(yùn)行環(huán)境93.3系統(tǒng)結(jié)構(gòu)設(shè)計(jì)93.4系統(tǒng)功能設(shè)計(jì)103.5服務(wù)器端應(yīng)用程序123.5.1服務(wù)器端應(yīng)用程序的創(chuàng)建流程123.5.2實(shí)現(xiàn)界面設(shè)計(jì)123.5.3定義類設(shè)計(jì)13實(shí)現(xiàn)類中的函數(shù)15實(shí)現(xiàn)界面功能按鈕223.5.6測(cè)試233.6客戶端應(yīng)用程序233.6.1界面設(shè)計(jì)23控件的編輯與綁定243.6.3定義類設(shè)計(jì)和實(shí)現(xiàn)類設(shè)計(jì)中的函數(shù)243.6.4實(shí)現(xiàn)界面功能按鈕253.6.5測(cè)試25第4章系統(tǒng)結(jié)構(gòu)274.1服務(wù)器端結(jié)構(gòu)27客戶端結(jié)構(gòu)27第5章系統(tǒng)評(píng)價(jià)29結(jié)束語(yǔ)30致謝31附錄參考文獻(xiàn)32#1.1概述即時(shí)通信(InstantMessaging)是基于互聯(lián)網(wǎng)協(xié)議的應(yīng)用程序,它能夠使應(yīng)用不同類型設(shè)備的用戶一對(duì)一進(jìn)行通信。IM最傳統(tǒng)的形式是聊天,聊天即雙方互相傳送信息。與電子郵件服務(wù)相比,聊天服務(wù)更具有實(shí)時(shí)性,更便于人們相互溝通和交流信息。而套接字是通信雙方一種相互約定的通信方式和規(guī)則,在TCP/IP通信中一般使用套接字的相關(guān)函數(shù)接口來完成通信過程。區(qū)分不同應(yīng)用程序進(jìn)程間的網(wǎng)絡(luò)通信和連接,主要有三個(gè)通信的目的IP地址,使用的傳輸層協(xié)議,使用的端口號(hào)。通過這三種參數(shù)就可以識(shí)別客戶端雙方的身份進(jìn)行可以放心的通信。本系統(tǒng)在此基礎(chǔ)上設(shè)計(jì)的一個(gè)簡(jiǎn)單的通信系統(tǒng)。1.2研究背景隨著互聯(lián)網(wǎng)的發(fā)展,聊天服務(wù)已成為必不可少的互聯(lián)網(wǎng)服務(wù)之一,它方便遠(yuǎn)距離人們的信息的交流,簡(jiǎn)單易操作,又保證的即時(shí)性,使人們更能享受互聯(lián)網(wǎng)帶來的好處。典型的IM是樣工作的:當(dāng)好友列表中的某人在任何時(shí)候登錄上線并試圖通過用戶怕計(jì)算機(jī)聯(lián)系用戶時(shí),IM系統(tǒng)會(huì)發(fā)一個(gè)消息提醒用戶,然后用戶能與對(duì)方建立一個(gè)聊天會(huì)話界面并鍵入消息文字進(jìn)得交流。自1999年,騰訊公司自主開發(fā)了基于Internet即時(shí)通信網(wǎng)絡(luò)工具—騰訊即時(shí)通信(QQ),其合理的設(shè)計(jì),良好的易用性,強(qiáng)大的功能,穩(wěn)定高效的系統(tǒng)運(yùn)行,贏得了用戶的青睞。與電子郵件服務(wù)相比,聊天服務(wù)具有實(shí)時(shí)性,人們更便于相互溝通,交流思想和信息。所以即時(shí)通信系統(tǒng)已成為人們研究的熱點(diǎn)。1.3系統(tǒng)簡(jiǎn)介該系統(tǒng)是基于客戶機(jī)/服務(wù)器(Client/Server)模式的聊天室系統(tǒng),此設(shè)計(jì)采取監(jiān)聽對(duì)話模型。基本思路是:服務(wù)器啟動(dòng)監(jiān)聽進(jìn)程,監(jiān)聽連接申請(qǐng),對(duì)于來申請(qǐng)的客戶機(jī),或者是申請(qǐng)的ID,服務(wù)器進(jìn)程將會(huì)對(duì)其判別與分類,滿足服務(wù)器要求進(jìn)行連接。1.4系統(tǒng)開發(fā)方法本系統(tǒng)是利用VisualC++6.0這個(gè)集成開發(fā)環(huán)境設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基于C/S模型的聊天室。1.該系統(tǒng)是使用MFC庫(kù)開發(fā)基于對(duì)話框形式的網(wǎng)絡(luò)聊天室系統(tǒng)。MFC庫(kù)可以開發(fā)內(nèi)容和功能都非常豐富的Windows程序,但萬變不離其中,都是圍繞著MFC(即繼承MFC類進(jìn)行開發(fā))庫(kù)實(shí)現(xiàn)的。MFC類家族很龐大,但有幾個(gè)是程序運(yùn)行必備的類:CObject類:該類完成動(dòng)態(tài)空間的分配與回收。CCmdTarget類:CCmdTarget類主要負(fù)責(zé)將系統(tǒng)事件(消息)和窗口事件(消息)發(fā)送給響應(yīng)這些事件的對(duì)象,完成消息的發(fā)送,等待和派遣工作,實(shí)現(xiàn)應(yīng)用程序的對(duì)象之間的協(xié)調(diào)運(yùn)行。CWinApp類:CWinApp類是應(yīng)用程序的主線程類,它是從CWinThread類派生而來。CDocument類:CDocument類是文檔類,包含了應(yīng)用程序在運(yùn)行期間所用到的數(shù)據(jù)。CWnd類:CWnd類是一個(gè)通用窗口類,用來提供Windows中所有通用特性。CView類:CView類是用于讓用戶通過窗口來訪問文檔以用負(fù)責(zé)文檔內(nèi)容的顯示。CFrameWnd類:是CWnd的派生,并實(shí)現(xiàn)了標(biāo)準(zhǔn)的框架應(yīng)用程序。CDialog類:CDialog類用來控制對(duì)話框窗口,并選擇從CDialog類繼承。2.VC++提供了多種對(duì)網(wǎng)絡(luò)編程的支持,主要有Socket支持,WinInet支持,MAPIT和ISAPI支持等。WindowsSocketsAPI是Win32API的一個(gè)子集,是在TCP/IP網(wǎng)絡(luò)環(huán)境里也是Internet上進(jìn)行開發(fā)的最常用的API。第2章系統(tǒng)分析2.1可行性分析即時(shí)通信(InstantMessaging),是近年來逐漸興起的網(wǎng)絡(luò)應(yīng)用之一,面向大眾娛樂聊天休閑的即時(shí)軟件層出不窮,如QQ,MSN,Yahoo,Messenger等等。它通過通信系統(tǒng)建立網(wǎng)絡(luò)虛擬環(huán)境,商務(wù)通訊及商務(wù)合作的新媒體,可以彌補(bǔ)傳統(tǒng)通訊形式的不足,尤其是電子郵件及語(yǔ)音的不足,為用戶提供了有效的溝通手段。即時(shí)通信系統(tǒng)是隨著互聯(lián)網(wǎng)的出現(xiàn)而興起的新型通信手段。最早,即時(shí)通信系統(tǒng)對(duì)人們來說只是一個(gè)網(wǎng)絡(luò)尋找朋友的聊天的工具,但是,隨著互聯(lián)網(wǎng)使用的逐漸豐富和完善,一個(gè)綜合的桌面通信平臺(tái)出現(xiàn)了,該平臺(tái)已經(jīng)成為一個(gè)地地道道的通信工具,并可能成為繼電話,電子郵件之后的第三種現(xiàn)代通信方式。在各個(gè)領(lǐng)域,即時(shí)通信系統(tǒng)作為一種低成本的,集成多種溝通方式(文字,語(yǔ)音,視頻,文件傳輸,文件共享)軟件已經(jīng)成為如今天通用的流行通信方式。如所即時(shí)通信系統(tǒng)的研究與開發(fā)已成為現(xiàn)今的熱點(diǎn)。2.2功能分析即時(shí)通信的主要功能如下:服務(wù)器的建立:這個(gè)是實(shí)現(xiàn)聊天的關(guān)鍵,只有建立了聊天服務(wù)器,客戶才能連接到上面從而進(jìn)行聊天過程的實(shí)現(xiàn),服務(wù)器建立之后牌監(jiān)聽狀態(tài),等待客戶機(jī)的申請(qǐng)連接。選擇連接方式:在服務(wù)器建立的時(shí)候,要選擇是何種連接方式,TCP還是UDP,選擇不同,將會(huì)受用不同的消息處理機(jī)制。同時(shí)將確定連接地址和端口號(hào)。啟動(dòng)客戶端:開始嘗試對(duì)服務(wù)器進(jìn)行連接操作,這里面注意之處就是客戶機(jī)要選擇和服務(wù)器一致的連接方式,填入正確的連接地址和端口號(hào)。啟動(dòng)對(duì)話:成功建立連接后,開始進(jìn)行對(duì)話操作,對(duì)就不同的方面,出現(xiàn)的消息也是不的,這樣做的好處就是能夠屏蔽他人的信息,而只要求顯示對(duì)自己有用的信息,一來可以節(jié)省程序設(shè)計(jì)的耗時(shí),二來可以保護(hù)聊天室中的隱私。多用戶的信息交互:當(dāng)建立一個(gè)連接后,其他的客戶機(jī)也是可以再連接到上面,進(jìn)行多用戶的聊天。退出聊天系統(tǒng):聊天結(jié)束之后,客戶機(jī)斷開連接就可以退出聊天室,信息不再交互,如是服務(wù)器關(guān)閉,連接在上面的所有客戶機(jī)將會(huì)斷開。第3章系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)3?1項(xiàng)目系統(tǒng)模型該項(xiàng)目由兩個(gè)程序組成:?服務(wù)器端應(yīng)用程序:主要是負(fù)責(zé)信息轉(zhuǎn)發(fā)和存儲(chǔ),以及通信端口和通信用戶的管理。?客戶機(jī)端應(yīng)用程序:主要是負(fù)責(zé)提供給非專業(yè)技術(shù)人員用戶,用戶通過客戶機(jī)可以和其他客戶機(jī)或者服務(wù)器進(jìn)行通信。本項(xiàng)目的系統(tǒng)模型如圖1.1所示。圖1.1系統(tǒng)模型3.2開發(fā)及運(yùn)行環(huán)境本系統(tǒng)運(yùn)行時(shí)需要以下條件硬件平臺(tái):CPU:Pentium41.8GHZ內(nèi)存:256MB以上軟件平臺(tái):操作系統(tǒng):WindowsXP/Windows2000/Win7開發(fā)工具包:VisualC++6.03.3系統(tǒng)結(jié)構(gòu)設(shè)計(jì)

該系統(tǒng)是基于客戶機(jī)/服務(wù)器(Client/Server)模式的聊天室系統(tǒng),此設(shè)計(jì)米取監(jiān)聽對(duì)話模型?;舅悸肥牵悍?wù)器啟動(dòng)監(jiān)聽進(jìn)程,監(jiān)聽連接申請(qǐng),對(duì)于來申請(qǐng)的客戶機(jī),或者是申請(qǐng)的ID,服務(wù)器進(jìn)程將會(huì)對(duì)其判別與分類,滿足服務(wù)器要求進(jìn)行連接。連接后,客戶機(jī)端用戶就可以進(jìn)行通信了。系統(tǒng)框架圖如圖1.2所示。啟動(dòng)監(jiān)昕進(jìn)程咸息幵蔦互!連功&始喜廣機(jī)啟動(dòng)監(jiān)昕進(jìn)程咸息幵蔦互!連功&始喜廣機(jī)圖1.2聊天室的C/S模型設(shè)計(jì)框架3.4系統(tǒng)功能設(shè)計(jì)實(shí)現(xiàn)基于對(duì)話框的網(wǎng)絡(luò)聊天通信則需要實(shí)現(xiàn)以下幾個(gè)功能:1)建立通信框架首先利用MFCAppWizard生成系統(tǒng)框架:在VisualC++6.0的IDE的環(huán)境下選擇FilelNewIProjectIMFCAppWizard(exe)IProjectNamelOK|NEXT|WindowSockets|Finish按鈕,選擇OK按鈕,應(yīng)用程序的框架就將自動(dòng)創(chuàng)建。之后增加控件對(duì)象,布置程序的主對(duì)話框,通信框架就建立成功了。網(wǎng)絡(luò)連接類CsocketComm該類的定義和實(shí)現(xiàn),完成了C/S模型的連接處理,也就是所謂的”信道通信”部分。由于本系統(tǒng)集成TCP和UDP的聊天程序,所以在系統(tǒng)中有所區(qū)別.主要實(shí)現(xiàn)的接口功能包括:創(chuàng)建服務(wù)器端socket,獲取主機(jī)IP,獲取服務(wù)器端口號(hào),獲取本地地址,獲取主機(jī)名字,數(shù)據(jù)接收,發(fā)送,以及關(guān)閉通信等。創(chuàng)建服務(wù)器Server首先需要?jiǎng)?chuàng)建Socket,在函數(shù)CreateSocket()中創(chuàng)建Socket,由于傳輸中有TCP和UDP兩種方式,函數(shù)CreateSocket()中根據(jù)傳遞過來的參數(shù)nType的值對(duì)這兩種不同的傳輸方式進(jìn)行選擇,該函數(shù)不管TCP還是UDP連接,都是通用的。當(dāng)nType=SOCK_DGRAM時(shí)為UDP;當(dāng)nType=SOCK_STREAM時(shí)為TCP。有所區(qū)別的是,在UDP中如時(shí)要進(jìn)行廣播,需要進(jìn)行互斥操作,防止同一時(shí)間不同的UDP廣播;在TCP連接模式中,沒有UDP傳輸模式中的廣播模式,但是在TCP連接需要保存socket,保證連接的存在和數(shù)據(jù)到達(dá)的準(zhǔn)確性。服務(wù)器的主要功能包括啟動(dòng)服務(wù)器,更新服務(wù)器、關(guān)閉服務(wù)器、發(fā)送與接收信息,以及設(shè)定相關(guān)選項(xiàng)。創(chuàng)建客戶機(jī)Client客戶機(jī)的創(chuàng)建和服務(wù)器的創(chuàng)建同等重要,都是通信的實(shí)體。客戶端通過函數(shù)ConnectTO來進(jìn)行連接申請(qǐng),首先判斷Socket是否已連接,如果創(chuàng)建就返回false,否則就創(chuàng)建Socket。創(chuàng)建好Socket之后和本地地址綁定,再獲取遠(yuǎn)程服務(wù)器的地址和端口號(hào),確定好服務(wù)器,就調(diào)用Connect。將客戶機(jī)連接到服務(wù)器。UDP中多用戶聊天的實(shí)現(xiàn)首先,服務(wù)器創(chuàng)建UDP類型的套接字并綁定服務(wù)端口,并使得該套接字處于未連接狀態(tài);接下來就循環(huán)讀取來自客戶機(jī)的請(qǐng)求,將其地址保存起來,寫入地址表m_AddList。服務(wù)器端接收客戶機(jī)發(fā)送過來的數(shù)據(jù)時(shí),先判斷緩沖區(qū)是否夠大,足夠大剛寫入緩沖區(qū);向客戶機(jī)發(fā)送數(shù)據(jù)時(shí),通過廣播的形式,先鎖定地址列表LockList(),然后通過for循環(huán)語(yǔ)句,對(duì)地址列表中的每個(gè)地址通過函數(shù)sendto()發(fā)送數(shù)據(jù)到客戶機(jī)。期間,若某客戶機(jī)與服務(wù)器斷開連接,剛從地址列表中刪除其地址信息,之后將不再發(fā)送數(shù)據(jù)。6)退出系統(tǒng)當(dāng)客戶端選擇退出系統(tǒng)時(shí),則斷開與服務(wù)器的連接,不開轉(zhuǎn)發(fā)其信息3.5服務(wù)器端應(yīng)用程序3.5.1服務(wù)器端應(yīng)用程序的創(chuàng)建流程創(chuàng)建流程如下:實(shí)現(xiàn)界面設(shè)計(jì)實(shí)現(xiàn)界面設(shè)計(jì)不僅僅是設(shè)計(jì)一個(gè)界面,還需要對(duì)界面的控件名稱和控件綁定的變量進(jìn)行定義。(1)界面設(shè)計(jì)服務(wù)器的對(duì)話框界面如圖1.3所示。

圖1.3服務(wù)器端應(yīng)用程序界面設(shè)計(jì)(2)編輯控件與變量綁定設(shè)置界面中的3個(gè)編輯框的ID和與之綁定的變量,如表1.4所示。表1.4編輯框控件和變量的綁定編輯控件的內(nèi)容ID類型變量名服務(wù)器端口IDC_EDIT_PORTCStringm_strPort聊天記錄IDC_EDIT_MSGRERCEditM_ctrlMsgRecord發(fā)送消息IDC_EDIT_MSGCEditM_ctrlMsg端口微調(diào)控件IDC_SPINPORTCSpinButtonCtrlM_ctrlSpinPort3.5.3定義類設(shè)計(jì)服務(wù)器有2個(gè)基本功能:聊天記錄的轉(zhuǎn)發(fā)、端口管理。將這兩個(gè)功能封裝在兩個(gè)類中:CSocketComm類:該類負(fù)責(zé)網(wǎng)絡(luò)連接,信息轉(zhuǎn)發(fā)等。CSocketManager類:該類負(fù)責(zé)端口的管理。CSocketComm類中的主要函數(shù)功能:

staticSOCKETWaitForConnection(SOCKETsock);等待新的連接。staticboolShutdownConnection(SOCKETsock);關(guān)閉連接。staticUSHORTGetPortNumber(LPCTSTRstrServiceName);獲得服務(wù)端口號(hào)。staticULONGGetIPAddress(LPCTSTRstrHostName);獲得主機(jī)IP地址。staticboolGetLocalName(LPTSTRstrName,UINTnSize);獲得機(jī)器名。staticboolGetLocalAddress(LPTSTRstrAddress,UINTnSize);獲得本地地址。CSocketComm類代碼如下:classCSocketComni<public:CSocketConn();boolIw叩boolIw叩Enf】const;H判折socket怎否王確boolIsStartOconst;//線養(yǎng)是否啟訪boollsBroadcast()const;//是否允許UDF廣播boolIsSmartfiddressingOconst;H(sSmartAddressingmodesupportSOCKETGetSocket()const;//返回mocliEt句柄voidboolboolvoidvoidvoidboolvoidSetSnartAddressing(boolbSmartAddressing);//SetSmartaddressingmodeGetSockHairie(SockAddrIn&saddrin);//苑得socket名即地址voidboolboolvoidvoidvoidboolvoidGetPeerName(SockAddrln&saddrin);//濟(jì)導(dǎo)PeefSocket爺-地址AddlcList(constSockFlddrln^saddr_in);力爲(wèi)地扯增才庠〔歹愫Re[noveFroinList(constSDDkAddr(n&saddrin);//j麻〔衰口刪除列衰CloseComniO;//丟習(xí)SocketIFatchCoinnO;//啟幻Socket線趕Mt叩CommO;//停止Socket攥呈//創(chuàng)建旅芬羞茁血上boolCreateSocket(LPCTSTREtrSeruiceName,intnProtocol,intnlijpe,UINTuDptions=9);H事件處理函數(shù)-接收數(shù)據(jù)virtualvoidOnDataReceiuBd(constLPBYTElpBuFFer,OUORDdwCount);virtualvoidOnEuent(UIKTuEuent);H主線程函數(shù)virtualvoidRun();CSocketManager類中的主要函數(shù)如下:virtualvoidOnDataReceived(constLPBYTElpBuffer,DWORDdwCount);接收數(shù)據(jù)voidDisplayData(constLPBYTElpData,DWORDdwCount,constSockAddrIn&sfrom);顯示數(shù)據(jù)CSocketManager類代碼如下classCSocketManager:publicCSocketCommpublic:CSocketManager();uirtual**CSocketHanager();voidSetblessageWindow(CEdit*pMsgCtrl];voidfippendMessagefLPCTSTRstrText);public:uirtualvoidOnDataR?ceijed(constLPBVTElpBufferpDUORDduCount):uirtualvoidCnEuent[HINTuEvent);protected:voidDisplayDatafconEtLPBVTElpData,DWORDduCount,constSockAddrIntsFron);CEdit*mpMsgCtrl;打_3.5.4實(shí)現(xiàn)類中的函數(shù)CSocketComm類主要實(shí)現(xiàn)5個(gè)功能:獲取本機(jī)地址、創(chuàng)建套接字、關(guān)閉套接字、數(shù)據(jù)讀入、數(shù)據(jù)發(fā)送。CSocketManager類實(shí)現(xiàn)數(shù)據(jù)顯示。開發(fā)流程如下:獲取本地計(jì)算機(jī)機(jī)器名及IP地址。獲取本地計(jì)算機(jī)機(jī)器名及IP地址及端口號(hào),為了區(qū)分不同的應(yīng)用進(jìn)程和連接事務(wù),用于本地計(jì)算機(jī)用戶進(jìn)行通信。實(shí)現(xiàn)代碼如下:"獲得本地機(jī)器名boolCSocketComm::GetLocalNane(LPTSTRstrNane,UINTnSize)if(strNameNULL&&nSize>0)charstrHost[HOSTNAME_SIZE]={B};//獲得機(jī)器名iF(SOCKETERROR!=gethostname(strHost,sizeof(strHost)))<_structhostent*hp;|hp二gethostbyname(strHost);if(hp?=NJLL){5trcpy(strHost,hp->h_nane):}_//檢查緩沖區(qū)大小if[strlen(strHost)>nSize){SetLastError(ERRORINSUFFICIENTBUFFER);returnfalse;"獲取本地計(jì)算機(jī)的標(biāo)準(zhǔn)IP地址,^"127.0.0.flboolCSocketComn::GetLocalAddress(LPTSTRstrAddress,UINTnSize){//獲得計(jì)算機(jī)本地地址if(strAddress*=NULL除nSize>町{char5trHo5t[H0STNAME_SIZE]={B};//獲得機(jī)器名if(SOCKETERROR?=gethostnane(strHost,5izeoF(5trHo5t)))<_structhostent*hp;hp=getho5tbyname(5trHo5t);if(hp!=HULL除hp->h_addr_list[0]!=HULL){//查看地址是否是畔節(jié)犬小if(hp->h_length<即)

returnFalse;//轉(zhuǎn)化地址到點(diǎn)strHost[0]=6;//創(chuàng)建地址字符創(chuàng)sprintf(strHost,■■盅u.%u.%u?塔lT,(UINT)(((PBYTE)hp->h_addr_list[0]>[0]),(UINT)(((PBYTE)hp->h_addr_list[(UINT)(((PBVTE)hp->h_addr_list[B])[2]),(UINT)(((PBVTE)hp->h2add^li5t[0]>[3]));//檢查緩神區(qū)是否足夠if(strler(strHost)>nSize)SetLastErrorfERROfi」NgUFFMIENT」UF莊R);returnfal^e;HUnicode轉(zhuǎn)換lifdefIHICOCEreturn(B*=HultiBijte7cWideChar(CP_ACP,fl,strHost,-1,strAddress,rSize5NULL,NULL));-(elsetcscp^tstrfiddress,strHost);returntrue;tendif}}SetLa5tError(ERR0R_INUflLID_PflRflHETER);returnfalse;}創(chuàng)建套接字。套接字,是支持TCP/IP的網(wǎng)絡(luò)通信的基本操作單元,可以看做是不同主機(jī)之間的進(jìn)程進(jìn)行雙向通信的端面點(diǎn),簡(jiǎn)單的說就是通信的兩方的一種約定,用套接字中的相關(guān)函數(shù)來完成通信過程。套接字主要有三個(gè)參數(shù)組成:通信的目的IP地址,使用的傳輸層協(xié)議,使用的端口號(hào)。創(chuàng)建一個(gè)套接字就是為客戶端提供一個(gè)可以通信的接口。實(shí)現(xiàn)代碼如下:boolCSocketComm::CreateSocket(LPCTSTRstrSeruiceN^me,intnProtocol,intnType,UINTuOptions/*=B*/)<"如果已經(jīng)打開,則返回FMhifCI切卩町())returnFalse;SOCKADDRINsockAddr={B"地址設(shè)定SOCKETsock=socket(nProtocol,nType,0);if(INUftLIDSOCKET?=sock)<_sockAddr.sin_port=htons(GetPortNumber(strSeruiceName));iFC0!=sockAddr.sin_port){_sockAddr.sinaddr.saddr=htonlfINfiDDRfiN?):sockAddr.sin_Faniily=nProtocol;if(uOptions&SOREUSEADDR)'"設(shè)定相關(guān)選頂BOOLoptual=TRUE;if(SOCKETERROR==setsocl<opt(sock,SOLSOCKET,SO_REU£EfiDDR,|(char*)Koptual,sizpof?BOOL))){_cloEesocket(sock);returnFalse;關(guān)閉套接字。當(dāng)服務(wù)器斷開或客戶端斷開服務(wù)器時(shí)則關(guān)閉套接字,不再傳輸任何信息。代碼如下:voidCSocketConn::CloseConn()<if(IsOpenfn<…打調(diào)用ShutdounConnection^閉ShutdounConnection((SOCKET)ni_hComm)-mhComm=INVALIDHANDLEUftLUE;mbBroadcjst=False;數(shù)據(jù)讀入,把客戶端輸入的信息傳入服務(wù)器端進(jìn)行轉(zhuǎn)發(fā)。實(shí)現(xiàn)代碼如下:"誦入數(shù)據(jù)DUORDCSocketComm::ReadCoinin(LPBVTElpBuFFer,pWDRDduSize,DWORDduiTinieDut)_fiSSERTE(IsOpen());2fiSSERTE(lpBuffer?=HULL);if(lpBuffer==HULL||d^Size<1L)returnCL;fd_setFdRead={9};TIMEVALstTine;TIMEVAL*pstTine=HULL;if(INFINITE!=duTimeout){stTine?tv_5BG=0;stTine=dvjTimeout*1000;pstTine=&stTine;SOCKET5=(SOCKET)OConn;H設(shè)定描述桔if(?FD_ISSET(5,&FdRead))FD_SET(5,&FdRead);"選擇函數(shù),設(shè)定超時(shí)時(shí)間DUORDduBjjtesRead=OL;intres=select(s+1,&FdRead,NULL,NULL,pstTime):if(res>0)<if(IsBroadcast()||IsSmartAddressingf))<SOCKADDR_INsockAddr={0>;//菇彳昂土也址iritnOFFset=I^SmartAddres^ingf)?sizeoF(sockAddr):Q;iritnLen=^izeaffsackAddr);iF(dwSize<(DU0RD>nLen>ff緩沖區(qū)太小<SetLastErrorfERRaR_IHUALID_USER_BUFFER);return-1L;>"獲得數(shù)據(jù)res=recuFromfsr(LPSTR)&lpBuFFer[nOFFset],dwSize,|乩(LPSOCKADDR>&sockAddr,&nLon);//clear'sin_zero',u?willignorethemwith'Sockfiddrin'anyway!nensptf&sockAddr-sinzero,叫sizeoFCsockfiddr-sinzero));發(fā)送數(shù)據(jù)。對(duì)于從客戶端口傳來的數(shù)據(jù),根據(jù)傳輸層的協(xié)議選擇對(duì)點(diǎn)轉(zhuǎn)發(fā)或者廣播進(jìn)行發(fā)送。如果是TCP協(xié)議則不進(jìn)行廣播,只需要保存socket,保證連接存在和數(shù)據(jù)到達(dá)的準(zhǔn)確性。如果UDP連接則進(jìn)行廣播,需要互斥操作,防止同一時(shí)間不同的UDP廣播。實(shí)現(xiàn)代碼如下:〃發(fā)送數(shù)據(jù)DUORDCSockPtConini::UriteConnn(constLPBYTElpBuffer,DUORDduCount?DUORDdwTimeout)<_ft££ERTE(I^OppnO);2ftS£ERTE(NULL?=lpBuFFer);"如果沒有建立連接或者緩沖區(qū)為空,則返回iF(?IsOpen()||NULL==LpBuFFer)returnBL;//Fd_set是一個(gè)結(jié)構(gòu)體‘可以.被很多的windowssocket函數(shù)使用,//^Dselect,在socketa.O中使甬//typedeFstructFdset{"uintFdGount;ff數(shù)量//SOCKETFd_array[FO_SETSIZE];//socket數(shù)纟目Fd_set;——Fd_sptFdWrite=<B>;TIMEUftLstTine;TIMEUftL*pstTinp二NULL;iF(INFINITE?=duTimeout>{5tTim&.tuusec=duTimeout*1000;pstTime=&stTime;SOCKETs=(SOCKET)m_hConm;"設(shè)定掃述特if(?FD_ISSET(s,&fdWrite))FD_SET(s,ftFdWrite);//選擇函數(shù)設(shè)定超時(shí)時(shí)間DUORDdwBytesWritten=0L;intres=select!s+l,null,ftl-dWrite,null,pstlime);iF(res>O)<//發(fā)送消息廣措或者點(diǎn)對(duì)點(diǎn)發(fā)送iF(IsBroadcast()||IsSnartAddressingO)<HuseoffsetfurSmartaddressingintnDFFset=IsSmartAddrBSsinqf)?sizeoF(SOCKADDR_IN):0:if(IsSmartAddressing())if(duiCount<sizeofCSOCKADDR」N))//error-buffertosmallSetLastError(ERROR」NUALID_U醫(yī)R_BUFFER);return-1L;>//從緩神區(qū)中獲得地址SockAddrInsockAddr;sockAddr.SetAddr((SOCKADDR_IN*)lpBuFFer);//荻得地址然后發(fā)送if(sockftddr.sockAddrln.sin_addr.s_addr?=htonl(INADDR_BROADCAST))<res=5endto(s,(LPCSTR)&lpBuFfer[nOffset],dwCount-nOfFset,O,(LPSOCKADDR)sockAddr,sockAddr.Sizef));dwBytesWritten=(DUORD)((res>=B)?(res):(-1));returndwBytesWritten;佇即潟地址列表CSockAddrList::iteratoriter=nfiddMList.begin();For(;iter?=m_fiddrList.end();)<打循壞發(fā)送信息res=sendto(5,(LPCSTR)&lpBufFer[nOFf5et],dwCount-nQffset,|o,(LPSOCK口DDR)(*itEF),iter->Size());If(res<0)CSockAddrLi^t::it&ratordaladdr=iter;++iter;//下一個(gè)m_fiddrList.erase(deladdr);}_else++iter;//下一個(gè)}UnlockList();//解鎖//UDP總是返回truEres=(int)duiCount-nQffset;G1SG"發(fā)送到單個(gè)客戶端res=send(5,(LPC£TR)LpBuFFer,duCount,Q):dwBj|te5Written=(DUORD)((res>=0)?(res):(-1));}returnduBj/tesUritten;數(shù)據(jù)顯示。將數(shù)據(jù)信息在服務(wù)器端顯示出來。實(shí)現(xiàn)代碼如下:打顯示數(shù)據(jù)voidCSocketManager::Di5playData(constLFBYTElpData,DWORDduCount,constSockAddrIn&sfron)<CStringstrData;memcpyfstrData.GetBuffer(dwCount),^2CT((LPSTR)lpData),duCount);strData.ReleaseBuffer();〃如ftsfroivf;為空if(*sfrom.IsNull())<LONGuAddr=sfrom.GetIPAddr();BVTE*sAddr二(BYTE*)&uflddr;shortnPort=ntohs(sfrom.GetPort());//顯示丈帯口CStringstrAddr;“地址以網(wǎng)絡(luò)形式保存strAddr.Format(_T「■玄u.%u.%u.^u(^d)>"),(UINT)(sAddr[O]),(UINT)(sfiddr[1]),(UINT)(sfiddr[2]),(UINT)(5fiddr[3]),nPort);〃得到來源和數(shù)據(jù)strData=strAddr+;}/丿寫入信息AppendMessagefstrData);}3.5.5實(shí)現(xiàn)界面功能按鈕控件的ID只是標(biāo)記一個(gè)控件,程序中不能直接控制ID,只能通過修改變量來改變控件的狀態(tài),要實(shí)現(xiàn)控件的功能還需要對(duì)其添加消息處理函數(shù)。服務(wù)器的界面主要有6個(gè)功能按鈕:Socket類型:選擇TCP或UDP協(xié)議。服務(wù)器端口:設(shè)置服務(wù)器端口。?啟動(dòng):?jiǎn)螕粼摪粹o,則啟動(dòng)服務(wù)器以提供C/S模式系統(tǒng)的服務(wù)。?停止:?jiǎn)螕粼摪粹o,則停止服務(wù)器斷開連接,不再提供通信服務(wù)。?發(fā)送:?jiǎn)螕粼摪粹o,則在服務(wù)器端向全部在線用戶廣播一條消息。?退出:退出服務(wù)器系統(tǒng)。

3.5.6測(cè)試測(cè)試時(shí)選擇TCP連接方式,并單擊“啟動(dòng)”按鈕,可以得到的運(yùn)行結(jié)果如圖1.6所示。圖1.6服務(wù)器運(yùn)行結(jié)果3?6客戶端應(yīng)用程序3.6.1界面設(shè)計(jì)主要功能是連接服務(wù)器地址和端口,選擇socket類型和填寫登錄的用戶名。界面設(shè)計(jì)如圖1.7所示。ChatClientI亙…聊夬瞬器設(shè)置服務(wù)器端口:1編輯朋務(wù)器地址:1.連接服勞器丨關(guān)于丨CTCPCUDF斷開冊(cè)努器阿站1登陸用戶容:|編輯聊天記錄:岌送信息:11^退出1圖1.7客戶端應(yīng)用程序界面設(shè)計(jì)3.6.2控件的編輯與綁定控件的編輯與綁定如下表1.8所示。表1.8編輯框控件和變量綁定編輯控件的內(nèi)容ID類型變量名服務(wù)器端口IDC_EDITPORTCStringm_strPort聊天記錄IDC_EDIT_MSGRERCEitm_ctrlMsgRecord發(fā)送消息IDC_EDIT_MSGCEitm_ctrlMsg端口微調(diào)控件IDC_SPINPORTCSpinButtonCtrlm_ctrlSpinPort服務(wù)器地址IDC_IPADDRESSSVRCIPAddressCtrlm_ctrlIPAddr登錄用戶名IDC_EDIT_USERNAMECEitM_strUserName3.6.3定義類設(shè)計(jì)和實(shí)現(xiàn)類設(shè)計(jì)中的函數(shù)客戶端主要用于連接服務(wù)器,登錄用戶名后進(jìn)行通信。所以在本項(xiàng)目中客戶

端的主要功能封裝在兩個(gè)類中:CSocketComm類:該類負(fù)責(zé)網(wǎng)絡(luò)連接,信息轉(zhuǎn)發(fā)。CSocketManager類:該類負(fù)責(zé)端口的管理。3.6.4實(shí)現(xiàn)界面功能按鈕客戶機(jī)端的界面主要有3個(gè)功能按鈕:Socket類型:選擇連接方式TCP或UDP。連接服務(wù)器:?jiǎn)螕粼摪粹o,則自動(dòng)搜索局域網(wǎng)內(nèi)的服務(wù)器,如果有,則連接成功,可以進(jìn)行下一步通信操作。否則連接失敗。斷開服務(wù)器:?jiǎn)螕粼摪粹o,則停止發(fā)送斷開服務(wù)器的信號(hào)傳給服務(wù)器,告知服務(wù)器本地已經(jīng)放棄連接。發(fā)送:?jiǎn)螕粼摪粹o,則向服務(wù)器端發(fā)送一條信息,這條信息的轉(zhuǎn)發(fā)則由服務(wù)器負(fù)責(zé)。退出:退出客戶端系統(tǒng)。測(cè)試在啟動(dòng)客戶端程序之前,先保證ChatServer應(yīng)用程序已經(jīng)啟動(dòng)。具體操作步驟如下:?jiǎn)?dòng)服務(wù)器端程序,并將服務(wù)器端的Socket類型設(shè)置成為UDP或TCP模式,端口5000(默認(rèn)值)。啟動(dòng)客

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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)論