網(wǎng)絡(luò)編程_基于TCP的簡(jiǎn)易聊天室_實(shí)驗(yàn)報(bào)告_第1頁(yè)
網(wǎng)絡(luò)編程_基于TCP的簡(jiǎn)易聊天室_實(shí)驗(yàn)報(bào)告_第2頁(yè)
網(wǎng)絡(luò)編程_基于TCP的簡(jiǎn)易聊天室_實(shí)驗(yàn)報(bào)告_第3頁(yè)
網(wǎng)絡(luò)編程_基于TCP的簡(jiǎn)易聊天室_實(shí)驗(yàn)報(bào)告_第4頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、下載可編輯網(wǎng)絡(luò)編程課程設(shè)計(jì)說明書題目名稱:基于 TCP/IP 的網(wǎng)絡(luò)文字聊天程序設(shè)計(jì)專業(yè):網(wǎng)絡(luò)工程.專業(yè) .整理 .下載可編輯班級(jí):1201班學(xué)號(hào):1220140105姓名:蔣星指導(dǎo)老師:利平完成日期:2014年12月13日.專業(yè) .整理 .下載可編輯目錄一、實(shí)驗(yàn)基本信息概要31. 題目要求 32. 題目容33. 開發(fā)環(huán)境 3二、流程圖4三、系統(tǒng)簡(jiǎn)介51. 界面 52. 軟件功能 53. 系統(tǒng)設(shè)計(jì) 94. 優(yōu)點(diǎn)與缺點(diǎn)9四、系統(tǒng)詳細(xì)設(shè)計(jì)111.ChatServer類 112.ChatClient類133.SocketException類155. 命令協(xié)議 156. 消息格式 16五、 系統(tǒng)測(cè)試1

2、61.服務(wù)器使用錯(cuò)誤162.客戶端使用錯(cuò)誤173.啟動(dòng)服務(wù)器174.啟動(dòng)客戶端175.關(guān)閉客戶端176.啟動(dòng)服務(wù)器錯(cuò)誤提示187. 公開聊天 188. 私聊 189. 錯(cuò)誤的私聊1910. 更名2011. 幫助2012. 非法指令2013. 非法的指令參數(shù)2014. 連接服務(wù)器失敗21六、心得體會(huì)21七、完整代碼21Charserverd.cpp 服務(wù)器 main 函數(shù)文件 21ChatServer.h服務(wù)器類頭文件22ChatServer.cpp服務(wù)器類 23ClientInfo.h客戶信息類 33Charclientd.cpp客戶端 main 函數(shù) 34ChatClient.h客戶端頭文件

3、34ChatClient.cpp客戶端類 35InitSock.cpp初始化 WINSOCK類41.專業(yè) .整理 .下載可編輯SockException.h異常類41八、 參考文獻(xiàn) 42.專業(yè) .整理 .下載可編輯一、實(shí)驗(yàn)基本信息概要1.題目要求1、開發(fā)平臺(tái)Visual C+ 6.0。2 、對(duì)設(shè)計(jì)方法的要求使用 Visual C+ 6.0開發(fā)出在Windows 控制臺(tái)或圖形界面下運(yùn)行的程序。3 、對(duì)設(shè)計(jì)容的要求 實(shí)現(xiàn)網(wǎng)絡(luò)文字聊天程序的服務(wù)器端。 實(shí)現(xiàn)網(wǎng)絡(luò)文字聊天程序的客戶端。 主程序的結(jié)構(gòu)和流程。 程序運(yùn)行過程的截圖。 網(wǎng)絡(luò)文字聊天程序的實(shí)現(xiàn)原理。 網(wǎng)絡(luò)文字聊天程序?qū)崿F(xiàn)代碼的分析。4 、對(duì)課程

