軟件項(xiàng)目實(shí)訓(xùn)局域網(wǎng)即時(shí)通訊聊天_第1頁
軟件項(xiàng)目實(shí)訓(xùn)局域網(wǎng)即時(shí)通訊聊天_第2頁
軟件項(xiàng)目實(shí)訓(xùn)局域網(wǎng)即時(shí)通訊聊天_第3頁
軟件項(xiàng)目實(shí)訓(xùn)局域網(wǎng)即時(shí)通訊聊天_第4頁
軟件項(xiàng)目實(shí)訓(xùn)局域網(wǎng)即時(shí)通訊聊天_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、軟件項(xiàng)目實(shí)訓(xùn)報(bào)告書學(xué)院: _計(jì)算機(jī)科學(xué)與技術(shù) _專業(yè):_ 軟件工程 _ _組長(zhǎng):目錄第一章 項(xiàng)目簡(jiǎn)介 0局域網(wǎng)聊天系統(tǒng) 0第二章 需求分析 0一 任務(wù)概述 01.1 目標(biāo) 01.2 軟件總體功能結(jié)構(gòu)圖 01.3 系統(tǒng)用例圖 11.4 頂層數(shù)據(jù)流圖 11.5 二層數(shù)據(jù)流圖 21.6 用戶的特點(diǎn) 21.7 假定與約束 2二 需求規(guī)定 22.1 對(duì)性能的規(guī)定 22.1.1精度 22.1.2 時(shí)間特性耍求 32.2 輸出要求 32.3 數(shù)據(jù)管理能力要求 32.4 故障處理要求 3三 運(yùn)行環(huán)境規(guī)定 3設(shè)備 3四 接口 3用戶接口 3硬件接口 4通信接口 4第三章 總體設(shè)計(jì) 4概述 4一 系統(tǒng)主要功能的工

2、作流程 4二 服務(wù)器端總體設(shè)計(jì) 5三 客戶端總體設(shè)計(jì) 5第四章 詳細(xì)設(shè)計(jì) 6一 概述 6二 服務(wù)器端 62.1 服務(wù)器主模塊 7三客戶端 73.1 登錄模塊 73.2 注冊(cè)模塊 83.3 主模塊 83.4 私聊模塊 8第五章 實(shí)現(xiàn)和結(jié)果 85.1 實(shí)現(xiàn) 85.1.1 服務(wù)器的實(shí)現(xiàn)代碼: 85.1.2 客戶端的實(shí)現(xiàn)代碼 175.2 結(jié)果 26第六章測(cè)試與調(diào)試 281 測(cè)試環(huán)境配置 282 功能性測(cè)試 283 容錯(cuò)性測(cè)試 284 易用性測(cè)試 285 文檔測(cè)試 28第七章總結(jié) 28參考文獻(xiàn) 29成員信息 :課題名稱小 組 成 員專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院軟件工程系學(xué)號(hào)班級(jí)任務(wù)客戶端注冊(cè)登錄聊天0902

3、客戶端離線信息及程序美化0902服務(wù)器端信息收發(fā)及測(cè)試調(diào)試0902服務(wù)器端數(shù)據(jù)庫第一章 項(xiàng)目簡(jiǎn)介局域網(wǎng)聊天系統(tǒng)隨著互聯(lián)網(wǎng)的發(fā)展應(yīng)用比較廣泛,學(xué)校、 機(jī)房、 宿舍等地方都是應(yīng)用局域網(wǎng)的地方, 本 項(xiàng)目要求所設(shè)計(jì)實(shí)現(xiàn)的局域網(wǎng)聊天系統(tǒng)能夠?qū)崿F(xiàn)局域網(wǎng)的聊天、 聊天容的保存和文件的傳遞 等功能,并使用 TCP/UDP 作為該系統(tǒng)的通訊協(xié)議。第二章 需求分析任務(wù)概述1.1 目標(biāo)隨著辦公室工作量日益增加,大家交流日益密切,但由于聊天工具的不足, 導(dǎo)致了大家的交流上的一些不便, 故我們小組就根據(jù)這個(gè)背景開發(fā)此軟件, 它主 要特點(diǎn)較高通用性即在任意局域網(wǎng)可以運(yùn)行,系統(tǒng)具有較高的可移植性和使用 性、也包含實(shí)用性各

