聊天程序開(kāi)發(fā)文檔_第1頁(yè)
聊天程序開(kāi)發(fā)文檔_第2頁(yè)
聊天程序開(kāi)發(fā)文檔_第3頁(yè)
聊天程序開(kāi)發(fā)文檔_第4頁(yè)
聊天程序開(kāi)發(fā)文檔_第5頁(yè)
已閱讀5頁(yè),還剩10頁(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、南 京 理 工 大 學(xué)紫金學(xué)院網(wǎng)絡(luò)編程技術(shù)報(bào)告作 者:學(xué) 號(hào):學(xué)院(系):計(jì)算機(jī)科學(xué)與技術(shù) 專(zhuān) 業(yè):網(wǎng)絡(luò)工程 題 目:多功能聊天程序 2013 年 12 月目 錄一、背景····································

2、;3二、系統(tǒng)功能········································4三、系統(tǒng)設(shè)計(jì)流程圖·······

3、·····························5四、系統(tǒng)模塊劃分···················

4、83;·················7五、詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)·······························

5、;···9六、總結(jié)體會(huì)········································19一. 背景 網(wǎng)絡(luò)聊天室通常直稱(chēng)聊天室,是一種人們可以在線交談的網(wǎng)

6、絡(luò)論壇,在同一聊天室的人們通過(guò)廣播消息進(jìn)行實(shí)時(shí)交談。聊天室可以建立在即時(shí)通訊軟件(如MSN Messenger、QQ)、P2P軟件、萬(wàn)維網(wǎng)(如 Halapo,Meebo ) 等基礎(chǔ)上,萬(wàn)維網(wǎng)方式更為普通和種類(lèi)繁多,交談的手段不局限于文本,更包括語(yǔ)音、視頻。通常聊天室是按照房間或頻道為單位的,在同一房間或頻道的網(wǎng)人可以實(shí)時(shí)地廣播和閱讀公開(kāi)消息。一般情況下,與其它網(wǎng)絡(luò)論壇、即時(shí)通訊不同的是,聊天室不保存聊天記錄。1.1課題背景及意義當(dāng)今世界正處于信息時(shí)代,計(jì)算機(jī)和通信網(wǎng)絡(luò)是這一時(shí)代所謂“信息基礎(chǔ)設(shè)施”。在互聯(lián)網(wǎng)相當(dāng)普及的今天,在互聯(lián)網(wǎng)上聊天對(duì)很多“網(wǎng)蟲(chóng)”來(lái)說(shuō)已經(jīng)是家常便飯了。聊天室程序可以說(shuō)是網(wǎng)上

7、最簡(jiǎn)單的多點(diǎn)通信程序。一個(gè)簡(jiǎn)單的聊天室, 從程序員的觀點(diǎn)來(lái)看就是在多個(gè)I/O端點(diǎn)之間實(shí)現(xiàn)多對(duì)多的通信。基于SOCKET的局域網(wǎng)通信是一種靈活的、易于實(shí)現(xiàn)的、低成本的方法。它可以運(yùn)行在各種使用TCP/IP協(xié)議作為通訊協(xié)議的網(wǎng)絡(luò)上。而在SOCKET API的幫助下,開(kāi)發(fā)基于SOCKET的局域網(wǎng)通信軟件也是易于實(shí)現(xiàn)的。1.2 實(shí)驗(yàn)平臺(tái)介紹Visual C+(簡(jiǎn)稱(chēng)VC)是Microsoft公司推出的目前使用極為廣泛的基于Windows平臺(tái)的C+可視化開(kāi)發(fā)環(huán)境。VC基于C,C+語(yǔ)言,主要由是MFC組成,是與系統(tǒng)聯(lián)系非常緊密的編程工具,它兼有高級(jí),和低級(jí)語(yǔ)言的雙重性,功能強(qiáng)大,靈活,執(zhí)行效率高,幾乎可說(shuō)V