4、設(shè)計(jì)說明書的要求 設(shè)計(jì)思路與開發(fā)過程。 對(duì)主要代碼段要有較詳細(xì)的注釋。 對(duì)本次設(shè)計(jì)的評(píng)價(jià)、設(shè)計(jì)的收獲與建議。5 、說明書為打印件2. 題目容容概要: 實(shí)現(xiàn)網(wǎng)絡(luò)文字聊天程序的基本功能。3. 開發(fā)環(huán)境操作系統(tǒng): Windows 7開發(fā)語言: C+集成開發(fā)環(huán)境:Microsoft Visual Studio 2010.專業(yè) .整理 .下載可編輯二、流程圖.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編

5、輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯.專業(yè) .整理 .下載可編輯三、系統(tǒng)簡(jiǎn)介1. 界面本軟件使用DOS控制臺(tái)界面,界面風(fēng)格較為樸素。服務(wù)器:客戶端:.專業(yè) .整理 .下載可編輯2. 軟件功能本軟件實(shí)現(xiàn)了聊天室基本的功能,包括公開聊天,私聊,獲取在線用戶,更改昵稱,獲得幫助等。1)公開聊天在光標(biāo)處直接輸入消息后按回車即為發(fā)送公開聊天,如下圖所示。.專業(yè) .整理 .下載可編輯2)私聊使用命令 【 /m對(duì)方 UID 消息】即可發(fā)送私聊, 私聊只有對(duì)方可以看到,如下圖所示:客戶端 1,密聊 UID 為 132 的用戶。發(fā)送后

6、.專業(yè) .整理 .下載可編輯客戶端 2,UID 為 132 的用戶收到私聊消息。3)獲取在線用戶列表使用命令【 /list】即可獲得在線用戶列表,用戶列表會(huì)議系統(tǒng)消息的方式返回,如下圖所示。命令.專業(yè) .整理 .下載可編輯發(fā)送后4)更改昵稱使用命令【 /name 你的新昵稱】即可立即更改昵稱,成功修改后服務(wù)器會(huì)以系統(tǒng)消息的方式返回成功修改的提示。命令.專業(yè) .整理 .下載可編輯命令發(fā)送后5)幫助信息使用命令【 /help 】即可查看服務(wù)器的歡迎信息,里面包含了該聊天室的使用幫助,如下圖所示。命令.專業(yè) .整理 .下載可編輯命令發(fā)送后3. 系統(tǒng)設(shè)計(jì)開發(fā)本軟件時(shí), 我使用了面向?qū)ο蟮乃枷?,把服?wù)器

7、和客戶端封裝成對(duì)應(yīng)的類,類設(shè)計(jì)將會(huì)在下一節(jié)做詳細(xì)介紹。 通行方面我在服務(wù)器接受客戶端消息, 和客戶端接受服務(wù)器消息時(shí)使用了 select 模型,發(fā)送信息我使用的是普通的 socket 原語?;驹頌榉?wù)器與客戶端建立 TCP連接,然后服務(wù)器負(fù)責(zé)路由消息到各個(gè)客戶端。4. 優(yōu)點(diǎn)與缺點(diǎn)本軟件對(duì)流程復(fù)雜的 SELECT模型進(jìn)行了細(xì)致的拆分與抽象,做到了邏輯流程清晰,每個(gè)函數(shù)簡(jiǎn)潔易懂,層次分明。例如服務(wù)器啟動(dòng)函數(shù):void ChatServer:Start().專業(yè) .整理 .下載可編輯InitListenSocket();Bind();Listen();InitFDSocket();while (

8、true)DoSelect();trycharServer.Start();catch(SockException e)cout e.GetErrorInfo () endl;cout System Error Error Code: e.GetErrorCode () 0)for(int i = 0;i m_fdRead.fd_count; i+)DoFDRead(m_fdRead.fd_arrayi);.專業(yè) .整理 .下載可編輯它也只完成一個(gè)簡(jiǎn)單的流程,調(diào)用select ,然后循環(huán)處理有讀事件的socket 。void ChatServer:DoRead (SOCKET sRead)if