4、及時(shí)性, 但系統(tǒng)雙方的交流可以在短期進(jìn)行, 以達(dá)到最快速 度,不但能進(jìn)行普通文字通信, 而且也增加了文件傳輸功能, 如果在后期進(jìn)度正 常進(jìn)行的情況下會(huì)進(jìn)一步增加語音實(shí)時(shí)通信以及視頻實(shí)時(shí)通信模塊。1.2 軟件總體功能結(jié)構(gòu)圖局域網(wǎng)聊天系統(tǒng)1.3 系統(tǒng)用例圖1.4 頂層數(shù)據(jù)流圖1.5 二層數(shù)據(jù)流圖登 陸 認(rèn) 證1.6 用戶的特點(diǎn)用戶能夠熟練使用計(jì)算機(jī),熟悉相關(guān) WINDOWS 。1.7 假定與約束假定項(xiàng)目組成員不無故缺席且認(rèn)真工作,本軟件能在6月 29日之前完成。需求規(guī)定2.1 對(duì)性能的規(guī)定2.1.1精度按相關(guān)提示輸入。2.1.2 時(shí)間特性耍求響應(yīng)時(shí)間:所有的發(fā)送操作響應(yīng)時(shí)間一般不超過 1 秒,大量

5、的信息發(fā)送, 呈現(xiàn)應(yīng)該在 5 秒顯示或者提示 相關(guān)出錯(cuò)信息。更新處理時(shí)間: 所有提交數(shù)據(jù)一般在 3 秒相應(yīng)。2.2 輸出要求文字?jǐn)?shù)字等相關(guān)信息。2.3 數(shù)據(jù)管理能力要求聊天記錄近萬條,在需要時(shí)能及時(shí)存取。 相關(guān)配置信息,需要時(shí)能即使讀取。2.4 故障處理要求聊天記錄及配置文件必須按日、按周進(jìn)行及時(shí)的備份。三 運(yùn)行環(huán)境規(guī)定設(shè)備P3處理器以上,存: 256M以上硬盤: 50M空余空間四 接口用戶接口用戶界面:采用 Windows 的通用圖形界面,對(duì)用戶友好,且必須對(duì)鼠標(biāo)鍵盤提供支持,界 面設(shè)計(jì)應(yīng)遵循:1. 盡量保持一致性:界面規(guī)應(yīng)遵循 Winows 軟件界面的規(guī)2. 設(shè)計(jì)完整的對(duì)話過程: 系統(tǒng)的每

6、 d 一次對(duì)話都應(yīng)該有明確的次序: 開始、中間處理過程、 結(jié)束。3. 提供簡(jiǎn)單的錯(cuò)誤處理機(jī)制4. 提供信息反饋:用多種信息提示用戶當(dāng)前軟件運(yùn)行狀態(tài),軟件界面元件的功能。5. 操作可逆:其動(dòng)作可以是單個(gè)的操作,或者是一個(gè)相對(duì)獨(dú)立的操作序列。6. 設(shè)計(jì)良好的聯(lián)機(jī)幫助7. 顯示啟動(dòng)畫面:畫面簡(jiǎn)潔明快,富有現(xiàn)代氣息。硬件接口支持一般的 PC機(jī),筆記本電腦通信接口本產(chǎn)品用戶各終端和服務(wù)器屬于一個(gè)局域網(wǎng),網(wǎng)采用 TCP/IP 或 UDP協(xié)議第三章 總體設(shè)計(jì)概述本軟件系統(tǒng)設(shè)計(jì)分為服務(wù)器端應(yīng)用程序和客戶端應(yīng)用程序兩大部分, 采用套接字進(jìn)行網(wǎng) 絡(luò)編程。為了傳輸數(shù)據(jù)采用了 udp 的連接方式。一 系統(tǒng)主要功能的工