8、C在 Windows平臺(tái)無(wú)所不能。VC主要是針對(duì)Windows系統(tǒng),適合一些系統(tǒng)級(jí) 的開(kāi)發(fā),可以方便實(shí)現(xiàn)一些底層 的調(diào)用。在VC里邊嵌入?yún)R編語(yǔ)言很簡(jiǎn)單。當(dāng)對(duì)系統(tǒng)性能要求很高的時(shí)候,可用VC開(kāi)發(fā)。VC在多線程、網(wǎng)絡(luò)通信、分布應(yīng)用方面,有著不可比擬的優(yōu)勢(shì)。1.3 可行性分析本課程設(shè)計(jì)主要解決在客戶(hù)端于客戶(hù)端的信息交換和客戶(hù)端于服務(wù)器的信息交換及服務(wù)器的信息處理上的管理的課程設(shè)計(jì)。此程序主要分為兩部分:服務(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ù)

9、器端的成員列表欄中會(huì)顯示在線的所有人名單,有人退出聊天室,成員列表會(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ò)通訊聊天。 先啟動(dòng)服務(wù)器端聊天程序,這是聊天服務(wù)器需要指定一個(gè)端口號(hào),客戶(hù)端則根據(jù)這個(gè)端口號(hào)以及服務(wù)器的網(wǎng)絡(luò)地址與服務(wù)器進(jìn)行通信。在這里,把端口號(hào)成為“聊天頻道” 。在后面的程序代碼分析中將看到,端口號(hào)并不等同于聊天頻道,而是在聊天頻道上增加一個(gè)固定的偏移值,使得這個(gè)聊天頻道不會(huì)和系統(tǒng)保留的端口發(fā)生沖突。 服務(wù)器啟動(dòng)后將在這個(gè)指定的端口號(hào)中等待客戶(hù)的連接。對(duì)于公共聊天室,服務(wù)器對(duì)客

10、戶(hù)的數(shù)目不做任何限制。而對(duì)于私人聊天室,每個(gè)聊天頻道則只能允許兩個(gè)客戶(hù)互相連接,使得一方發(fā)送的信息只能到達(dá)對(duì)方的主機(jī)中。這里的服務(wù)器提供的是公共聊天服務(wù)。 通過(guò)分析發(fā)現(xiàn),該程序完全可以通過(guò)Visual C+中MFC完成。二需求分析2.1 設(shè)計(jì)目的綜合運(yùn)用本課程及計(jì)算機(jī)網(wǎng)絡(luò)的相關(guān)知識(shí)設(shè)計(jì)并實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)應(yīng)用程序,以作為開(kāi)發(fā)平臺(tái),通過(guò)實(shí)踐復(fù)習(xí)鞏固課堂所學(xué)的理論知識(shí),提高對(duì)所學(xué)知識(shí)的綜合應(yīng)用能力。2.2 設(shè)計(jì)要求 采用客戶(hù)/服務(wù)器模式,分為客戶(hù)端程序和服務(wù)器端程序。服務(wù)器采用WINSOCK I/O模型中的任一種,支持多個(gè)客戶(hù)同時(shí)在線聊天??蛻?hù)端程序和服務(wù)器程序通過(guò)網(wǎng)絡(luò)交換聊天字符串內(nèi)容,服務(wù)器窗口的列