9、 (sRead = m_sListen)RecvNewConnect();elsem_sNowClient = sRead;RecvNewConnect();接下來的DoFDRead()函數(shù)完成的事情也非常直接,如果有事件的socket是監(jiān)聽socket的話,那么就是接收到了一個(gè)新的連接,否則是接收到了新的小。從上面這個(gè)簡(jiǎn)單的例子中可以看到, 本軟件最大的優(yōu)點(diǎn)就是 精心設(shè)計(jì)的類和函數(shù) 。避免了使用 select 模型常見的反復(fù)嵌套的循環(huán)和判斷,每個(gè)函數(shù)清晰明了。本系統(tǒng)還存在以下不足, 首先是沒有對(duì)界面做更深入的優(yōu)化, 只是做了最基本的調(diào)整, 讓輸入輸出更加雅觀,其次是底層原語的封裝并沒有考慮到

10、泛用性。四、系統(tǒng)詳細(xì)設(shè)計(jì)這部分的文檔在編碼之前已經(jīng)基本完成,由于時(shí)間較為倉(cāng)促,部分容可能和實(shí)際有所出入。1. ChatServer類該類負(fù)責(zé)完成服務(wù)器所有操作。1) 類圖2) 成員變量Map m_clients 聊天者的 SOCKET與昵稱的映射 fd_set m_fdSocket 可用套接字集合fd_set m_fdRead有事件發(fā)生的套接字集合SOCKET m_sListen 監(jiān)聽 SocketSOCKET m_sNowClient 當(dāng)前處理的客戶套接字.專業(yè) .整理 .下載可編輯int m_nPort監(jiān)聽端口3) 方法設(shè)計(jì)void Bind()void Listen()void Sele

11、ct()int Recv()SOCKET Accept()封裝底層原語,并加入異常機(jī)制,使得外部調(diào)用簡(jiǎn)約明了。構(gòu)造函數(shù)傳入監(jiān)聽端口,初始化m_nPortStart()1)初始化監(jiān)聽套接字:void InitListenSocket()2)綁定套接字至本地機(jī)器:void Bind()3)進(jìn)入監(jiān)聽模式(設(shè)置為非阻塞):void Listen()4)初始化可用套接字集合void InitFDSocket()5)死循環(huán),調(diào)用select方法DoSelect()6)結(jié)束DoSelect()1)令 m_fdRead = m_fdSocket2)調(diào)用 Select()3)循環(huán)處理Select的結(jié)果 DoFd

12、Read(Socket sRead)4)結(jié)束DoFdRead(int iReadIndex)1)判斷是否為m_sListen2)是 m_sListen RecvNewConnect()3)否則令 m_sNowClient = m_fdReadiReadIndex,調(diào)用 RecvNewMessage()RecvNewConnect()1)判斷是否達(dá)到套接字上線2)調(diào)用 Accept() ,接收連接sClient.專業(yè) .整理 .下載可編輯3)添加 sCilent至 m_fdSocket4)添加套接字至m_clients AddClientToInfoMap(string name)AddClie

13、ntToInfoMap(string name)1)以 SOKCET為鍵, name為值加入MAPRecvNewMessage()1)調(diào)用 Recv 函數(shù)2)是否為命令I(lǐng)sCommand(string str)3)是,則DoCommand(string cmd)4)否,則DoMessage(string msg)5)結(jié)束IsCommand(string str)1)判斷是否以/開頭DoCommand(string cmd)1)判斷指令,并解析命令與參數(shù)(argc, argv)2)調(diào)用指令處理函數(shù)3)假設(shè)只有SetName命令,那么則將對(duì)應(yīng)的套接字的名稱設(shè)置DoMessage(string ms

14、g)1)拼接消息與名字BuildMsg(string msg)2)在服務(wù)器上輸出3)消息路由DispatchMessage(string msg)BuildMsg(string msg)1)從 m_clients中取出用戶昵稱2)拼接字符串,形成格式如下超人君 (127.0.0.1) 23:49:48說 :大家好 !即為:昵稱( IP 地址)時(shí)間說:消息正文3)返回DispatchMessage(string msg).專業(yè) .整理 .下載可編輯1)構(gòu)造迭代器2) 遍歷 m_clients,若不是自身,則派送消息Send()2. ChatClient類該類負(fù)責(zé)處理客戶端的所有操作。1) 類圖2

