聊天程序開發(fā)文檔_第1頁
聊天程序開發(fā)文檔_第2頁
聊天程序開發(fā)文檔_第3頁
聊天程序開發(fā)文檔_第4頁
聊天程序開發(fā)文檔_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、南 京 理 工 大 學紫金學院網絡編程技術報告作 者:學 號:學院(系):計算機科學與技術 專 業(yè):網絡工程 題 目:多功能聊天程序 2013 年 12 月目 錄一、背景····································

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

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

4、83;·················7五、詳細設計及實現(xiàn)·······························

5、;···9六、總結體會········································19一. 背景 網絡聊天室通常直稱聊天室,是一種人們可以在線交談的網

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

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

8、C在 Windows平臺無所不能。VC主要是針對Windows系統(tǒng),適合一些系統(tǒng)級 的開發(fā),可以方便實現(xiàn)一些底層 的調用。在VC里邊嵌入?yún)R編語言很簡單。當對系統(tǒng)性能要求很高的時候,可用VC開發(fā)。VC在多線程、網絡通信、分布應用方面,有著不可比擬的優(yōu)勢。1.3 可行性分析本課程設計主要解決在客戶端于客戶端的信息交換和客戶端于服務器的信息交換及服務器的信息處理上的管理的課程設計。此程序主要分為兩部分:服務器端和客戶端。服務器端用于提供一個網絡端口,等待客戶端發(fā)出請求,登錄到此服務端,然后進行網絡通訊和消息的轉發(fā);客戶端可通過服務器端的IP地址發(fā)送連接請求,然后登陸聊天室。在服務

9、器端的成員列表欄中會顯示在線的所有人名單,有人退出聊天室,成員列表會自動除名。服務器端同時也提供了成員之間的私聊功能,此時服務器端作為一個轉發(fā)站,進行消息的轉發(fā)。整個程序的主體使用了CSocket類的方法,實現(xiàn)了網絡通訊聊天。 先啟動服務器端聊天程序,這是聊天服務器需要指定一個端口號,客戶端則根據(jù)這個端口號以及服務器的網絡地址與服務器進行通信。在這里,把端口號成為“聊天頻道” 。在后面的程序代碼分析中將看到,端口號并不等同于聊天頻道,而是在聊天頻道上增加一個固定的偏移值,使得這個聊天頻道不會和系統(tǒng)保留的端口發(fā)生沖突。 服務器啟動后將在這個指定的端口號中等待客戶的連接。對于公共聊天室,服務器對客

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

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

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

13、ListenSocket,然后根據(jù)客戶的連接請求動態(tài)創(chuàng)建客戶套接字CClientSocket??蛻籼捉幼值臄?shù)量是不可預知的,因此需要一個列表來記錄。MFC的CPtrList類就能實現(xiàn)這種功能??蛻舳肆奶斐绦蛐枰瓿梢韵聨讉€功能:(1) 客戶端聊天程序要負責建立和維護與服務器的連接,通過獲取用戶的設置嘗試與服務器的連接,并且隨時檢測連接的狀態(tài)。(2) 客戶端聊天程序要把用戶輸入的信息及時發(fā)送到聊天服務器。一般情況下,當用戶輸入一行信息并且按下回車鍵后聊天程序就要把這一行信息發(fā)送出去,才能及時地滿足用戶的交互需求。(3) 要隨時準備好接受來自服務器的信息,隨時把接受到的信息顯示出來,讓用戶及時看到

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

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

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

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

18、0), send(ns,buf,pktlen,0)上面兩個函數(shù)分別負責接收和發(fā)送數(shù)據(jù)。recv從建立連接的套接口ns接收數(shù)據(jù)放入buf中;send則將buf中數(shù)據(jù)發(fā)送給ns。至于第四個參數(shù),表示該函數(shù)調用方式,可選擇NSG_DONTROUTE和MSG_OOB,0表示缺省。最后,關閉套接口??蛻舳耍嚎蛻舳说却脩魪闹鞔翱诎l(fā)來的發(fā)送命令。一旦接收到發(fā)送數(shù)據(jù)請求,首先調用WSAStartup()函數(shù),初始化Windows Socket DLL,并檢查版本號:Status=WSAStartup(VersionReqd,lpmyWSAData);其中,VersionReqd描述了WinSock的版本;l

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

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

21、,如此循環(huán)下去,直到發(fā)生外部事件FD_CLOSE。這時就調用WSAAsyncselect(s,hwnd,0,0)來停止異步選擇。在窗口函數(shù)接收到WM_DESTROY消息時,先調用closesocket()來關閉套接口,再調用WSACleanup()終止Windows sockets Dll,并釋放資源四 詳細設計及實現(xiàn)1. 客戶端1.1用戶登錄模塊設計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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論