11、表框中顯示當(dāng)前在線用戶(hù),支持客戶(hù)端之間的私聊(可以通過(guò)服務(wù)器中轉(zhuǎn),或考慮UDP打洞直接建立端端連接)。課程設(shè)計(jì)要求設(shè)計(jì)并編程完成兩個(gè)方面的內(nèi)容:首先建立一個(gè)使用TCP協(xié)議的聊天室服務(wù)器,這個(gè)服務(wù)器可以同時(shí)支持多個(gè)用戶(hù)的在線聊天;其次設(shè)計(jì)一個(gè)可以和服務(wù)器通信的聊天室客戶(hù)端。2.3 功能要求² 支持多個(gè)客戶(hù)端的連接,在服務(wù)器和多個(gè)客戶(hù)端之間進(jìn)行數(shù)據(jù)傳輸;² 接收客戶(hù)端發(fā)送的消息,并顯示在一個(gè)列表框中;² 在用戶(hù)連接上后有提示,顯示出連接的用戶(hù)名字;² 發(fā)送信息時(shí)可以顯示聊天的所有記錄;2.4 系統(tǒng)主要功能和主要功能描述:服務(wù)器端聊天程序必須能夠做3件事情:(

12、1) 服務(wù)器聊天程序要在待定的端口上等待來(lái)自聊天客戶(hù)的連接請(qǐng)求,并且需要維護(hù)一個(gè)客戶(hù)連接表,以記錄所有成功的連接。(2) 服務(wù)器聊天程序要及時(shí)接受從各個(gè)聊天客戶(hù)發(fā)送過(guò)來(lái)的信息,然后把這些信息轉(zhuǎn)發(fā)到一個(gè)或多個(gè)客戶(hù)連接。對(duì)于公共聊天室,服務(wù)器將把接受到的信息向除源端外的所有客戶(hù)發(fā)送過(guò)去。(3) 服務(wù)器還要監(jiān)控這些連接的狀態(tài),在客戶(hù)主動(dòng)離開(kāi)或發(fā)生故障時(shí)從列表中刪除相應(yīng)的表項(xiàng),并及時(shí)更新連接表。這些要求可以通過(guò)CSocket類(lèi)提供的功能實(shí)現(xiàn)。從CSocket派生出兩個(gè)類(lèi)CListenSocket和CClientSocket,它們分別用來(lái)偵聽(tīng)客戶(hù)的連接請(qǐng)求和建立與客戶(hù)的連接。服務(wù)器只需要一個(gè)偵聽(tīng)套接字C

13、ListenSocket,然后根據(jù)客戶(hù)的連接請(qǐng)求動(dòng)態(tài)創(chuàng)建客戶(hù)套接字CClientSocket??蛻?hù)套接字的數(shù)量是不可預(yù)知的,因此需要一個(gè)列表來(lái)記錄。MFC的CPtrList類(lèi)就能實(shí)現(xiàn)這種功能。客戶(hù)端聊天程序需要完成以下幾個(gè)功能:(1) 客戶(hù)端聊天程序要負(fù)責(zé)建立和維護(hù)與服務(wù)器的連接,通過(guò)獲取用戶(hù)的設(shè)置嘗試與服務(wù)器的連接,并且隨時(shí)檢測(cè)連接的狀態(tài)。(2) 客戶(hù)端聊天程序要把用戶(hù)輸入的信息及時(shí)發(fā)送到聊天服務(wù)器。一般情況下,當(dāng)用戶(hù)輸入一行信息并且按下回車(chē)鍵后聊天程序就要把這一行信息發(fā)送出去,才能及時(shí)地滿(mǎn)足用戶(hù)的交互需求。(3) 要隨時(shí)準(zhǔn)備好接受來(lái)自服務(wù)器的信息,隨時(shí)把接受到的信息顯示出來(lái),讓用戶(hù)及時(shí)看到

14、對(duì)方的響應(yīng)。(4) 在用戶(hù)退出聊天過(guò)程是要關(guān)閉與服務(wù)器的連接。比較好的做法是提前通知服務(wù)器或者直接給服務(wù)器發(fā)送一條退出通知,使得服務(wù)器能夠及時(shí)掌握客戶(hù)端的連接狀態(tài),把對(duì)方客戶(hù)的退出信息及時(shí)發(fā)送到對(duì)等實(shí)體上??蛻?hù)端聊天程序需要使用一個(gè)通過(guò)CSocket類(lèi)派生出來(lái)的CChatSocket類(lèi)來(lái)實(shí)現(xiàn)。該套接字用來(lái)發(fā)送一個(gè)與服務(wù)器的連接請(qǐng)求和維持與服務(wù)器的連接,發(fā)送和接收聊天信息,完成上述各項(xiàng)功能。三設(shè)計(jì)流程圖根據(jù)對(duì)用戶(hù)的要求及功能設(shè)置可以得到以下的流程圖,用戶(hù)首先啟動(dòng)客戶(hù)端,登陸服務(wù)器并向服務(wù)器發(fā)送信息,啟動(dòng)服務(wù)器,服務(wù)器等待客戶(hù)要求并向客戶(hù)反饋在線用戶(hù)信息,用戶(hù)向服務(wù)器發(fā)送信息,服務(wù)器處理用戶(hù)的數(shù)據(jù)