15、) 字段設(shè)計(jì)SOCKET m_sClient客戶端自身的socketSOCKET m_sServer服務(wù)器 socketstring m_name昵稱sockaddr_in m_ServerAddr;服務(wù)器地址3) 方法設(shè)計(jì)構(gòu)造函數(shù)根據(jù)端口號(hào)和服務(wù)器IP 初始化 m_serverConnect()void Select()int Recv()void Send()int Select()封裝底層原語,加入異常處理,使得外部調(diào)用節(jié)約優(yōu)雅void Start()1)初始化套接字InitClientSocket()2)連接服務(wù)器Connect()設(shè)置為非阻塞模式3)獲取名字并發(fā)送至服務(wù)器InitNa

16、me()4)創(chuàng)建新線程并顯示替他用戶發(fā)言線程函數(shù)RecvMsgThread()5)循環(huán) SendMsg()6)關(guān)閉客戶端CloseClient()InitName()1)提示輸入昵稱.專業(yè) .整理 .下載可編輯2)獲取昵稱3)合法性判斷判斷重復(fù)4)添加命令格式5)發(fā)送至服務(wù)器SendMsg()1)讀取一行消息2)判斷是否為命令I(lǐng)sCommand(string str)3)命令:處理命令DoCommand(string cmd)4)消息:處理消息DoMessage(string msg)DoMessage(string msg)1)發(fā)送消息Send()2)本地回顯RecvMsgThread()1

17、) 初始化 fdSocket,將 m_sClient加入2)創(chuàng)建 fdRead3)死循環(huán) , 將 m_sClient拷貝至 fdRead4)調(diào)用 Select5)循環(huán),并輸出收到的消息Recv()3. SocketException類該類負(fù)責(zé)記錄SOKCET錯(cuò)誤的代碼以及錯(cuò)誤信息。5. 命令協(xié)議命令格式為/ 命令參數(shù) 1 參數(shù) 21. 退出 : /exit2. 獲取在線用戶列表: /getuser.專業(yè) .整理 .下載可編輯3. 私聊: /m UID 信息4. 清屏: /clear5. 幫助: /help處理方式IsCommand(string str)負(fù)責(zé)解析是否為命令判斷首字母是否為斜杠/

18、str.at(0) = /ResoveCommand(stringcmd,int & argc,stringargv)若 是 命 令 將 命 令 解 析 為argc,argvDoCommand(string cmd)處理命令,調(diào)用具體的XXX命令處理函數(shù)DoCmdXXXX()。6. 消息格式1) 公共消息超人君 (127.0.0.1) UID:100說 :大家好 !四(127.0.0.1) UID:101說:你好!2) 私聊你悄悄地對(duì)ABC UID : 100 說:你好CDF UID:101 悄悄地對(duì)你說:你好3) 服務(wù)器消息【系統(tǒng)消息】 XXXXXXXXXXXXXXXXXXXXXXXXXXX