7、作流程客戶端與服務(wù)器的實(shí)時(shí)通信是本系統(tǒng)局域網(wǎng)絡(luò)通信軟件的主要功能之一, 其工作流程主 要如下:. 服務(wù)器端啟動(dòng)程序,啟動(dòng)監(jiān)聽端口(默認(rèn)監(jiān)聽端口為9999 )進(jìn)入監(jiān)聽狀態(tài),等待客戶端的連接請(qǐng)求??蛻舳税l(fā)送連接請(qǐng)求和相應(yīng)的用戶信息。服務(wù)器端接受用戶連接請(qǐng)求, 進(jìn)行用戶信息驗(yàn)證和相應(yīng)的請(qǐng)求處理操作, 并將處理結(jié)果 反饋給客戶端。 如果驗(yàn)證成功, 則將在線用戶列表信息發(fā)送給客戶端, 并通知客戶端啟動(dòng)聊 天接收線程??蛻舳私邮辗?wù)器端發(fā)送過來的好友信息,建立 socket 與其他在線用戶進(jìn)行實(shí)時(shí)通信。 流程圖如下:二 服務(wù)器端總體設(shè)計(jì)服務(wù)器端主要功能:(1)用戶信息存儲(chǔ)管理:主要用來驗(yàn)證、存儲(chǔ)、向客戶端

8、發(fā)送用戶信息,如用戶賬號(hào),用 戶密碼。(2)用戶請(qǐng)求處理:主要用來處理客戶端的各種請(qǐng)求信息,包括連接請(qǐng)求和注冊(cè)請(qǐng)求。 服務(wù)器端程序的基本工作流程如下:( 1) 打開預(yù)設(shè)定的網(wǎng)絡(luò)端口,監(jiān)聽客戶端的信息請(qǐng)求;(2) 對(duì)登陸的請(qǐng)求, 進(jìn)行用戶賬號(hào)與密碼的驗(yàn)證, 并作出相應(yīng)的處理。 如果驗(yàn)證成功, 則 向客戶端返回其他用戶在線離線信息,否則提示用戶登陸不成功。(3)對(duì)于客戶端提出的用戶賬號(hào)申請(qǐng)請(qǐng)求, 則核對(duì)用戶提交的信息, 并進(jìn)行保存, 然后把 申請(qǐng)成功的賬號(hào)發(fā)送給用戶。三 客戶端總體設(shè)計(jì)客戶端主要功能包括: (1)網(wǎng)絡(luò)設(shè)置功能模塊:用來設(shè)置實(shí)時(shí)通信然見客戶端索要連接的服務(wù)器ip(2)賬號(hào)申請(qǐng)模塊:應(yīng)

9、用于第一次使用本軟件的用戶申請(qǐng)賬號(hào)。如果申請(qǐng)成功,則返回客 戶端一個(gè)系統(tǒng)唯一的賬號(hào)作為以后用戶登陸的身份標(biāo)識(shí)。(3)連接服務(wù)器功能模塊:應(yīng)用于已經(jīng)獲取了賬號(hào)的用戶,登陸到系統(tǒng)中,以便與其他在 線用戶發(fā)送消息。(4)實(shí)時(shí)通信功能模塊:針對(duì)已經(jīng)登陸的用戶與其他在線好友進(jìn)行公聊與私聊。(5)離線消息發(fā)送與接收:針對(duì)離線的人發(fā)送離線消息,上線并接受 客戶端基本工作流程:(1)局域網(wǎng)每個(gè)成員打開客戶端軟件后,向系統(tǒng)服務(wù)器申請(qǐng)一個(gè)用戶賬號(hào)并設(shè)置密碼。 (2)以該賬號(hào)密碼登陸系統(tǒng),與其他在線用戶發(fā)送消息。第四章 詳細(xì)設(shè)計(jì)一 概述總體敘述分為服務(wù)器和客戶端分別開發(fā)。二 服務(wù)器端服務(wù)器端始終運(yùn)行在服務(wù)器,始終建

