計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-簡(jiǎn)單的即時(shí)通信軟件_第1頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-簡(jiǎn)單的即時(shí)通信軟件_第2頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-簡(jiǎn)單的即時(shí)通信軟件_第3頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-簡(jiǎn)單的即時(shí)通信軟件_第4頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-簡(jiǎn)單的即時(shí)通信軟件_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

課程設(shè)計(jì)報(bào)告2014—2015學(xué)年第一學(xué)期課程名稱計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)題目簡(jiǎn)單的即時(shí)通信軟件目錄TOC\o"1-2"\h\u69441關(guān)于即時(shí)通信軟件的簡(jiǎn)介 關(guān)于即時(shí)通信軟件的簡(jiǎn)介即時(shí)通信(InstantMessaging,IM)是一個(gè)終端服務(wù),允許兩人或多人使用網(wǎng)路即時(shí)的傳遞文字、圖片、語音信息甚至視頻交流。即時(shí)通信軟件就是通過即時(shí)通信技術(shù)來實(shí)現(xiàn)在線聊天、交流的軟件,目前最流行的有Anychat、騰訊QQ、MSN、ICQ、POPO、UC、Skype等。通過即時(shí)通信功能,你可以知道你的好友是否正在線上,如果在線,可以與他們即時(shí)通信。即時(shí)通信比傳送電子郵件更具實(shí)時(shí)性,比打電話更直觀和經(jīng)濟(jì),無疑是網(wǎng)絡(luò)時(shí)代最方便的通訊方式。自1998年面世以來,特別是近幾年的迅速發(fā)展,即時(shí)通信的功能日益豐富,逐漸集成了電子郵件、博客、音樂、電視、游戲和搜索等多種功能。即時(shí)通信不再是一個(gè)單純的聊天工具,它已經(jīng)發(fā)展成集交流、資訊、娛樂、搜索、電子商務(wù)、辦公協(xié)作和企業(yè)客戶服務(wù)等為一體的綜合化信息平臺(tái)。隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展,互聯(lián)網(wǎng)即時(shí)通信也在向移動(dòng)化擴(kuò)張。目前,UcSTAR、微軟、AOL、Yahoo等重要即時(shí)通信提供商都提供通過手機(jī)接入互聯(lián)網(wǎng)即時(shí)通信的業(yè)務(wù),用戶可以通過手機(jī)與其他已經(jīng)安裝了相應(yīng)客戶端軟件的手機(jī)或電腦收發(fā)信息。產(chǎn)品最早的創(chuàng)始人是三個(gè)以色列青年,是他們?cè)?996年做出來的,取名叫ICQ。1998年當(dāng)ICQ注冊(cè)用戶數(shù)達(dá)到1200萬時(shí),被AOL看中,以2.87億美元的天價(jià)買走。目前ICQ有1億多用戶,主要市場(chǎng)在美洲和歐洲,已成為世界上最大的即時(shí)通信系統(tǒng)。即時(shí)通信最初是由AOL、微軟、雅虎、騰訊等獨(dú)立于電信運(yùn)營(yíng)商的即時(shí)通信服務(wù)商提供的。但隨著其功能日益豐富、應(yīng)用日益廣泛,特別是即時(shí)通信增強(qiáng)軟件的某些功能如IP電話等,已經(jīng)在分流和替代傳統(tǒng)的電信業(yè)務(wù),使得電信運(yùn)營(yíng)商不得不采取措施應(yīng)對(duì)這種挑戰(zhàn)。2006年6月,中國(guó)移動(dòng)已經(jīng)推出了自己的即時(shí)通信工具——Fetion,中國(guó)聯(lián)通也將推出即時(shí)通訊工具“超信”,但由于進(jìn)入市場(chǎng)較晚,其用戶規(guī)模和品牌知名度還比不上原有的即時(shí)通信服務(wù)提供商?,F(xiàn)在國(guó)內(nèi)的即時(shí)通信工具主要有:Anychat、UCSTAR、E話通、QQ、UC、商務(wù)通、網(wǎng)易泡泡、盛大圈圈、淘寶旺旺等等。近年來,隨著全球信息化的不斷發(fā)展,網(wǎng)絡(luò)也在飛速發(fā)展。出于高效、快速地處理各種事務(wù)的目的,越來越多的企業(yè)在其內(nèi)部使用局域網(wǎng)來進(jìn)行工作。在內(nèi)部局域網(wǎng)的幫助下,企業(yè)得以簡(jiǎn)化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的擴(kuò)大,業(yè)務(wù)量的增加,企業(yè)內(nèi)部的信息越來越私密,企業(yè)只希望員工通過內(nèi)部局域網(wǎng)進(jìn)行溝通與交流,避免企業(yè)內(nèi)部機(jī)密通過Internet泄露到外部。為了解決上述矛盾,人們提出了開發(fā)局域網(wǎng)聊天軟件的構(gòu)想,通過局域網(wǎng)聊天軟件,企業(yè)員工可以隨時(shí)的進(jìn)行即時(shí)消息傳遞,召開網(wǎng)絡(luò)會(huì)議等,有利于提高工作效率,同時(shí)又保護(hù)了企業(yè)內(nèi)部信息的安全。隨著用戶對(duì)軟件功能的需求不斷提高,即時(shí)通訊的產(chǎn)品也不斷地更新?lián)Q代。即時(shí)通訊的發(fā)展不論是在基礎(chǔ)應(yīng)用方面還是在擴(kuò)展應(yīng)用方面都有著飛躍。本次課程設(shè)計(jì)做的是基于局域網(wǎng)的聊天室,用VC++編寫的程序,程序?qū)崿F(xiàn)一般的文字聊天功能,可作為某局域網(wǎng)的交流工具。本系統(tǒng)采用基于Socket的方法實(shí)現(xiàn)局域網(wǎng)通信,基于Socket的局域網(wǎng)通信軟件可以為企業(yè)原有的局域網(wǎng)提供一種良好,安全,快速的通信機(jī)制。它的實(shí)現(xiàn)無需對(duì)企業(yè)原有的局域網(wǎng)硬件進(jìn)行任何改動(dòng),具有實(shí)現(xiàn)成本低廉的優(yōu)點(diǎn),它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求。基于Socket的局域網(wǎng)聊天工具很好地詮釋了Socket通信的原理,并且在企業(yè)內(nèi)部通信、教學(xué)、討論等應(yīng)用中都具有一定的實(shí)用價(jià)值。它具有信息收發(fā)速度快,保密性好,占用網(wǎng)絡(luò)帶寬資源低,占用服務(wù)器吞吐能力低,易于編程實(shí)現(xiàn)等優(yōu)點(diǎn)?;赟ocket的局域網(wǎng)通信軟件應(yīng)用范圍廣闊,不但可以處理傳統(tǒng)的通信需求,而且也能擴(kuò)展以適應(yīng)新型的網(wǎng)絡(luò)應(yīng)用,如網(wǎng)絡(luò)教育,數(shù)據(jù)影音傳輸?shù)?,擁有廣泛的應(yīng)用前景。如今基于局域網(wǎng)的即時(shí)通信工具一般采用UDP或者TCP協(xié)議體系來實(shí)現(xiàn),開發(fā)技術(shù)已經(jīng)比較成熟。UDP的實(shí)時(shí)性比較好,但是不一定提供可靠的數(shù)據(jù)傳輸,TCP可以提供可靠的數(shù)據(jù)傳輸,本次課程設(shè)計(jì)采用TCP完成局域網(wǎng)聊天室的設(shè)計(jì)。2開發(fā)環(huán)境的介紹VisualC++6.0由Microsoft開發(fā),它不僅是一個(gè)C++編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrateddevelopmentenvironment,IDE)。VisualC++6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lassWizard等開發(fā)工具。這些組件通過一個(gè)名為DeveloperStudio的組件集成為和諧的開發(fā)環(huán)境。Microsoft的主力軟件產(chǎn)品。VisualC++是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出VisualC++1.0后,隨著其新版本的不斷問世,VisualC++已成為專業(yè)程序員進(jìn)行軟件開發(fā)的首選工具。雖然微軟公司推出了VisualC++.NET(VisualC++7.0),但它的應(yīng)用有很大的局限性,只適用于Windows2000,WindowsXP和WindowsNT4.0。所以實(shí)際中,更多的是以VisualC++6.0為平臺(tái)。VisualC++6.0以擁有“語法高亮”,自動(dòng)編譯功能以及高級(jí)除錯(cuò)功能而著稱。比如,它允許用戶進(jìn)行遠(yuǎn)程調(diào)試,單步執(zhí)行等。還有允許用戶在調(diào)試期間重新編譯被修改的代碼,而不必重新啟動(dòng)正在調(diào)試的程序。其編譯及創(chuàng)建預(yù)編譯頭文件(stdafx.h)、最小重建功能及累加連結(jié)(link)著稱。這些特征明顯縮短程序編輯、編譯及連結(jié)的時(shí)間花費(fèi),在大型軟件計(jì)劃上尤其顯著。本次課程設(shè)計(jì)采用的框架是MFC。MFC不僅僅是人們通常理解的一個(gè)類庫(kù),如果選擇了MFC,也就選擇了一種程序結(jié)構(gòu),一種編程風(fēng)格。MFC是一個(gè)很大的、擴(kuò)展了的C++類層次結(jié)構(gòu),它能使開發(fā)Windows應(yīng)用程序變得更加容易。MFC在整個(gè)Windows家族中都是兼容的,也就是說,無論是Windows3.x、Windows95還是windowsNT,所使用的MFC都是兼容的。每當(dāng)新的windows版本出現(xiàn)時(shí),MFC也會(huì)得到修改以便使舊的編譯器和代碼能在新的系統(tǒng)中工作。使用MFC的最大優(yōu)點(diǎn)是它為人們做了所有最難做的事。MFC中包含了成千上萬行正確、優(yōu)化和功能強(qiáng)大的Windows代碼。程序中所調(diào)用的很多成員函數(shù)完成了人們自己可能很難完成的工作,從這點(diǎn)上講,MFC極大地加快了本次課程設(shè)計(jì)的速度。3有關(guān)協(xié)議的介紹3.1什么是TCP協(xié)議TCP是一種面向連接(連接導(dǎo)向)的、可靠的、基于字節(jié)流的運(yùn)輸層(Transportlayer)通信協(xié)議。在簡(jiǎn)化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成第四層傳輸層所指定的功能。在因特網(wǎng)協(xié)議族(Internetprotocolsuite)中,TCP層是位于IP層之上,應(yīng)用層之下的中間層。不同主機(jī)的應(yīng)用層之間經(jīng)常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機(jī)制,而是提供不可靠的包交換。應(yīng)用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)?、?位字節(jié)表示的數(shù)據(jù)流,然后TCP把數(shù)據(jù)流分割成適當(dāng)長(zhǎng)度的報(bào)文段(通常受該計(jì)算機(jī)連接的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層的最大傳送單元(MTU)的限制)。之后TCP把結(jié)果包傳給IP層,由它來通過網(wǎng)絡(luò)將包傳送給接收端實(shí)體的TCP層。TCP為了保證不發(fā)生丟包,就給每個(gè)字節(jié)一個(gè)序號(hào),同時(shí)序號(hào)也保證了傳送到接收端實(shí)體的包的按序接收。然后接收端實(shí)體對(duì)已成功收到的字節(jié)發(fā)回一個(gè)相應(yīng)的確認(rèn)(ACK),如果發(fā)送端實(shí)體在合理的往返時(shí)延(RTT)內(nèi)未收到確認(rèn),那么對(duì)應(yīng)的數(shù)據(jù)(假設(shè)丟失了)將會(huì)被重傳。TCP用一個(gè)校驗(yàn)和函數(shù)來檢驗(yàn)數(shù)據(jù)是否有錯(cuò)誤,在發(fā)送和接收時(shí)都要計(jì)算校驗(yàn)和。3.2TCP協(xié)議的特點(diǎn)(1)面向連接的傳輸;(2)端到端的通信;(3)高可靠性,確保傳輸數(shù)據(jù)的正確性,不出現(xiàn)丟失或亂序;(4)全雙工方式傳輸;(5)采用字節(jié)流方式,即以字節(jié)為單位傳輸字節(jié)序列;(6)緊急數(shù)據(jù)傳送功能。3.3TCP的端口號(hào)TCP段結(jié)構(gòu)中端口地址都是16比特,可以有在0~65535范圍內(nèi)的端口號(hào)。對(duì)于這65536個(gè)端口號(hào)有以下的使用規(guī)定:(1)端口號(hào)小于256的定義為常用端口,服務(wù)器一般都是通過常用端口號(hào)來識(shí)別的。任何TCP/IP實(shí)現(xiàn)所提供的服務(wù)都用1~1023之間的端口號(hào),是由IANA來管理的;(2)客戶端只需保證該端口號(hào)在本機(jī)上是惟一的就可以了??蛻舳丝谔?hào)因存在時(shí)間很短暫又稱臨時(shí)端口號(hào);(3)大多數(shù)TCP/IP實(shí)現(xiàn)給臨時(shí)端口號(hào)分配1024~5000之間的端口號(hào)。大于5000的端口號(hào)是為其他服務(wù)器預(yù)留的。4有關(guān)Socket的介紹4.1什么是Socketsocket的英文原義是“孔”或“插座”。作為4BDSUNIX的進(jìn)程通信機(jī)制,取后一種意思。通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄。在Internet上的主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)。每種服務(wù)都打開一個(gè)Socket,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)。Socket正如其英文原意那樣,像一個(gè)多孔插座。Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。要學(xué)Internet上的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口。Socket接口設(shè)計(jì)者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網(wǎng)絡(luò)的Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個(gè)類似于打開文件的函數(shù)調(diào)用Socket(),該函數(shù)返回一個(gè)整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實(shí)現(xiàn)的。常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無連接的Socket,對(duì)應(yīng)于無連接的UDP服務(wù)應(yīng)用。最重要的是,socket是面向客戶/服務(wù)器模型而設(shè)計(jì)的,針對(duì)客戶和服務(wù)器程序提供不同的socket系統(tǒng)調(diào)用??蛻綦S機(jī)申請(qǐng)一個(gè)socket(相當(dāng)于一個(gè)想打電話的人可以在任何一臺(tái)入網(wǎng)電話上撥號(hào)呼叫),系統(tǒng)為之分配一個(gè)socket號(hào);服務(wù)器擁有全局公認(rèn)的socket,任何客戶都可以向它發(fā)出連接請(qǐng)求和信息請(qǐng)求(相當(dāng)于一個(gè)被呼叫的電話擁有一個(gè)呼叫方知道的電話號(hào)碼)。socket利用客戶/服務(wù)器模式巧妙地解決了進(jìn)程之間建立通信連接的問題。服務(wù)器socket半相關(guān)為全局所公認(rèn)非常重要。不妨考慮一下,兩個(gè)完全隨機(jī)的用戶進(jìn)程之間如何建立通信?假如通信雙方?jīng)]有任何一方的socket固定,就好比打電話的雙方彼此不知道對(duì)方的電話號(hào)碼,要通話是不可能的。4.2WinSocket的通信原理WinSock是一個(gè)基于Socket模型的API。WinSock在Windows98,WindowNT中使用。WinSock一般由兩部分組成:開發(fā)組件和運(yùn)行組件。開發(fā)組件是供程序員在windows環(huán)境下開發(fā)網(wǎng)絡(luò)應(yīng)用程序使用的,它包括應(yīng)用程序接口庫(kù)函數(shù)、頭文件和實(shí)現(xiàn)的文檔,其中最主要的是WINSOCK.H運(yùn)行組件是以動(dòng)態(tài)鏈接庫(kù)(DlL)來實(shí)現(xiàn)socket接口的。文件名為WINSOCK.DLL應(yīng)用程序在執(zhí)行時(shí)裝入它就能實(shí)現(xiàn)網(wǎng)絡(luò)通信功能。4.3設(shè)計(jì)網(wǎng)絡(luò)服務(wù)器的步驟1、初始化WindowsSocket2、創(chuàng)建一個(gè)監(jiān)聽的Socket3、設(shè)置服務(wù)器地址信息,并將監(jiān)聽端口綁定到這個(gè)地址上4、開始監(jiān)聽5、接受客戶端連接6、和客戶端通信7、結(jié)束服務(wù)并清理WindowsSocket和相關(guān)數(shù)據(jù),或者返回第4步5系統(tǒng)工作流程圖結(jié)束結(jié)束啟動(dòng)服務(wù)器啟動(dòng)是否成功啟動(dòng)客戶端啟動(dòng)是否成功登錄聊天退出聊天室退出服務(wù)器開始否否是是6程序部分函數(shù)及功能介紹6.1有關(guān)服務(wù)器的程序啟動(dòng)服務(wù)函數(shù):BOOLCServerDlg::StartService(void){ CServerAddressDlgservAddrDlg; //服務(wù)器地址和端口對(duì)話框 if(IDOK!=servAddrDlg.DoModal()) { returnFALSE; } //獲取服務(wù)器地址 in_addrservAdd; servAdd.S_un.S_addr=htonl(servAddrDlg.m_strServIP); //主機(jī)字節(jié)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié) CStringstrServIP=inet_ntoa(servAdd); //轉(zhuǎn)換為點(diǎn)格式 //創(chuàng)建CListenSocket對(duì)象 m_pListenSocket=newCListenSocket(this); //創(chuàng)建套接字 if(m_pListenSocket->Create(servAddrDlg.m_shServPort,SOCK_STREAM,strServIP)) { //開始監(jiān)聽 if(!m_pListenSocket->Listen()) { deletem_pListenSocket; m_pListenSocket=NULL; AfxMessageBox(_T("創(chuàng)建套接字失??!")); returnFALSE; } }else { deletem_pListenSocket; m_pListenSocket=NULL; AfxMessageBox(_T("創(chuàng)建套接字失??!")); returnFALSE; } returnTRUE;}接受客戶端請(qǐng)求函數(shù):voidCServerDlg::ProcessPendingAccept(void){ CClientSocket*pClient=newCClientSocket(this);//創(chuàng)建實(shí)例 SOCKADDR_IN clientAddr; intsocketLen=sizeof(SOCKADDR_IN); m_pListenSocket->Accept(*pClient,(SOCKADDR*)&clientAddr,&socketLen);//接受客戶端的連接 pClient->Init(); //初始化 pClient->SaveUserInfo(clientAddr); //保存用戶的地址 m_csChatterList.Lock(); m_ChatterList.AddTail(pClient); //加入在線用戶鏈表 m_csChatterList.Unlock();}初始化用戶列表函數(shù):voidCServerDlg::InitUserList(void){ LoadUserList(m_UserList);//讀取用戶信息 //遍歷鏈表的每個(gè)節(jié)點(diǎn),讀取數(shù)據(jù),初始化用戶列表 POSITIONpos; intnLine=0; for(pos=m_UserList.GetHeadPosition();NULL!=pos;) { CUserInfo*pUserInfo=(CUserInfo*)m_UserList.GetNext(pos); if(NULL!=pUserInfo) { m_ctlUserList.InsertItem(nLine,pUserInfo->m_strName,1); //名稱,用戶初始化為離線狀態(tài) m_ctlUserList.SetItemText(nLine,1,pUserInfo->m_strPassword); //密碼 in_addruserAddr; userAddr.S_un.S_addr=(long)pUserInfo->m_lIP; CStringstrUserAddr(inet_ntoa(userAddr)); //IP m_ctlUserList.SetItemText(nLine,2,strUserAddr); CStringstrUserPort; //端口 strUserPort.Format("%d",ntohs(pUserInfo->m_nPort)); m_ctlUserList.SetItemText(nLine,3,strUserPort); CStringstrUserTime=pUserInfo->m_time.Format("%c"); //端口 m_ctlUserList.SetItemText(nLine,4,strUserTime); nLine++; } }}保存用戶信息函數(shù):voidCServerDlg::SaveUserList(CObList&obList){ charappPath[256]; GetCurrentDirectory(256,appPath); //取得應(yīng)用程序當(dāng)前路徑 CStringfilePath; //保存Ini文件名 filePath.Format("%s",appPath); filePath+="\\"; filePath+=USERLISTINI; //刪除原來的文件 DeleteFile(filePath); POSITION pos; int nIndex=0; //遍歷整個(gè)用戶鏈表 for(pos=obList.GetHeadPosition();pos!=NULL;) { //獲取數(shù)據(jù) CUserInfo*pUserInfo=(CUserInfo*)obList.GetNext(pos);//用戶信息 if(NULL==pUserInfo) { break; } CStringstrSection("section"); //section CStringstrIndex; strIndex.Format("%d",nIndex); strSection+=strIndex; in_addruserAddr; userAddr.S_un.S_addr=(long)pUserInfo->m_lIP; CStringstrUserAddr(inet_ntoa(userAddr)); //用戶IP CStringstrUserPort; //用戶端口 strUserPort.Format("%d",pUserInfo->m_nPort); CStringstrUserTime; //用戶登錄線時(shí)間 strUserTime.Format("%ld",(long)pUserInfo->m_time.GetTime()); //寫用戶名字 WritePrivateProfileString(strSection,_T("Name"),pUserInfo->m_strName,filePath); //寫用戶密碼 WritePrivateProfileString(strSection,_T("Password"),pUserInfo->m_strPassword,filePath); //寫用戶地址 WritePrivateProfileString(strSection,_T("Address"),strUserAddr,filePath); //寫用戶端口 WritePrivateProfileString(strSection,_T("Port"),strUserPort,filePath); //寫用時(shí)間 WritePrivateProfileString(strSection,_T("Time"),strUserTime,filePath); deletepUserInfo;//刪除對(duì)象 pUserInfo=NULL; nIndex++; } obList.RemoveAll();//刪除鏈表所有節(jié)點(diǎn)}6.2有關(guān)客戶端的程序設(shè)計(jì)用戶登錄成功時(shí)的圖標(biāo)為:設(shè)計(jì)用戶離線時(shí)的圖標(biāo)為:連接服務(wù)器的函數(shù):BOOLCClientDlg::ConnectToServer(void){ //創(chuàng)建CChatSocket對(duì)象 m_pSocket=newCChatSocket(this); if(!m_pSocket->Create())//創(chuàng)建套接字,綁定,注冊(cè)網(wǎng)絡(luò)事件 { deletem_pSocket; m_pSocket=NULL; AfxMessageBox(_T("創(chuàng)建套接字失??!")); returnFALSE; } m_pFile=newCSocketFile(m_pSocket); //創(chuàng)建CSocketFile對(duì)象 m_pArchiveIn=newCArchive(m_pFile,CArchive::load); //創(chuàng)建讀入文檔對(duì)象 CClientLoginDlgloginDlg(this);//登錄對(duì)話框 if(IDOK==loginDlg.DoModal()) { //服務(wù)器端口 SHORTshServPort=(SHORT)atoi((LPCTSTR)loginDlg.m_strServerPort); m_servAddr.sin_family=AF_INET; //地址家族 m_servAddr.sin_addr.S_un.S_addr=htonl((u_long)loginDlg.m_dwIP); //地址 m_servAddr.sin_port=htons(shServPort); //端口 //連接服務(wù)器 while(!m_pSocket->Connect((SOCKADDR*)&m_servAddr,sizeof(m_servAddr))) { if(AfxMessageBox(_T("連接服務(wù)器失敗,是否再次嘗試連接。"),MB_YESNO)==IDNO) { returnFALSE; } } //獲取本機(jī)套接字地址 SOCKADDR_INhostAddr; intnSockaddLen=sizeof(SOCKADDR_IN); m_pSocket->GetSockName((SOCKADDR*)&hostAddr,&nSockaddLen); m_hostAddr.sin_addr.S_un.S_addr=hostAddr.sin_addr.S_un.S_addr;//主機(jī)地址 CChatPacketpacket; //數(shù)據(jù)包 packet.m_type=CChatPacket::USERLIST; //類型 packet.m_UserInfo.m_strName=loginDlg.m_strName; //名稱 packet.m_UserInfo.m_strPassword=loginDlg.m_strPassword; //密碼 packet.m_UserInfo.m_eStatus=CUserInfo::LOGIN; //用戶狀態(tài) packet.m_UserInfo.m_lIP=hostAddr.sin_addr.S_un.S_addr; //IP packet.m_UserInfo.m_nPort=m_hostAddr.sin_port; //端口 packet.m_UserInfo.m_time=CTime::GetCurrentTime(); //登錄時(shí)間 m_UserInfo=packet.m_UserInfo; //保存用戶信息 //請(qǐng)求用戶列表 SendPacket(packet); returnTRUE; }else { returnFALSE; }}監(jiān)聽函數(shù):BOOLCClientDlg::BegingListen(void){ m_pListenSocket=newCListenSocket(this); //創(chuàng)建監(jiān)聽對(duì)象 if(m_pListenSocket->Create()) //創(chuàng)建綁定套接字 { if(!m_pListenSocket->Listen()) //開始監(jiān)聽 { deletem_pListenSocket; m_pListenSocket=NULL; AfxMessageBox(_T("創(chuàng)建套接字失?。?)); r

溫馨提示

  • 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)論