19、XXX。4) 程序部提示.專業(yè) .整理 .下載可編輯System Infoxxxxxxxxxxxxxxxxxxxxxxxxx五、系統(tǒng)測(cè)試1. 服務(wù)器使用錯(cuò)誤2. 客戶端使用錯(cuò)誤3. 啟動(dòng)服務(wù)器.專業(yè) .整理 .下載可編輯4. 啟動(dòng)客戶端客戶端出現(xiàn)歡迎信息以及昵稱輸入提示。服務(wù)器出現(xiàn)連接提示.專業(yè) .整理 .下載可編輯5. 關(guān)閉客戶端服務(wù)器出現(xiàn)斷開連接提示6. 啟動(dòng)服務(wù)器錯(cuò)誤提示給出錯(cuò)誤提示信息和提示代碼.專業(yè) .整理 .下載可編輯7. 公開聊天所有客戶端以及服務(wù)器都會(huì)顯示。8. 私聊.專業(yè) .整理 .下載可編輯只有私聊的二人才能看到聊天信息,其他用戶和服務(wù)器無法看到。9. 錯(cuò)誤的私聊私聊自己會(huì)

20、得到一個(gè)錯(cuò)誤提示.專業(yè) .整理 .下載可編輯私聊不存在的用戶也會(huì)得到一個(gè)錯(cuò)誤提示10. 更名.專業(yè) .整理 .下載可編輯11. 幫助12. 非法指令非法指令會(huì)給出錯(cuò)誤提示。.專業(yè) .整理 .下載可編輯13. 非法的指令參數(shù).專業(yè) .整理 .下載可編輯14. 連接服務(wù)器失敗六、心得體會(huì)這次實(shí)現(xiàn)我深入研究了 select 模型的使用,完成了一個(gè)簡(jiǎn)易的聊天室。這次試驗(yàn)也使我在編程技巧方面也有了很大的提高。七、完整代碼Charserverd.cpp服務(wù)器 main 函數(shù)文件#include ChatServer.h#include SockException.h#include InitSock.h#

21、include using namespace std;.專業(yè) .整理 .下載可編輯InitSock initSock;int main(int argc, char* argv)if (argc 2)cout Usage: argv0 Port endl;return 1;ChatServer charServer(atoi(argv1);trycharServer.Start();catch (SockException& e)cout e.GetErrorInfo() endl;cout System ErrorError Code: e.GetErrorCode() endl;Chat

22、Server.h服務(wù)器類頭文件#ifndef CHAT_SERVER_H#define CHAT_SERVER_H#include #include #include #include ClientInfo.husing namespace std;class ChatServerpublic:void Start();void End();ChatServer(int nPort);ChatServer(void);private:void InitFDSocket();.專業(yè) .整理 .下載可編輯void DoSelect();void DoFDRead(SOCKET sRead);voi

23、d RecvNewConnect();string IPAddrToString(sockaddr_in sin);void AddClientToInfoMap(ClientInfo info);void RecvNewMessage();bool IsCommand(string str);void DoCommand(string cmd);void ResoveCommand(string cmd, int& argc, string argv);void DoCmdName(int argc, string argv);void DoCmdGetUsers(int argc, str

24、ing argv);void DoMessage(string msg);void DoCmdPrivateMsg(int argc, string argv);string BuildMessage(string str, bool bIsPublic);string BuildSystemMsg(string str);void DispatchMessage(string msg);void CloseConnect();string IntToString(int nNum);/= 簡(jiǎn)單封裝底層原語=void InitListenSocket();void Bind();void Li

25、sten() ;int Select();int Recv(char msgBuff);void Send(string msg, SOCKET client);SOCKET Accept(sockaddr_in& sin);/=private:map m_clients;fd_set m_fdSocket;fd_set m_fdRead;SOCKET m_sListen;SOCKET m_sNowClient;int m_nPort;.專業(yè) .整理 .下載可編輯;#endif CHAT_SERVER_HChatServer.cpp服務(wù)器類#include #include #include

26、ChatServer.h#include SockException.h#pragma comment(lib, ws2_32.lib)using namespace std;#define MAX_BUFF_SIZE 500typedef map:iterator map_it;ChatServer:ChatServer(int nPort)this-m_nPort = nPort;void ChatServer:Start()InitListenSocket();Bind();Listen();InitFDSocket();while (true)DoSelect();void ChatServer:DoSelect()m_fdRead = m_fdSo

溫馨提示

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