10、立兩個(gè) socket 來監(jiān)聽客戶端發(fā)來的連接。 CServerSocket 和 CClientSocket ,其中 CServerSocket 用來接收客戶端發(fā)來的注冊(cè),登錄,確 認(rèn)等信息,而 CClientSocket 則是用來處理聊天室等信息的轉(zhuǎn)發(fā)。( 圖 2-1)CListenSocket CClientSocket2.1 服務(wù)器主模塊用來顯示哪個(gè)用戶已經(jīng)所有進(jìn)入或者注冊(cè)局域網(wǎng)的活動(dòng),比如顯示某個(gè)用戶成功注冊(cè), 或者某個(gè)用戶成功登陸客戶端, 以及接受用戶注冊(cè)消息和寫入數(shù)據(jù)操作以及對(duì)數(shù)據(jù)庫進(jìn)行操 作增刪, CServerSocket 負(fù)責(zé)兩個(gè)客戶端之間私聊的消息的轉(zhuǎn)發(fā)以及離線消息的推送。三

11、客戶端3.1 登錄模塊注冊(cè)。填寫服務(wù)器 IP 地址,如果有賬號(hào)直接登錄,如有沒有則進(jìn)入注冊(cè)模塊進(jìn)行3.2 注冊(cè)模塊通過用戶填寫各種信息, 然后通過之前建立的 CClientSocket 發(fā)送到服務(wù)器, 再通 過服務(wù)器保存到服務(wù)器本地端的數(shù)據(jù)庫中。3.3 主模塊負(fù)責(zé)顯示每一個(gè)在線或者離線的用戶狀態(tài), 以及維持一個(gè) CEdit 用來顯示每 一個(gè) 用戶發(fā)來的消息,也就是所謂聊天室的功能吧。3.4 私聊模塊當(dāng)用戶選擇某個(gè)用戶進(jìn)行私聊獲得對(duì)方同意之后, 開始進(jìn)行私聊, 以及開始進(jìn)行傳送文 件活動(dòng) (目前暫時(shí)未實(shí)現(xiàn) ) ;第五章 實(shí)現(xiàn)和結(jié)果5.1 實(shí)現(xiàn)5.1.1服務(wù)器的實(shí)現(xiàn)代碼:a ClientSocke