15、,然后用戶(hù)開(kāi)始聊天??蛻?hù)端的聊天分為對(duì)所有人的信息和私聊的信息,該信息應(yīng)通過(guò)程序控制分別進(jìn)行處理。啟動(dòng)登陸等待客戶(hù)端登陸客戶(hù)端用戶(hù)創(chuàng)建子套接字MessageCListenSocketCClientSocketMessage登陸成功連接上發(fā)送message顯示找到客戶(hù)端并顯示登陸失敗發(fā)送ID和IP三 系統(tǒng)模塊劃分圖1.系統(tǒng)模塊劃分圖服務(wù)器端:服務(wù)器等待用戶(hù)從主窗口發(fā)來(lái)的啟動(dòng)和接收消息的過(guò)程如下:首先,建立自己的套接口。在互聯(lián)網(wǎng)的進(jìn)程通信中,全局標(biāo)識(shí)一個(gè)進(jìn)程需要一個(gè)被稱(chēng)為“半相關(guān)”的三元組(協(xié)議,本地主機(jī)地址和本地端口號(hào))來(lái)描述;而一個(gè)完整的進(jìn)程通信實(shí)例,則需要一個(gè)被稱(chēng)為“相關(guān)”的五元組(協(xié)議,本

16、地主機(jī)地址,本地端口號(hào),遠(yuǎn)端主機(jī)地址和遠(yuǎn)端端口號(hào))來(lái)描述。s_sockfd=socket(AF_INET,SOCK_STREAM,0),該函數(shù)建立指定格式,數(shù)據(jù)類(lèi)型和協(xié)議下的套接口。地址格式為AF_INET(唯一支持的格式);數(shù)據(jù)類(lèi)型SOCK_STREAM表示建立流式套接口;第三個(gè)參數(shù)為0,即協(xié)議缺省。Bind(s_sockfd,(struct sockaddr*)&server,sizeof(server),該函數(shù)建立服務(wù)器本地的半相關(guān)。其中,server是sockaddr_in結(jié)構(gòu),其成員描述了本地端口號(hào)和本地主機(jī)地址,經(jīng)過(guò)bind()將服務(wù)器進(jìn)程在網(wǎng)上標(biāo)識(shí)出來(lái)。然后建立連接,先是

17、調(diào)用listen()函數(shù)表示開(kāi)始偵聽(tīng),再通過(guò)accept()調(diào)用等待接收連接。Listen(s_sockfd,2)表示連接請(qǐng)求隊(duì)列長(zhǎng)度為2,即允許有兩個(gè)請(qǐng)求。若有多于兩個(gè)請(qǐng)求,則出現(xiàn)錯(cuò)誤,給出錯(cuò)誤代碼。ns=accept(s_sockfd,(struct sockaddr*)& chent,& namelen), accept() 阻塞缺省等待請(qǐng)求隊(duì)列中的請(qǐng)求,一旦有連接請(qǐng)求來(lái)到,該函數(shù)就建立一個(gè)和s有相同屬性的新的套接口。Client也是一個(gè)sockaddr_in結(jié)構(gòu),連接建立時(shí)填入請(qǐng)求連接的套接口的半相關(guān)信息。然后,就可以接收和發(fā)送數(shù)據(jù)了。recv(ns,buf,1024,

18、0), send(ns,buf,pktlen,0)上面兩個(gè)函數(shù)分別負(fù)責(zé)接收和發(fā)送數(shù)據(jù)。recv從建立連接的套接口ns接收數(shù)據(jù)放入buf中;send則將buf中數(shù)據(jù)發(fā)送給ns。至于第四個(gè)參數(shù),表示該函數(shù)調(diào)用方式,可選擇NSG_DONTROUTE和MSG_OOB,0表示缺省。最后,關(guān)閉套接口??蛻?hù)端:客戶(hù)端等待用戶(hù)從主窗口發(fā)來(lái)的發(fā)送命令。一旦接收到發(fā)送數(shù)據(jù)請(qǐng)求,首先調(diào)用WSAStartup()函數(shù),初始化Windows Socket DLL,并檢查版本號(hào):Status=WSAStartup(VersionReqd,lpmyWSAData);其中,VersionReqd描述了WinSock的版本;l

