


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、用CSocket類實現(xiàn)的網(wǎng)絡(luò)聊天室一、效勞器端應(yīng)用程序Ts.exe的實現(xiàn)步驟1、建立“基于對話框類型的 MFC工程工程名稱 T&按照向?qū)нM行設(shè)置,當翻開“高級功能設(shè)置頁面時,勾 選“Windows套接字選項,如下圖,其他步驟采用默認值即可。2、界面控件設(shè)計。在對話框資源編輯窗口中設(shè)計如下圖界面,界面上控件的屬性按照下表設(shè)置。'-13甌更童般器亙I,監(jiān)聽喘口號:莎例漏輔框監(jiān)聽序止屈秦聊天室在線人數(shù);序號控件類型ID屬性值1A& Static TextIDC_STATICCapti on監(jiān)聽端口號:2bH Edit ControlIDC_EDIT_PORT3Q Bdttor
2、iIDC_BUTTON_LISTENCapti on監(jiān)聽4CJ ButtoriIDOKCapti on停止效勞DisabledTrue5|(>B LNt SoxID_LIST_MSGSortFalse6座 Static TextIDC_STATIC_NUMCapti on聊天室在線人數(shù):03、翻開“ MFC類向?qū)В凑障卤碓O(shè)置控件在 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痢諸環(huán)ff*C:為CMsg添加兩個成員變量:CString m_strText;字符串成員,消息文本BOOL m_bClose; /退出聊天室標識MFC接下來,在 Msg.h文件中添加 DECLARE_SERIA宏,在Msg.cpp文件中添加IMPLEMENT_SERIA宏;最后,使用 類向?qū)砑犹摵瘮?shù) 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現(xiàn)?文?件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,專用于監(jiān)聽客戶機端的連接請求;另一個名為CCSocke,用于與
7、客戶機建立連接并交換數(shù)據(jù)。操作步驟為:選擇菜單“工程-> “添加類,在彈出的對話框中選擇“MFC類項,單擊“添加按鈕;然后在彈出的“MFC添加類向?qū)Т翱谥休斎腩惷?,并選擇基類為CSocket,如圖所示。6、使用"MFC類向?qū)?quot;為CLSocket類添加On Accept事件處理函數(shù),操作如下圖。7、使用"MFC類向?qū)?quot;為CCSocket類添加On Receive事件處理函數(shù),操作如下列圖所示。CCSocket類添加一個指向?qū)υ捒蝾惖闹羔樧兞?8、分別為CLSocket和CTsDIg* m_pDlg;為防止對話框類與套接字類交叉引用,在類的定義前添加c
8、lass CTsDIg;修改CLSocket和 CCSocket類的構(gòu)造函數(shù),添加一個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啖型的參數(shù)。如下圖。'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類構(gòu)造函數(shù)的修改:#i nclude "TsDIg.h"CLSocket:CLSocket(CTsDIg *pDlg)this ->m_pDIg=pDIg;同樣,在CSocket.cpp中添加頭文件的引用,并完成CCSocket
10、類構(gòu)造函數(shù)的修改:#in clude "TsDIg.h"CCSocket:CCSocket(CTsDlg *pDlg) this ->m_pDlg=pDlg;9、 為CCSocket類添加成員變量和成員函數(shù)的定義(CSocket.h)。成員變量:CSocketFile* m_pFile; /CSocketFile 對象指針變量CArchive* m_pArIn; / 用于輸出的 CArchive 對象指針CArchive* m_pArOut; / 用于輸出的 CArchive 對象指針 成員函數(shù):void ReceiveMsg(CMsg* pMsg);/ 接收消息vo
11、id SendMsg(CMsg* pMsg); / 發(fā)送消息void Initialize();/ 初始化在CSocket.cpp中,實現(xiàn)這三個成員函數(shù),并修改CCSocket類的析構(gòu)函數(shù):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; / 監(jiān)聽套接字指針CPtrList m_connList; / 連接列表 和成員函數(shù)的聲明:void backClient(CMsg* pMsg); / 向聊天室所有客戶機轉(zhuǎn)發(fā)消息 void OnReceive(CCSocket* pS
14、ocket);/ 獲取客戶機消息 void OnAccept();/ 接受連接請求在 TsDlg.cpp 中,實現(xiàn)這三個成員函數(shù):void CTsDlg:OnAccept()CCSocket *pSocket= new CCSocket( this );if (m_pLSocket->Accept(*pSocket) pSocket->Initialize(); m_connList.AddTail(pSocket);CString strTemp; strTemp.Format(L " 在線人數(shù) :%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 " 在線人數(shù) :%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() 函數(shù)的代碼(第 6 步添加的虛函數(shù)): void CLSocket:OnAccept( int nErrorCode)CSocket:OnAccept(nErrorCo
18、de);if (m_pDlg!=NULL)m_pDlg->OnAccept();完成 CCSocket 類的 OnAccept() 函數(shù)的代碼(第 7 步添加的虛函數(shù)): void CCSocket:OnReceive( int nErrorCode)CSocket:OnReceive(nErrorCode); m_pDlg->OnReceive( this );方法可以在對話框資源編輯窗口雙12、為對話框CTsDIg的“監(jiān)聽和“停止效勞兩個按鈕添加消息響應(yīng)函數(shù)。 擊對應(yīng)按鈕,或使用類向?qū)? 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" 創(chuàng)立監(jiān)聽套接字錯誤 "); return ;if (!m_pLSocket->Listen()deIete m_pLSocket;m_pLSocket=NULL;AfxMessageBox(L"
20、啟動監(jiān)聽錯誤 ");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()函數(shù)中添加如下初始化代碼:m_nPort=8000;UpdateData(FALSE);GetDlgItem(IDOK)->EnableWindow(FALSE);效果如下:r ROOL CTsPlg: Onlm-tDiaLog (): OnlnitD®QgO ;hl /將"關(guān)于菜單隕游加劉系統(tǒng)菜單中。/ IDN_ABOUTEOZ必須左系統(tǒng)命令范圉內(nèi)。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町(測伽應(yīng)也11心: if (I sttAboutlflftnu. IsEmptyO)pSysrtenu->Ap
24、perdKenu (MF_ 3EFAKATOK): pSysrteifiu->App endWenu (MF_STRINiG, IDM_ AB OUTBOX, st r About Henn);H設(shè)置此對話框的圏標。肖應(yīng)用程聞圭窗口不是對話框時,框架將自動 /凱行曲操惟Sat Icon Gn.KIccn, TRUE) :/ 設(shè)羞大圖標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二、客戶端應(yīng)用程序(Tc.exe)的實現(xiàn)步驟1、建立“基于對話框類型的 MFC工程工程名稱 Tc。按照向?qū)нM行設(shè)置,當翻開“高級功能設(shè)置頁面時,勾 選“Windows套接字選項,如下圖,其他步驟采用默認值即可。2、界面控件設(shè)計。在對話框資源編輯窗口中設(shè)計如下圖界面,界面上控件的屬性按照下表設(shè)置。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發(fā)送9A& Static TextIDC_STATICCapti on客戶名:10A?tic TextIDC_STATICCapti on效勞器名:11Ai Static TextIDC_STATICCap
27、ti on端口:12座 Static TextIDC_STATICCapti on消息:3、翻開“ MFC類向?qū)?,按照下表設(shè)置控件在 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、創(chuàng)立CMsg類。方法同效勞器端應(yīng)用程序 Ts.exe步驟4。也可以直接將效勞器端應(yīng)用程序的CMsg類添加到當前工程中,方法為:1首先將Msg.h和Msg.cpp兩個文件復(fù)制到當前工程目錄下;2 然后選擇菜單“工程-> “添加現(xiàn)有項,在彈出的對話框中選中這兩個文件,單擊“添加按鈕,如圖所 示;3這時在類視圖中會出現(xiàn) CMsg類,如下圖。4翻開CMsg類的實現(xiàn)文件Msg.cpp,將其中的頭文件引用:#in elude
29、"Ts.h"改為:#i nclude "Tc.h"5、從CSocket類派生一個套接字類 CCSocke,用于與客戶機建立連接并交換數(shù)據(jù)。如下圖:6、使用類向?qū)В瑸?CCSocket類添加On Receive事件處理函數(shù),如下圖。8、為CCSocket類添加一個指向?qū)υ捒蝾惖闹羔樧兞浚篊TcDIg* m_pDlg;為防止對話框類與套接字類交叉引用,在類的定義前添加class CTcDIg;修改CCSocket類的構(gòu)造函數(shù),添加一個CTcDIg啖型的參數(shù)。如下圖。Oltpragma once/ XSock毗命令目標plassTrcPlg;class CCS
30、cictsl : public CSocketvittual TCSocket ():victual vcid OftReceiveCint nETrorCode):| CTcDIg* m_pDlg; |;在CSocket.cpp中添加頭文件的引用,并完成CCSocket類構(gòu)造函數(shù)的修改:#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 對象和成員函數(shù)的聲明:void On Receive。;/ 接收信息void ReceiveMsg();接收效勞器發(fā)送來的消息void SendMsg(CString& strText,bool st);/ 向效勞器發(fā)送消息在TcDIg.cpp中,添加對 Msg.h文件的引用和實現(xiàn)這三個成員函數(shù):#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務(wù)?器??重?置?連C接? !
33、e連C接?關(guān)?閉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的“退出、“連接和“發(fā)送三個按鈕添加消息響應(yīng)函數(shù)??陔p擊對應(yīng)按鈕,或使用類向?qū)oid 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"套接字創(chuàng)立錯誤"); 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、翻開類向?qū)?,為TcDlg類添加WM_DESTR消息的響應(yīng)函數(shù),操作如下圖代碼如下: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。函數(shù)(第6步添加的虛函數(shù)),代碼如下: void CCSocket:OnReceive( int nErrorCode)/ TODO: 在此添加專用代碼和 / 或調(diào)用基類 CSocket:OnReceive(nErrorCo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年山東聊城高三一模數(shù)學試卷試題答案詳解
- 協(xié)議出讓土地合同范例
- 業(yè)務(wù)服務(wù)咨詢合同范例
- 專題03 天氣與氣候-2025年中考地理一輪復(fù)習知識清單(背誦版)
- 同城買貓合同范例
- sd卡采購合同范例
- 班主任如何關(guān)注學生的情緒變化計劃
- 以美術(shù)為載體的主題教育活動計劃
- 企業(yè)安全成本的控制與管理計劃
- 如何選擇合適的投資渠道計劃
- MOOC 知識創(chuàng)新與學術(shù)規(guī)范-南京大學 中國大學慕課答案
- 2024年黃河水利職業(yè)技術(shù)學院單招職業(yè)技能測試題庫及答案解析
- 聚焦國內(nèi)外時政重要新聞熱點新聞播報課件
- 交警安全防護
- 車輛維護定期檢查
- 法國大革命完整版
- 急性腦血管病的護理查房
- 膿毒血癥指南(醫(yī)生版)課件
- 經(jīng)典美味的蛋炒飯
- 管理學基礎(chǔ)(第3版)全套教學課件
- 綜合性學習答題技巧課件
評論
0/150
提交評論