12、t 類void CClientSocket:OnReceive(int nErrorCode) / 重載函數(shù) (在本地套接字接收到消息時(shí)自動(dòng)調(diào)用它進(jìn)行消息處理)/ TODO: Add your specialized code here and/or call the base class char buff1sizeof(Header);memset(buff1, 0, sizeof(buff1);/ 初始化為 0Receive(buff1,sizeof(buff1);/ 接收信息Header *header = (Header*)buff1;int length = header-len;

13、char type = header-type;if (type = RECV_LEA VEMESSAGE)char buff1000;memset(buff,0,sizeof(buff);Receive(buff,length); /接收到源主機(jī)用戶名 +& /通過 buff 中的 用戶名 在數(shù)據(jù)庫中 查找 它需要的數(shù)據(jù) CString str = m_dlgServer-QueryLeaveMsg(buff);strcat(buff,str);/ 目的主機(jī) & 源主機(jī) &消息容CClientSocket *curr = NULL;POSITION pos = clist-GetHeadPo

14、sition();/返回第一個(gè)元素的 POSITIONwhile (pos != NULL)/ 向所有在線 用戶發(fā)送離線消息curr = (CClientSocket *)clist-GetNext(pos); / 返回下一個(gè)元素的 CObject* curr-Send(char *)header,sizeof(Header);/發(fā)送命令字curr-Send(buff, sizeof(buff);if(type = SEND_MESSAGE)char buff1000;memset(buff,0,sizeof(buff);/ 初始化為 0Receive(buff,sizeof(buff); /

15、 接收信息 /遍歷用戶套接字鏈表將用戶發(fā)送來的消息發(fā)送給在線列表的每一個(gè)用戶 CClientSocket *curr = NULL;/ 返回第一個(gè)元素的 POSITIONPOSITION pos = clist-GetHeadPosition();while (pos != NULL)curr = (CClientSocket *)clist-GetNext(pos); / 返回下一個(gè)元素的 CObject* curr-Send(char *)header,sizeof(Header);curr-Send(buff, sizeof(buff);if(type = LOGIN_IO)char b

16、uff1000;memset(buff,0,sizeof(buff);Receive(buff,length);m_strNick=m_dlgServer-SelstrName(buff); / 通過賬號(hào) 得到昵稱 m_strPass=m_dlgServer-SelstrPass(buff); /通過賬號(hào) 得到密碼/初始化為 0/申請(qǐng)賬號(hào)命令字if(type = ASK_NUM)char buff1000;memset(buff,0,sizeof(buff);Receive(buff,length);CString strNum;CString strNick;/將用戶資料插入數(shù)據(jù)庫 strN

17、um=m_dlgServer-InsertUserInfo(buff); / 將用戶信息存到數(shù)據(jù)庫中 strNick=m_dlgServer-SelstrName(strNum);/將系統(tǒng)分配給用戶的賬號(hào)返回給用戶 if(strNum=*)Header head;head.type = ASKNUM_FAILED; head.len = strNum.GetLength();this-Send(char *)&head,sizeof(Header); this-Send(strNum,strNum.GetLength();elseHeader head; head.type = ASK_NUM

18、; head.len = strNum.GetLength();this-Send(char *)&head,sizeof(Header); this-Send(strNum,strNum.GetLength();CTime time = CTime:GetCurrentTime();CString t = time.Format(%Y-%m-%d %H:%M:%S);CEdit *p_Edit = (CEdit *):AfxGetMainWnd()-GetDlgItem(IDC_EDIT_INFO);CString strTemp =t + : + strNick/*CString(buff

19、)*/ + 申請(qǐng)了一個(gè) :+strNum+rn;p_Edit-ReplaceSel(strTemp);m_strName = strNick/*buff*/;if(type = PASS_SUCCESS)char buff1000;memset(buff,0,sizeof(buff);Receive(buff,length);/接收用戶登陸時(shí)輸入的密碼CString strPass=buff;if (m_dlgServer-m_UserList.FindString(-1,m_strNick)!= LB_ERR)/列表中已經(jīng)存在Header head;head.type = PASS_FAIL

20、ED;head.len = m_strName.GetLength();this-Send(char *)&head,sizeof(Header);this-Send(m_strName,m_strName.GetLength();else if(strPass=m_strPass) / 判斷密碼是否正確/ 發(fā)送密碼正確信息 Header head;head.type = PASS_SUCCESS; head.len = m_strNick.GetLength(); this-Send(char *)&head,sizeof(Header); this-Send(m_strNick,m_str

21、Nick.GetLength();/ 在服務(wù)器監(jiān)視編輯框顯示用戶進(jìn)入聊天室 CTime time = CTime:GetCurrentTime();CString t = time.Format(%Y-%m-%d %H:%M:%S);CEdit *p_Edit = (CEdit *):AfxGetMainWnd()-GetDlgItem(IDC_EDIT_INFO);CString strTemp =t + : + m_strNick + 進(jìn)入聊天室 +rn; p_Edit-ReplaceSel(strTemp); m_strName = m_strNick;m_dlgServer-Updat

22、eUser(this,m_strName,1);/ 更新在線用戶列表 (服務(wù)器和客戶端都更新 ) /檢測(cè)是否有離線消息else / 發(fā)送密碼錯(cuò)誤信息Header head;head.type = PASS_FAILED; head.len = m_strName.GetLength(); this-Send(char *)&head,sizeof(Header); this-Send(m_strName,m_strName.GetLength();if (type = LEA VE_MESSAGE)char buff1000;memset(buff,0,sizeof(buff); / 初始化為

23、 0 Receive(buff,sizeof(buff);/ 接收信息m_dlgServer-InsertLeaveMsg(buff);if(type = PRIV ATE_ASK) / 單獨(dú)聊天命令字char buff1000;memset(buff,0,sizeof(buff);Receive(buff,sizeof(buff);CClientSocket *curr = NULL;POSITION pos = clist-GetHeadPosition();/ 返回第一個(gè)元素的 POSITIONwhile (pos != NULL)curr = (CClientSocket *)clis

24、t-GetNext(pos); / 返回下一個(gè)元素的 CObject* curr-Send(char *)header,sizeof(Header);curr-Send(buff, sizeof(buff);if(type = PRIV ATE_REFUSE)char buff1000; memset(buff,0,sizeof(buff); Receive(buff,sizeof(buff);CClientSocket *curr = NULL;POSITION pos = clist-GetHeadPosition(); while (pos != NULL)curr = (CClient

25、Socket *)clist-GetNext(pos); curr-Send(char *)header,sizeof(Header); curr-Send(buff, sizeof(buff);/返回第一個(gè)元素的 POSITION/ 返回下一個(gè)元素的 CObject*if(type = PRIV ATE_MESSAGE) char buff1000; memset(buff,0,sizeof(buff); Receive(buff,sizeof(buff);CClientSocket *curr = NULL;POSITION pos = clist-GetHeadPosition(); w

26、hile (pos != NULL)curr = (CClientSocket *)clist-GetNext(pos); curr-Send(char *)header,sizeof(Header);/初始化為 0/接收信息/返回第一個(gè)元素的 POSITION/ 返回下一個(gè)元素的 CObject*curr-Send(buff, sizeof(buff);CSocket:OnReceive(nErrorCode);void CClientSocket:OnClose(int nErrorCode)/ 重載的 OnClose 函數(shù) ,在有套接字?jǐn)嚅_連接時(shí)會(huì)自動(dòng)調(diào)用/ TODO: Add your

27、 specialized code here and/or call the base class POSITION pos = clist-Find(this);if(pos != NULL)/ 刪除鏈表中退出的用戶套接字clist-RemoveAt(pos);CTime time = CTime:GetCurrentTime();/ 獲取當(dāng)前系統(tǒng)時(shí)間CString t = time.Format(%Y-%m-%d %H:%M:%S);CEdit *p_Edit = (CEdit *)m_dlgServer-GetDlgItem(IDC_EDIT_INFO);CString strTemp

28、= t + : + this-m_strName + 離開聊天室 +rn; p_Edit-ReplaceSel(strTemp);/在 IDC_EDIT_INFO 中輸出字符串m_dlgServer-UpdateUser(this,this-m_strName,2);this-Close();delete this;CSocket:OnClose(nErrorCode);void CClientSocket:ServerClose()CString buff;buff=m_strNick;Header head;head.type = SERVER_STOP;head.len = buff.G

29、etLength();CClientSocket *curr = NULL;POSITION pos = clist-GetHeadPosition();/ 返回第一個(gè)元素的 POSITIONwhile (pos != NULL)curr = (CClientSocket *)clist-GetNext(pos);/ 返回下一個(gè)元素的 CObject*curr-Send(char *)&head,sizeof(Header);curr-Send(buff, sizeof(buff);c . ChatServerDlg 類void CChatServerDlg:UpdateUser(CClien

30、tSocket *pSocket,CString m_usrLeaveName,int type)/type=1 userlogin type=2 userleaveCString user_info=;CString str=;CClientSocket *pSock = NULL;if (type=2)m_ListClose.AddString(m_usrLeaveName);if (LB_ERR!=m_ListClose.FindString(-1,m_usrLeaveName) & type=1)/ 用戶登錄時(shí) 就刪除離線列表 框中的用戶名UINT nIndex;nIndex=m_Li

31、stClose.FindString(-1,m_usrLeaveName);/ 為 -1,從頭查找整個(gè)列表框 m_ListClose.DeleteString(nIndex);int StringCount = m_ListClose.GetCount();/ 這段代碼 是得到離線列表框的 用戶for (int i=0; iclist-GetHeadPosition(); / 得到 list 中首元素的位置 while(pos != NULL)CObject*,設(shè)置分隔符 &pSock = (CClientSocket *)pSocket-clist-GetNext(pos); / 返回下一個(gè)

32、元素的 m_UserList.AddString(pSock-m_strName);/ 將剛上線的用戶添加到列表中user_info += (pSock-m_strName + &); / 將在線用戶列表保存在字符串中Header head;head.type = LOGIN_IO;head.len = user_info.GetLength();/向客戶端發(fā)送離線用戶列表POSITION po = pSocket-clist-GetHeadPosition(); / 獲得列表首元素的 POSITION while(po != NULL)pSock = (CClientSocket *)pSo

33、cket-clist-GetNext(po);pSock-Send(char *)&head, sizeof(Header);/向客戶端發(fā)送離線用戶列表pSock-Send(LPCTSTR)user_info, user_info.GetLength();CString CChatServerDlg:InsertLeaveMsg(CString str)CString array3;int k = 0; /k 用于標(biāo)志數(shù)組 array 的當(dāng)前單元for( int i=0; iOpen(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=students.m

34、db,adModeUnknown); m_pRs.CreateInstance(_uuidof(Recordset);m_pRs-Open(select * from table1,_variant_t(IDispatch *)m_pCon,true),adOpenStatic,adLockOptimistic,adCmdText);while(!m_pRs-adoEOF)vFieldValue = m_pRs-GetCollect(strName); strFieldValue = (LPCTSTR)_bstr_t(vFieldValue);if (strFieldValue = array

35、0) / 目的主機(jī)名m_pRs-PutCollect(sourceName, _variant_t(array1); / 保存源主機(jī)名 m_pRs-PutCollect(leaveMessage,_variant_t(array2); / 保存消息容 m_pRs-MoveNext();m_pRs-Close();return strFieldValue;CString CChatServerDlg:QueryLeaveMsg(CString str)CString strSourceName;CString strLeaveMsg;/初始化環(huán)境:CoInitialize(NULL);/創(chuàng)建并打

36、開數(shù)據(jù)庫連接對(duì)象_variant_t vFieldValue;CString strFieldValue;m_pCon.CreateInstance(_uuidof(Connection); m_pCon-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=students.mdb,adModeUnknown); m_pRs.CreateInstance(_uuidof(Recordset);m_pRs-Open(selectfromtable1,_variant_t(IDispatch*)m_pCon,true),adOpenStatic,ad

37、LockOptimistic,adCmdText);while(!m_pRs-adoEOF)vFieldValue = m_pRs-GetCollect(strName);strFieldValue = (LPCTSTR)_bstr_t(vFieldValue);if(strFieldValue=str)vFieldValue = m_pRs-GetCollect(sourceName); / 得到 源主機(jī)名 是誰發(fā)過來的消息 strSourceName = (LPCTSTR/*char*/)_bstr_t(vFieldValue);vFieldValue = m_pRs-GetCollect

38、(leaveMessage);strLeaveMsg = (LPCTSTR/*char*/)_bstr_t(vFieldValue);m_pRs-MoveNext();/移動(dòng)到下一條記錄m_pRs-Close(); / 關(guān)閉數(shù)據(jù)庫return (&+strSourceName+&+strLeaveMsg+&);void CChatServerDlg:OnStart()/ TODO: Add your control notification handler code hereASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABO

39、UTBOX AppendMenu(MF_SEPARA TOR); pSysMenu-AppendMenu(MF_STRING , IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Ad

40、d extra initialization hereUpdateData(FALSE);:CoInitialize(NULL);/創(chuàng)建并打開數(shù)據(jù)庫連接對(duì)象_variant_t vFieldValue;CString strFieldValue;CString str;int num=0; /定義數(shù)據(jù)庫中 賬號(hào)的個(gè)數(shù) m_pCon.CreateInstance(_uuidof(Connection);m_pCon-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=students.mdb,adModeUnknown); m_pRs.Create

41、Instance(_uuidof(Recordset);m_pRs-Open(select * from table1,_variant_t(IDispatch *)m_pCon,true),adOpenStatic,adLockOptimistic,adCmdText);while(!m_pRs-adoEOF) vFieldValue = m_pRs-GetCollect(strName); strFieldValue = (LPCTSTR)_bstr_t(vFieldValue);str += strFieldValue + &;num+; m_pRs-MoveNext(); m_pRs-

42、Close();CString array20;int k = 0; /k 用于標(biāo)志數(shù)組 array 的當(dāng)前單元for( int i=0; istr.GetLength(); i+ ) /i 用于記錄 str 變量的當(dāng)前字符if(i != (str.GetLength() - 1)if ( stri=& )k +;elsearrayk = arrayk + stri;for (int n=0; nReplaceSel( 服務(wù)器初始化成功 .rn); GetDlgItem(IDC_START)-EnableWindow(false);return;5.1.2 客戶端的實(shí)現(xiàn)代碼a. AskDlg

43、類 void CAskDlg:OnOK() / TODO: Add extra validation hereUpdateData();if(m_Nick=|m_Pass=|m_PassAgain=)AfxMessageBox( 用戶名或密碼不能為空 ,請(qǐng)?jiān)俅屋斎?!); return; if(m_Pass!=m_PassAgain)AfxMessageBox( 前后輸入的密碼不一致 ,請(qǐng)?jiān)俅屋斎?!); return;/ 編輯用戶信息并存儲(chǔ)到一個(gè)字符串里 CString str;/ 獲取性別 CString strSex;UINT nID=GetCheckedRadioButton(IDC_

44、RADIO_MAN,IDC_RADIO_WOMAN);GetDlgItemText(nID,strSex);/AfxMessageBox(m_Country); if(m_RealName=)m_RealName= ;if(m_Country=)m_Country= ;str += (m_Nick+&); /將用戶信息保存在字符串中 ,設(shè)置分隔符 &str += (m_Pass+&);str += (m_RealName+&);str += (strSex+&);str += (m_Country+&);/ 發(fā)送用戶信息 Header head;head.type = ASK_NUM; hea

45、d.len = str.GetLength();m_pSocket-Send(char *)&head,sizeof(Header); m_pSocket-Send(str,str.GetLength();c. ClientSocket 類void CClientSocket:OnReceive(int nErrorCode)char buffsizeof(Header); memset(buff,0,sizeof(buff);Receive(buff,sizeof(buff);Header *header = (Header*)buff;int length = header-len;char type = header-type;/ 判斷消息類型并分別予以響應(yīng) if (type = RECV_LEA VEMESSAGE)char buff1000; memset(buff,0,sizeof(buff);Receive(buff, sizeof(buff);CString strTemp = buff;CString array3;int k = 0;/k 用于標(biāo)志數(shù)組 array 的當(dāng)前單元for( int i=0; iShowLeaveMsg(strMsg);if(type = ASK_NUM) askDlg-AskS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論