【正文】
a t S o c k e tC C h a t D l gC C h a t P a c k e t 聯(lián) 合 P A C K E T T Y P EC U s e r I n f o 聯(lián) 合 U S E R S T A T U EC C l i e n t R e l o g i n D l g C C l i e n t L o g i n D l gC C l i e n t A p p 結(jié) 束 1* 結(jié) 束 2* 結(jié) 束 3* 結(jié) 束 4* 結(jié) 束 5* 結(jié) 束 6* 結(jié) 束 71 結(jié) 束 8* 結(jié) 束 91 結(jié) 束 1 0* 結(jié) 束 1 11 結(jié) 束 1 2* 結(jié) 束 1 31 結(jié) 束 1 4* 結(jié) 束 1 51 結(jié) 束 1 6* 圖 靜態(tài)類圖 客戶端 主要類介紹 ? CClientDlg 類:創(chuàng)建客戶端主窗口,創(chuàng)建聊天窗口,接收離線消息,發(fā)送離線消息和保存聊天記錄等。 軟件測試的目標(biāo) ( 1) .測試是為了發(fā)現(xiàn)程序中的錯誤而執(zhí)行的程序的過程; ( 2) .好的測試方案是極可能發(fā)現(xiàn)迄今為止尚未發(fā)現(xiàn)的錯誤的測試方案; ( 3) 成功的測試時發(fā)現(xiàn)了至今為止尚未發(fā)現(xiàn)的錯誤的測試。 對所有的邏輯判定,取 “真 ”與取 “假 ”的兩種情況都能至少測一遍。 轉(zhuǎn)眼本科生階段就要劃上句號了。 當(dāng)然這個系統(tǒng)還存在 許多有待完善之處: 因此白盒測試又稱為結(jié)構(gòu)測試或邏輯驅(qū)動測試。 客戶端主要過程介紹 客戶端主要 去實(shí)現(xiàn)的是功能:初始化, 創(chuàng)建初始化窗口,接收窗口,接收離線聊天消息以及登陸控制。 ? CServerApp:用于生成唯一實(shí)例。ar) Void 序列化 表 34: CChatPacket 類成員變量 名 稱 類 型 說 明 m_type PACKETTYPE 包類型 m_UserInfo CUserInfo 用戶信息 m_strMsg CString 消息 m _pUserList CObList* 用戶鏈表 m_OfflineUserInfo CUserInfo 離線用戶信息 m_time CTime 日期和時間 16 4 系統(tǒng)實(shí)現(xiàn) 服務(wù)器端 設(shè)計 實(shí)現(xiàn) 服務(wù)器端 靜態(tài)類圖 C A r c h i v e C S o c k e t F i l e m _ h I c o n : H I C O NC S o c k e t F i l eC L i s t e n S o c k e t C C l i e n t S o c k e tC S e r v e r A d d r e s s D l gC S e r v e r A p p 聯(lián) 合 P A C K E T T Y P EC C h a t P a c k e tC U s e r I n f o 聯(lián) 合 U S E R A T A T U E 結(jié) 束 11 結(jié) 束 2* 結(jié) 束 31 結(jié) 束 4* 結(jié) 束 51 結(jié) 束 6* 結(jié) 束 71 結(jié) 束 8* 圖 服務(wù)器靜態(tài)類圖 服務(wù)器 主要類介紹 ? CServerDlg 類 : 創(chuàng)建 服務(wù)器 主窗口,管理用戶信息鏈表,管理在線用戶鏈表,管理離線用戶鏈表,讀取保存用戶信息,讀取保存離線消息等。該程序?qū)⒊蓡T列表設(shè)計為三種狀態(tài) 登 陸 狀 態(tài) : 當(dāng) 用 戶 登 陸 服 務(wù) 器 事 , 設(shè) 置 用 戶 狀 態(tài) 為 登 陸 狀 態(tài) , 服務(wù)器根據(jù)該用戶列表狀態(tài)發(fā)送成員列表。 ( 2) 通知客戶端更新成員狀態(tài)。這有別于普通 Web 瀏覽的連接方式。通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務(wù)合理分配到 Client 端和 Server 端來實(shí)現(xiàn),降低了系統(tǒng)的通訊開銷。 IP 數(shù)據(jù)包是不可靠的,因為 IP 并沒有做任何事情來確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒有被破壞。因此 Visual C++又稱作是一個集成開發(fā)工具,它提供了軟件代碼自動生成和可視化的資源編輯功能。 第 4 章是系統(tǒng)實(shí)現(xiàn), 分別介紹了服務(wù)器端和客戶端每個功能的執(zhí)行過程,畫出主要模塊的流程圖。 基于 Socket 的局域網(wǎng)聊天工具很好地詮釋了 Socket 通信的原理,并且在企業(yè)內(nèi)部通信、教學(xué)、討論等應(yīng)用中都具有一定的實(shí)用價值。 本論文提出一個運(yùn)行于 VC 平臺上的局域網(wǎng)聊天軟件的解決方案。 系統(tǒng) 現(xiàn)狀 基于局域網(wǎng)的即時通信工具,實(shí)際上是互聯(lián)網(wǎng)即時通信工具的一個小規(guī)模版本,廣域網(wǎng)上的即時通信工具,如今一般采用 UDP 或者 TCP 協(xié)議體系來實(shí)現(xiàn) ,開發(fā)技術(shù)已經(jīng)比較成熟,比如較早的 ICQ, MSN Messenger, Yahoo。 3 2 系統(tǒng)開發(fā)環(huán)境和關(guān)鍵技術(shù) 開發(fā)環(huán)境 我所設(shè)計的是一個面向中小型機(jī)構(gòu)內(nèi)部通信需求的局域網(wǎng)即時信息軟件,要在短時間內(nèi)開發(fā)出來并且要滿足客戶要求,無論是硬件還是軟件都要選擇合適 ,要求如 下:開發(fā)設(shè)備應(yīng)該完備;開發(fā)機(jī)器的性能必須穩(wěn)定;操作系統(tǒng)的選擇應(yīng)該 適當(dāng) ;開發(fā)出的程序可以在盡可能多的平臺上運(yùn)行;要求運(yùn)行機(jī)配置盡可 能低檔。 現(xiàn)在的 Winsock 已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無關(guān),你可以使用 Winsock 來調(diào)用多種協(xié)議的功能,但較常使用的是 TCP/IP 協(xié)議。 TCP 將包排序并進(jìn)行錯誤檢查,同時實(shí)現(xiàn)虛電路間的連接。由于服務(wù)器連接個數(shù)和數(shù)據(jù)通信量的限制,這種結(jié)構(gòu)的軟件適于在用戶數(shù)目不多的局域網(wǎng)內(nèi)使用。因為服務(wù)器任何時候都可能發(fā)送信息到客戶端,因此,客戶端和服務(wù)器一旦建立連接,必須能讓服務(wù)器在以后發(fā)送中尋找定位到這個連接 。 ( 5) 驗證密碼 。 在線用戶之間可以直接發(fā)送消息;對離線離線用戶需要服務(wù)器轉(zhuǎn)發(fā)。obList) Void 讀取用戶消息 SendUserList() Void 發(fā)送用戶鏈表 CopyUserList(CObList amp。 26 表 成員函數(shù) 函 數(shù) 名 稱 返 回 值 功 能 CClientDlg(CWnd *pParent=NULL) 無 構(gòu)造函數(shù) ~CClientDlg() 無 析夠函數(shù) Init() BOOL 初始化 InitListCtrlSetting() BOOL 初始列表控件 ConnectToServer() BOOL 連接服務(wù)器 BegingListen() BOOL 監(jiān)聽 ProcessPendingAccept() Void 接受對方連接 ProcessPendingRead() Void 接受數(shù)據(jù)包 SendPacket(CChatPacket amp。 從上述規(guī)則可以看出,測試的 正確定義是“為了發(fā)現(xiàn)程序中的錯誤而執(zhí)行程序的過程”。 在循環(huán)的邊界和運(yùn)行的界限內(nèi)執(zhí)行循環(huán)體。 在文字傳送的同時增加表情發(fā)送的功能 ; 通過這次畢業(yè)設(shè)計 ,我更深刻的認(rèn)識到了教學(xué)實(shí)踐在大學(xué)課程中的重要性,同時也發(fā)覺到了自己在學(xué)習(xí)方面存在的不足之處, 在以后 的學(xué)習(xí)中我會努力改進(jìn)這些不足、不斷提高自己的動手實(shí)踐能力 。 勤 動手的重要性,在以前我總是有“只學(xué)不練”的傾向,導(dǎo)致動手能力得不到提高,在這次的一次次編寫代碼、調(diào)試代碼的過程中,我才明白“ 代碼不是寫出來的,是調(diào)出來的”的道理。 在這段時間里我學(xué)到了很多以前沒有學(xué)到的知識,同時也將以前所學(xué)過的知識運(yùn)用到實(shí)踐項目中,在提高理論知識的基礎(chǔ)上,也充分地鍛煉了自己的動手能力。通過在不同點(diǎn)檢查程序狀態(tài),確定實(shí)際狀態(tài)是否與預(yù)期的狀態(tài)一 致。 ? CClientLoginDlg 類:派生與 CDialog 類,用與創(chuàng)建服務(wù)器對話框。userInfo) Void 保存用戶狀態(tài)信息 19 GetUserInfo() CUserInfo 獲取用戶信息 OnReceive(int nErrorCode) Void 接收數(shù)據(jù) OnClose(int nErrorCode) Void 關(guān)閉套接字 ? CServerAddressDlg: 用與設(shè)置服務(wù)器地址和斷口。 ? MESSAGE:客戶端發(fā)送的消息 ? USERLIST:用戶列表 ? SERVERMSG:服務(wù)器發(fā)送的消息 ? UNKNOWN:未知類型 表 33: CChatPakcet 類成員函數(shù) 函 數(shù) 名 稱 返 回 值 功 能 CChatPacket() 無 構(gòu)造函數(shù) ~CChatPacket() 無 析夠函數(shù) Init() Viod 初始化成員變量 Serialize(CArchive amp。 圖 36 局域網(wǎng)聊天系統(tǒng)功能 模塊 圖 共享數(shù)據(jù)類設(shè)計 A.用戶設(shè)計: 1.用戶狀態(tài)設(shè)計 客戶端與服務(wù)器端都擁有成員列表。 服務(wù) 器端實(shí)現(xiàn)功能: ( 1) 維護(hù)聊天室成員列表:包括接受新成員,刪除已有成員。 在 基于 Socket 的聊天系統(tǒng) , 客戶端和服務(wù)器必須保持隨時隨地的連接。 面 向連接的( TCP) 連接過程 8 Client/Server 結(jié)構(gòu) (客戶機(jī) /服務(wù)器模式) Client/Server 結(jié)構(gòu) ( C/S 結(jié)構(gòu) )是大家熟知的客戶機(jī)和服務(wù)器結(jié)構(gòu)。 IP 層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動程序)發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層 TCP 或 UDP 層;相反, IP 層也把從 TCP 或 UDP 層接收來的數(shù)據(jù)包傳送到更低層。 Visual C++是功能最為強(qiáng)大可視化開發(fā)工具,它不僅支持傳統(tǒng)的軟件開發(fā)方法,更重要的是它能支持面向?qū)ο?、可視化的開發(fā)風(fēng)格。對系統(tǒng)的結(jié)構(gòu)進(jìn)行 設(shè)計,設(shè)計共享數(shù)據(jù)結(jié)構(gòu)。它的實(shí)現(xiàn)無需對企業(yè)原有的局域網(wǎng)硬件進(jìn)行任何改動,具有實(shí)現(xiàn)成本低廉的優(yōu)點(diǎn),它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求。該聊天軟件包括服務(wù)器端和客戶端兩個模塊, 客戶端通過服務(wù)器端進(jìn)行通信 。 除了 這些國外開發(fā)的產(chǎn)品,還有國產(chǎn)的有名的 ,新浪 UC,LAVALAVA 等,這些工 具統(tǒng)統(tǒng)都實(shí)現(xiàn)了廣域網(wǎng)上的即時通信,盡管都是即時通信,實(shí)現(xiàn)了即時聊天,以及文件傳輸?shù)闹饕δ?,但是也各有各的特色,比?ICQ 的巨大客戶群, MSN 的個性化表情, YAHOO 通的易操作性等。對此,我們選擇的硬件環(huán)境和軟件環(huán)境如下: 硬件環(huán)境 Windows sockets 無疑是我們進(jìn)行網(wǎng)絡(luò)編程的利器 。 TCP 數(shù)據(jù)包中包括序號和確認(rèn),所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。 C/S 結(jié)構(gòu)的優(yōu)點(diǎn)是能充分發(fā)揮客戶端PC的處理能力,很多工作可以在客戶端處理后再提交給服務(wù)器。 局域網(wǎng)聊天系統(tǒng)使該系統(tǒng)的用戶能夠通過 客戶端登入到該系統(tǒng),然后直接與系統(tǒng)交互。 ( 6) 禁止已登陸用戶再次登陸。 轉(zhuǎn)發(fā)關(guān)系如圖 所示。obList) Void 復(fù)制用戶鏈表 DeleteTempUserList(CObList amp。packet) Void 發(fā)送數(shù)據(jù) ReadPacket() Void 接收服務(wù)器數(shù)據(jù) UpdateClientListCtl() Void 更新用戶列表 ShowOfflineMsg(CChatPacket *pPacket) Void 顯示離線消息 CreateUserList(CObList *pObList) Void 創(chuàng)建用戶鏈表 CreateChatDlg(CString *pChatDlg) Void 創(chuàng)建聊天窗口 SaveChatLog(CChatDlg *pChatDlg) Void 保存聊天記錄 OnDblclkClientList(NMHDR *pNMHDR,LRESULT *pResult) Void 雙擊列表視圖控件的消息響應(yīng)函數(shù) ? CChatDlg 類:編輯和顯示 消息。正確認(rèn)識測試是非常重要的,測試目標(biāo)決定了測試方案的設(shè)計。 測試內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性,等等。應(yīng)使用戶能夠?qū)崿F(xiàn)個人信息如昵稱、密碼等的修改; 36 參考文獻(xiàn) [1] 侯俊杰 深入淺出 MFC(第二版) 華中科技大學(xué)出版社 20xx01 [2] 王燕 《面向?qū)ο蟮睦碚撆c c+