用MFCCSocket類實現的網絡聊天室_第1頁
用MFCCSocket類實現的網絡聊天室_第2頁
用MFCCSocket類實現的網絡聊天室_第3頁
已閱讀5頁,還剩15頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、用CSocket類實現的網絡聊天室一、效勞器端應用程序Ts.exe的實現步驟1、建立“基于對話框類型的 MFC工程工程名稱 T&按照向導進行設置,當翻開“高級功能設置頁面時,勾 選“Windows套接字選項,如下圖,其他步驟采用默認值即可。2、界面控件設計。在對話框資源編輯窗口中設計如下圖界面,界面上控件的屬性按照下表設置。'-13甌更童般器亙I,監聽喘口號:莎例漏輔框監聽序止屈秦聊天室在線人數;序號控件類型ID屬性值1A& Static TextIDC_STATICCapti on監聽端口號:2bH Edit ControlIDC_EDIT_PORT3Q Bdttor

2、iIDC_BUTTON_LISTENCapti on監聽4CJ ButtoriIDOKCapti on停止效勞DisabledTrue5|(>B LNt SoxID_LIST_MSGSortFalse6座 Static TextIDC_STATIC_NUMCapti on聊天室在線人數:03、翻開“ MFC類向導,按照下表設置控件在 CTsDIg類中的成員變量,效果如下圖;控件ID成員變量名稱類別變量類型IDC_STATIC_NUMm_strNumValueCStri ngIDC_EDIT_PORTm_n PortValueUINTIDC_BUTTON_LISTENm_bt nListe

3、 nCo ntrolCButt onIDOKm_bt nCloseCo ntrolCButt onIDC_LIST_MSGm_listMsgCo ntrolCListBox4、選擇菜單“工程-> “添加類,添加一個“ MFC類:CMsg,基類選擇CObject,如下圖。EC褰-s-tu z-e-irtLr持.麗ft;URL仏HP溟忻Visual L+CLR如裝Vi Idfil C + fWC妾Vidbual C+ATI甘甲他VAua C+ +ATI測Visual C+tA1L用山宛Vbudl C+AIL JLtm y:馬有Vi-uaH C-+-+ATI 工W-Sufill C+'

4、pindcrVisua 1 C+FpeLib 中鶴 MFL 獎Visual t+ATL Active jensr PageViSUal C + 4Vlsuall E+ax 曲中的忖F獎Visual C + +FT璋:Viija C-n-訴抑Micvowft痢諸環ff*C:為CMsg添加兩個成員變量:CString m_strText;字符串成員,消息文本BOOL m_bClose; /退出聊天室標識MFC接下來,在 Msg.h文件中添加 DECLARE_SERIA宏,在Msg.cpp文件中添加IMPLEMENT_SERIA宏;最后,使用 類向導添加虛函數 Serialize。,如下圖。CMsg

5、類的代碼如下:/ Msg.h#pragma once/ CMsg命令目標class CMsg : public CObjectDECLARE_SERIAL(CMsg)public :CMsg();virtual CMsg();public :CString m_strText;/字符串成員,消息文本BOOL m_bClose; /退岀聊天室標識 virtual void Serialize(CArchive& ar);/ Msg.cpp :實o| i現?文?件t#in elude "stdafx.h"#i nclude "Ts.h"#i nclu

6、de "Msg.h"/ CMsgIMPLEMENT_SERIAL(CMsg,CObject,0)CMsg:CMsg()CMsg:CMsg()void CMsg:Serialize(CArchive& ar)if (ar.IsStoring()/ stor ing codear<<m_strText<<m_bClose;else/ loadi ng codear»m_strText»m_bClose;5、從CSocket類派生兩個套接字類,一個名為CLSocke,專用于監聽客戶機端的連接請求;另一個名為CCSocke,用于與

7、客戶機建立連接并交換數據。操作步驟為:選擇菜單“工程-> “添加類,在彈出的對話框中選擇“MFC類項,單擊“添加按鈕;然后在彈出的“MFC添加類向導窗口中輸入類名,并選擇基類為CSocket,如圖所示。6、使用"MFC類向導"為CLSocket類添加On Accept事件處理函數,操作如下圖。7、使用"MFC類向導"為CCSocket類添加On Receive事件處理函數,操作如下列圖所示。CCSocket類添加一個指向對話框類的指針變量:8、分別為CLSocket和CTsDIg* m_pDlg;為防止對話框類與套接字類交叉引用,在類的定義前添加c

8、lass CTsDIg;修改CLSocket和 CCSocket類的構造函數,添加一個Bipragma once/ CLSocket命倉目標CTjBIs;Iclass CLSocket j public CSocket public:CLSocket (CTsDIg* pDlf);virtual CLSocket ():virtual void OnAccept(unt nErrorCoie), public:CTsDIg* n_pDLg:TCTsDIg啖型的參數。如下圖。'Elffpragma onceH仇帥匸k眈命令目標CTwDlg;:Delias CCSacket : publi

9、c CSocketIIpuhliL::CCSocket (CTsDIg* pDlg):|virtual CCSocket ();virtual void OnEeceive(int n£rrorCoda): put»lic:|CTsDIg* m_pDlg;m 在LSocket.cpp中添加頭文件的引用,并完成CLSocket類構造函數的修改:#i nclude "TsDIg.h"CLSocket:CLSocket(CTsDIg *pDlg)this ->m_pDIg=pDIg;同樣,在CSocket.cpp中添加頭文件的引用,并完成CCSocket

10、類構造函數的修改:#in clude "TsDIg.h"CCSocket:CCSocket(CTsDlg *pDlg) this ->m_pDlg=pDlg;9、 為CCSocket類添加成員變量和成員函數的定義(CSocket.h)。成員變量:CSocketFile* m_pFile; /CSocketFile 對象指針變量CArchive* m_pArIn; / 用于輸出的 CArchive 對象指針CArchive* m_pArOut; / 用于輸出的 CArchive 對象指針 成員函數:void ReceiveMsg(CMsg* pMsg);/ 接收消息vo

11、id SendMsg(CMsg* pMsg); / 發送消息void Initialize();/ 初始化在CSocket.cpp中,實現這三個成員函數,并修改CCSocket類的析構函數:void CCSocket:Initialize()m_pFile=new CSocketFile(this,TRUE);m_pArIn=new CArchive(m_pFile,CArchive:load); m_pArOut=new CArchive(m_pFile,CArchive:store);void CCSocket:SendMsg(CMsg *pMsg)if(m_pArOut!=NULL)pM

12、sg->Serialize(*m_pArOut); m_pArOut->Flush();void CCSocket:ReceiveMsg(CMsg *pMsg) pMsg->Serialize(*m_pArIn);CCSocket:CCSocket()m_pDlg=NULL;if(m_pArOut!=NULL)m_pArOut->Close(); delete m_pArOut; m_pArOut=NULL; if(m_pArIn!=NULL) m_pArIn->Close(); delete m_pArIn;m_pArIn=NULL;if(m_pFile!=NU

13、LL)m_pFile->Close(); delete m_pFile;m_pFile=NULL;10、在TsDIg.h文件(CTsDIg類的定義文件)中添加下面兩個文件的引用:#include "CSocket.h"#incIude "LSocket.h"并添加成員變量:CLSocket* m_pLSocket; / 監聽套接字指針CPtrList m_connList; / 連接列表 和成員函數的聲明:void backClient(CMsg* pMsg); / 向聊天室所有客戶機轉發消息 void OnReceive(CCSocket* pS

14、ocket);/ 獲取客戶機消息 void OnAccept();/ 接受連接請求在 TsDlg.cpp 中,實現這三個成員函數:void CTsDlg:OnAccept()CCSocket *pSocket= new CCSocket( this );if (m_pLSocket->Accept(*pSocket) pSocket->Initialize(); m_connList.AddTail(pSocket);CString strTemp; strTemp.Format(L " 在線人數 :%d",m_connList.GetCount(); m_st

15、rNum=strTemp;UpdateData(FALSE);elsedelete pSocket;void CTsDlg:OnReceive(CCSocket *pSocket)static CMsg msg;do pSocket->ReceiveMsg(&msg); m_listMsg.AddString(msg.m_strText); backClient(&msg);if (msg.m_bClose) pSocket->Close(); POSITION pos,temp;CCSocket *pTemp;for (pos=m_connList.GetHead

16、Position();pos!=NULL;)temp=pos; pTemp=(CCSocket*)m_connList.GetNext(pos); if (pTemp=pSocket) m_connList.RemoveAt(temp); CString strTemp;strTemp.Format(L " 在線人數 :%d" ,m_connList.GetCount(); m_strNum=strTemp;UpdateData(FALSE);delete pSocket;break ; while (!pSocket->m_pArIn->IsBufferEmp

17、ty();void CTsDlg:backClient(CMsg *pMsg)CCSocket *pSocket;for (POSITION pos=m_connList.GetHeadPosition();pos!=NULL;) pSocket=(CCSocket*)m_connList.GetNext(pos); pSocket->SendMsg(pMsg);11 、完成 CLSocket 類的 OnAccept() 函數的代碼(第 6 步添加的虛函數): void CLSocket:OnAccept( int nErrorCode)CSocket:OnAccept(nErrorCo

18、de);if (m_pDlg!=NULL)m_pDlg->OnAccept();完成 CCSocket 類的 OnAccept() 函數的代碼(第 7 步添加的虛函數): void CCSocket:OnReceive( int nErrorCode)CSocket:OnReceive(nErrorCode); m_pDlg->OnReceive( this );方法可以在對話框資源編輯窗口雙12、為對話框CTsDIg的“監聽和“停止效勞兩個按鈕添加消息響應函數。 擊對應按鈕,或使用類向導) void CTsDIg:OnBnCIickedButtonListen()/ TODO:

19、Add your controI notification handIer code here UpdateData(TRUE);m_pLSocket=newCLSocket( this );if (!m_pLSocket->Create(m_nPort)deIete m_pLSocket; m_pLSocket=NULL; AfxMessageBox(L" 創立監聽套接字錯誤 "); return ;if (!m_pLSocket->Listen()deIete m_pLSocket;m_pLSocket=NULL;AfxMessageBox(L"

20、啟動監聽錯誤 ");return ;GetDlgItem(IDC_EDIT_PORT)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_LISTEN)->EnableWindow(FALSE);GetDlgItem(IDOK)->EnableWindow(TRUE);void CTsDlg:OnBnClickedOk()/ TODO: Add your control notification handler code hereCMsg msg;msg.m_strText=L " 效勞器終止效勞 "delet

21、e m_pLSocket;m_pLSocket=NULL;CCSocket* pSocket;while (!m_connList.IsEmpty()pSocket=(CCSocket*)m_connList.RemoveHead();pSocket->SendMsg(&msg);delete pSocket;while (m_listMsg.GetCount()!=0)m_listMsg.DeleteString(0);GetDlgItem(IDC_EDIT_PORT)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_LISTEN)-&

22、gt;EnableWindow(TRUE);GetDlgItem(IDOK)->EnableWindow(FALSE);13、最后,在CTsdlg類的OninitDialog()函數中添加如下初始化代碼:m_nPort=8000;UpdateData(FALSE);GetDlgItem(IDOK)->EnableWindow(FALSE);效果如下:r ROOL CTsPlg: Onlm-tDiaLog (): OnlnitD®QgO ;hl /將"關于菜單隕游加劉系統菜單中。/ IDN_ABOUTEOZ必須左系統命令范圉內。AS SEKT (IDM.AEOUT

23、EOX 血 OyFFFO) = ID1I_ABOUTBOK): ASSEET(IDn_ABOUT0OK < OkFOOO):CMerru* pSysMeru = G-et SyatenJIerru (FALSE):if (pSyslrtenu 匕 NULL)BOOL beValid;C String st i About Menu: tName'falid 二 st r At out Menu. LoadStrin j (ID S_AE OUTBOX): ASSE町(測伽應也11心: if (I sttAboutlflftnu. IsEmptyO)pSysrtenu->Ap

24、perdKenu (MF_ 3EFAKATOK): pSysrteifiu->App endWenu (MF_STRINiG, IDM_ AB OUTBOX, st r About Henn);H設置此對話框的圏標。肖應用程聞圭窗口不是對話框時,框架將自動 /凱行曲操惟Sat Icon Gn.KIccn, TRUE) :/ 設羞大圖標Set I con (mh.1 coi>, FAL SE) ;/ iSS 小囲標H TOD6在址添加額外的初給化代碼ni_nPort=SOOO :Upda-teDact a(FALSE);Dl(It en (IDOKj->ErLaLleWindo

25、w (FALSE);return TRUE; /隱菲將:M點謾苦到桂件,否那么返回TRUE二、客戶端應用程序(Tc.exe)的實現步驟1、建立“基于對話框類型的 MFC工程工程名稱 Tc。按照向導進行設置,當翻開“高級功能設置頁面時,勾 選“Windows套接字選項,如下圖,其他步驟采用默認值即可。2、界面控件設計。在對話框資源編輯窗口中設計如下圖界面,界面上控件的屬性按照下表設置。S3Etc:喜戶咎例如編擅框_嚴閃隸緒例如編輯L端口:例如蝙輯框;T C消柱奈血編摑框序號控件類型ID屬性值1abl Edit ControlIDC_EDIT_CNAME2abl Edit ControlIDC_E

26、DIT_SNAME3abl Edit ControlIDC_EDIT_PORT4abl Edit ControlIDC_EDIT_MSG5雨 List BoxID_LIST_MSGSortFalse6|Q ButtoriIDC_BUTTON_CLOSECapti on退岀7CJ ButtonIDC_BUTTON_CONNCapti on連接8Q ButtoriIDOKCapti on發送9A& Static TextIDC_STATICCapti on客戶名:10A?tic TextIDC_STATICCapti on效勞器名:11Ai Static TextIDC_STATICCap

27、ti on端口:12座 Static TextIDC_STATICCapti on消息:3、翻開“ MFC類向導,按照下表設置控件在 CTsDIg類中的成員變量,效果如下圖;控件ID成員變量名稱類別變量類型IDC_EDIT_CNAMEm_strCNameValueCStri ngIDC_EDIT_SNAMEm_strSNameValueCStri ngIDC_EDIT_PORTm_n PortValueUINTIDC_EDIT_MSGm_strMsgValueCStri ngIDC_BUTTON_CONNm_bt nConnCo ntrolCButt onIDOKm_SendCo ntrolC

28、Butt onID_BUTTON_CLOSEm_bt nCloseCo ntrolCButt onIDC_LIST_MSGm_listMsgCo ntrolCListBox4、創立CMsg類。方法同效勞器端應用程序 Ts.exe步驟4。也可以直接將效勞器端應用程序的CMsg類添加到當前工程中,方法為:1首先將Msg.h和Msg.cpp兩個文件復制到當前工程目錄下;2 然后選擇菜單“工程-> “添加現有項,在彈出的對話框中選中這兩個文件,單擊“添加按鈕,如圖所 示;3這時在類視圖中會出現 CMsg類,如下圖。4翻開CMsg類的實現文件Msg.cpp,將其中的頭文件引用:#in elude

29、"Ts.h"改為:#i nclude "Tc.h"5、從CSocket類派生一個套接字類 CCSocke,用于與客戶機建立連接并交換數據。如下圖:6、使用類向導,為 CCSocket類添加On Receive事件處理函數,如下圖。8、為CCSocket類添加一個指向對話框類的指針變量:CTcDIg* m_pDlg;為防止對話框類與套接字類交叉引用,在類的定義前添加class CTcDIg;修改CCSocket類的構造函數,添加一個CTcDIg啖型的參數。如下圖。Oltpragma once/ XSock毗命令目標plassTrcPlg;class CCS

30、cictsl : public CSocketvittual TCSocket ():victual vcid OftReceiveCint nETrorCode):| CTcDIg* m_pDlg; |;在CSocket.cpp中添加頭文件的引用,并完成CCSocket類構造函數的修改:#i nclude "TcDIg.h"CCSocket:CCSocket(CTcDIg* pDlg)m_pDIg=pDIg;9、在TcDIg.h文件(CTsDIg類的定義文件)中添加下面的頭文件引用:#i nclude "CSocket.h"并添加成員變量:CCSock

31、et* m_pSocket; /套接字對象指針CSocketFile *m_pFile;/CSoketFile 對象指針CArchive *m_pArchiveln; 用于輸入的 CArchive 對象CArchive *m_pArchiveOut; 用于輸出的 CArchive 對象和成員函數的聲明:void On Receive。;/ 接收信息void ReceiveMsg();接收效勞器發送來的消息void SendMsg(CString& strText,bool st);/ 向效勞器發送消息在TcDIg.cpp中,添加對 Msg.h文件的引用和實現這三個成員函數:#i ncl

32、ude "Msg.h"void CTcDIg:OnReceive()doReceiveMsg();if (m_pSocket=NULL)return ;while (!m_pArchiveIn->lsBufferEmpty();void CTcDIg:ReceiveMsg()CMsg msg;TRYmsg.Serialize(*m_pArchiveIn);m_listMsg.AddString(msg.m_strText);CATCH(CFileException,e)CString strTemp;strTemp=L"服Ot務?器??重?置?連C接? !

33、e連C接?關?閉a ?" m_listMsg.AddStri ng(strTemp);msg.m_bClose=TRUE;m_pArchiveOut->Abort();delete m_pArchiveIn;m_pArchiveIn=NULL;delete m_pArchiveOut;m_pArchiveOut=NULL;delete m_pFile;m_pFile=NULL;delete m_pSocket;m_pSocket=NULL;END_CATCHvoid CTcDlg:SendMsg(CString& strText, bool st)if (m_pArch

34、iveOut!=NULL)CMsg msg;msg.m_strText=strText; msg.m_bClose=st; msg.Serialize(*m_pArchiveOut); m_pArchiveOut->Flush();方法可以在對話框資源編輯窗10、為對話框CTcDIg的“退出、“連接和“發送三個按鈕添加消息響應函數??陔p擊對應按鈕,或使用類向導void CTcDlg:OnBnClickedButtonConn()/ TODO: Add your control notification handler code here UpdateData(TRUE);m_pSocke

35、t=newCCSocket( this );if (!m_pSocket->Create()delete m_pSocket;m_pSocket=NULL;AfxMessageBox(L"套接字創立錯誤"); return ;if (!m_pSocket->Connect(m_strSName,m_nPort)delete m_pSocket;m_pSocket=NULL;AfxMessageBox(L" 無法連接到效勞器 "); return ;m_pFile= newCSocketFile(m_pSocket); m_pArchiveIn

36、= newCArchive(m_pFile,CArchive:load); m_pArchiveOut= newCArchive(m_pFile,CArchive:store); UpdateData(TRUE);CString strTemp;strTemp=m_strCName+L": 進入聊天室 "SendMsg(strTemp,FALSE); GetDlgItem(IDC_EDIT_MSG)->EnableWindow(TRUE);GetDlgItem(IDOK)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_CLO

37、SE)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_CNAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_SNAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PORT)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CONN)->EnableWindow(FALSE);void CTcDlg:OnBnClickedButtonClose()/ TODO: Add your control notifi

38、cation handler code hereCString strTemp;strTemp=m_strCName+L" 離開聊天室 "SendMsg(strTemp,TRUE);delete m_pArchiveOut; m_pArchiveOut=NULL;delete m_pArchiveIn;m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;m_pSocket->Close();delete m_pSocket;m_pSocket=NULL;while (m_listMsg.GetCount()!=0)m_listM

39、sg.DeleteString(0);GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE);GetDlgItem(IDOK)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_CNAME)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_SNAME)->EnableWindow(TRUE);GetDlgltem(IDC_EDIT_PORT)->E nable

40、Wi ndow(TRUE);GetDlgltem(IDC_BUTTON_CONN)->E nableWi ndow(TRUE);11、翻開類向導,為TcDlg類添加WM_DESTR消息的響應函數,操作如下圖代碼如下:void CTcDlg:OnDestroy()CDialogEx:O nDestroy();/ TODO:在此添加消息處理代碼if (m_pSocket!=NULL)&&(m_pFile匸NULL)&&(m_pArchiveOut匸NULL) CMsg msg;CStri ng strTemp;strTemp=m_strCName+L 離開聊天

41、室!"msg.m_bClose=TRUE;msg.m_strText=strTemp;msg.Serialize(*m_pArchiveOut);m_pArchiveOut->Flush();delete m_pArchiveOut; m_pArchiveOut=NULL; delete m_pArchiveIn; m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;if (m_pSocket!=NULL)BYTE Buffer50; m_pSocket->ShutDown(); while (m_pSocket->Receive(Buffer,50)>0);delete m_pSocket; m_pSocket=NULL;12、完成CCSocke類的On Receive。函數(第6步添加的虛函數),代碼如下: void CCSocket:OnReceive( int nErrorCode)/ TODO: 在此添加專用代碼和 / 或調用基類 CSocket:OnReceive(nErrorCo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論