19、pmyWSAData指向一個(gè)WSADATA結(jié)構(gòu),該結(jié)構(gòu)描述了Windows Sockets的實(shí)現(xiàn)細(xì)節(jié)。WSAStartup()之后,進(jìn)程通過(guò)主機(jī)名獲取主機(jī)地址:Hostaddr=gethostbyname(server_address);Hostaddr指向hostent結(jié)構(gòu),然后,進(jìn)程就不斷地消息循環(huán),等待用戶(hù)通過(guò)菜單選擇啟動(dòng)。這時(shí),通過(guò)調(diào)用Clinent(t)來(lái)啟動(dòng)套接口。在Clinent(t)中,首先也是調(diào)用socket()來(lái)建立套接口,為建立連接,必須立刻調(diào)用connect(),進(jìn)程發(fā)出連接請(qǐng)求后就不管了。當(dāng)連接建立好后,WINSOCKDLL自動(dòng)發(fā)出一條消息給窗口函數(shù),使程序運(yùn)行下去。

20、Connect(s_sockfd,(struct sockaddrFAR*)&dst_addr,sizedlf(dst_addr);窗口函數(shù)在收到UM_SOCK消息后,判斷是由哪個(gè)網(wǎng)絡(luò)事件引起的。第一次,必然是由連接事件引起的,這樣,就會(huì)執(zhí)行相應(yīng)的程序,同樣調(diào)用WSAASyncselect()來(lái)提名DWRITE事件,希望在套接口可發(fā)送數(shù)據(jù)時(shí)接收消息。在收到FD_WRITE消息時(shí),先調(diào)用send()發(fā)送數(shù)據(jù),在調(diào)用WSAASyncselect()來(lái)提名FD_READ事件,希望在套接口可接收數(shù)據(jù)時(shí)收到消息,在收到FD_READ消息時(shí),先調(diào)用recv()來(lái)接收數(shù)據(jù),再提名FD_WRITE事件

21、,如此循環(huán)下去,直到發(fā)生外部事件FD_CLOSE。這時(shí)就調(diào)用WSAAsyncselect(s,hwnd,0,0)來(lái)停止異步選擇。在窗口函數(shù)接收到WM_DESTROY消息時(shí),先調(diào)用closesocket()來(lái)關(guān)閉套接口,再調(diào)用WSACleanup()終止Windows sockets Dll,并釋放資源四 詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)1. 客戶(hù)端1.1用戶(hù)登錄模塊設(shè)計(jì)BEGIN_MESSAGE_MAP(CMainBordApp, CWinApp)ON_COMMAND(ID_HELP, CWinApp:OnHelp)END_MESSAGE_MAP()CMainBordApp:CMainBordApp()CMainBordApp theApp;BOOL CMainBordApp:InitInstance()if (!AfxSocketInit()AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;AfxEnableControlContainer();#ifdef _AFXDLLEnable3dControls();#elseEnable3dContr

溫馨提示

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