版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 課程名稱(chēng): VC++課程設(shè)計(jì) </p><p> 設(shè)計(jì)題目: 聊天室程序設(shè)計(jì) </p><p> 院 系: 計(jì)算機(jī)科學(xué)與技術(shù)系 </p>
2、<p> 班 級(jí): </p><p> 設(shè) 計(jì) 者: </p><p> 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p> 設(shè)計(jì)時(shí)間: 2011.8.
3、25-----2011.9.7 </p><p> 《VC++課程設(shè)計(jì)》驗(yàn)收及成績(jī)?cè)u(píng)定表(項(xiàng)目組)</p><p><b> 課程設(shè)計(jì)任務(wù)書(shū)</b></p><p> VC++課程設(shè)計(jì)報(bào)告</p><p><b> 軟硬件運(yùn)行環(huán)境:</b></p&
4、gt;<p> Intel® Pentium® 2及以上處理器,32M以上內(nèi)存,4G以上硬盤(pán)</p><p> Microsoft® Windows? XP操作系統(tǒng)及以上版本</p><p> 800*600或以上的屏幕分辨率</p><p><b> 開(kāi)發(fā)環(huán)境:</b></p>
5、<p> Intel® CORE i5® 2.8 GHz,2內(nèi)存,320G硬盤(pán)</p><p> Microsoft® Windows? XP Professional</p><p> Microsoft® Visual C++ 6.0</p><p><b> 問(wèn)題及難點(diǎn)所在</b>
6、;</p><p><b> 要解決的問(wèn)題:</b></p><p> 如何與服務(wù)器端建立連接,如何接收服務(wù)器端發(fā)給客戶端的消息,相應(yīng)的處理這些消息。還有就是如何提取出服務(wù)器端發(fā)給客戶端的所有的客戶昵稱(chēng),然后更新客戶端的用戶列表。最后是一些按鈕的響應(yīng)函數(shù)的編寫(xiě)。</p><p><b> 涉及算法的思想</b><
7、;/p><p> 首先應(yīng)該明白,Windows窗口應(yīng)用程序是基于消息驅(qū)動(dòng)的,這應(yīng)該是貫穿整個(gè)過(guò)程的基本思想。</p><p> 其次跟據(jù)MFC程序的體系結(jié)構(gòu),和大體框架,清楚自己寫(xiě)的代碼應(yīng)該加在哪些地方。實(shí)際編程中善于將控件窗口與一個(gè)變量相聯(lián)系,可以很大的簡(jiǎn)化操作。特別要提到的是程序中更新用戶列表的方法,與服務(wù)器端的算法剛好相反,充分利用FOR循環(huán)并用IF判斷語(yǔ)句來(lái)提取信息。</p&
8、gt;<p><b> 系統(tǒng)的流程圖</b></p><p> 注:這個(gè)流程圖是在另一個(gè)文檔中畫(huà)的,完成后復(fù)制過(guò)來(lái)發(fā)現(xiàn)尺寸不是很好,顯示得很難看,所以采用了截圖的方法,清晰度不是很高,望老師體諒。</p><p><b> 系統(tǒng)的設(shè)計(jì)與分析</b></p><p><b> 第一個(gè)函數(shù):&l
9、t;/b></p><p> void CLoginDlg::OnOK() //登陸窗口的登陸按鈕響應(yīng)函數(shù)。</p><p><b> {</b></p><p> UpdateData();//用來(lái)刷新數(shù)據(jù)的,如果參數(shù)為真,則刷新控件的值到對(duì)應(yīng)的變量,若為假,則方向相反。</p><p> //m_pS
10、ocket->m_strName = this->m_strName;</p><p> if(!m_pSocket->Create())//創(chuàng)建。</p><p><b> {</b></p><p> AfxMessageBox("網(wǎng)絡(luò)創(chuàng)建錯(cuò)誤!??!");</p><p>
11、 m_pSocket->Close();</p><p><b> return;</b></p><p><b> }</b></p><p> if(!m_pSocket->Connect(m_strServer,9999))//連接,參數(shù)分別為服務(wù)器IP和端口號(hào)。</p><p
12、><b> {</b></p><p> AfxMessageBox("連接服務(wù)器失?。。?!");</p><p> m_pSocket->Close();</p><p><b> return;</b></p><p><b> }</
13、b></p><p> Header head;</p><p> head.type = LOGIN_IO;</p><p> head.len = m_strName.GetLength();</p><p> m_pSocket->Send((char *)&head,sizeof(Header));//向服
14、務(wù)器端發(fā)送預(yù)備消息,告知消息類(lèi)型,準(zhǔn)備好接受數(shù)據(jù)。</p><p> m_pSocket->Send(m_strName,m_strName.GetLength());//發(fā)送該客戶端的用戶昵稱(chēng)。</p><p> theApp.m_strName = m_strName;//如果不加此行,用戶的昵稱(chēng)將無(wú)法顯示到聊天窗口</p><p> CDialog
15、::OnOK();//調(diào)用基類(lèi)的ONOK函數(shù),MFC自動(dòng)調(diào)用的。</p><p><b> }</b></p><p><b> 第二個(gè)函數(shù):</b></p><p> void CClientSocket::OnReceive(int nErrorCode) //處理服務(wù)器端發(fā)送的消息</p><
16、;p><b> {</b></p><p> char buff[sizeof(Header)];</p><p> memset(buff,0,sizeof(buff));</p><p> Receive(buff,sizeof(buff));</p><p> Header *header = (H
17、eader*)buff;//這里需要一個(gè)類(lèi)型的轉(zhuǎn)換。</p><p> int length = header->len;</p><p> char type = header->type;</p><p> if(type == SEND_MESSAGE)</p><p><b> {</b>&l
18、t;/p><p> chatDlg->GetMessage();//定義一個(gè)CMyChatDlg *類(lèi)型的chatDlg變量作用就在此體現(xiàn)。</p><p><b> }</b></p><p> if(type == LOGIN_IO)//收到服務(wù)器告知的更新用戶的消息。</p><p><b>
19、{</b></p><p> chatDlg->UpdateUser();//調(diào)用CMyChatDlg類(lèi)中的UpdateUser方法。</p><p><b> }</b></p><p> CSocket::OnReceive(nErrorCode);</p><p><b>
20、}</b></p><p><b> 第三個(gè)函數(shù):</b></p><p> void CMyChatDlg::UpdateUser()//更新用戶列表。</p><p><b> {</b></p><p> char buff[1000];</p><p&
21、gt; memset(buff,0,sizeof(buff));</p><p> m_pSocket->Receive(buff, sizeof(buff),0);</p><p> CString user_info = buff;</p><p> CString array[100];//存放用戶名稱(chēng)</p><p>
22、 int b = 0;</p><p> for( int i=0; i<user_info.GetLength(); i++ )//拆分服務(wù)器端發(fā)來(lái)的用戶名稱(chēng),并用ARRAY數(shù)組來(lái)存儲(chǔ)。</p><p><b> {</b></p><p> if(i != (user_info.GetLength() - 1))//判斷是否已
23、經(jīng)到達(dá)UER_INFO的尾端。</p><p><b> {</b></p><p> if ( user_info[i]=='&' )//判斷是否已經(jīng)到一個(gè)昵稱(chēng)的結(jié)尾。</p><p><b> {</b></p><p> b ++;//用戶加一</p>
24、;<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> array[b] = array[b] + user_info[i];//將一個(gè)用戶名稱(chēng)拷貝到一個(gè)數(shù)組單元中。</p><p&g
25、t;<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> m_num.Format("%d", b+1);//將INT類(lèi)型的b轉(zhuǎn)換為CString類(lèi)型。</p><p> UpdateD
26、ata(FALSE);//變量到控件。</p><p> m_UserList.ResetContent();//置空列表框。</p><p> for(int j=0; j<b+1; j++)</p><p><b> {</b></p><p> m_UserList.AddString(array[j
27、]);//將轉(zhuǎn)換好的用戶名稱(chēng)依次顯示出來(lái)。</p><p><b> }</b></p><p><b> }</b></p><p><b> 第四個(gè)函數(shù):</b></p><p> void CMyChatDlg::OnSend() //響應(yīng)發(fā)送按鈕的函數(shù)。<
28、/p><p><b> {</b></p><p> UpdateData();//控件的值—>變量</p><p> if(m_strMessage == "")</p><p><b> {</b></p><p> AfxMessageB
29、ox("不能發(fā)送空消息?。。?quot;);</p><p> CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);//得到該控件類(lèi)型的對(duì)象地址。</p><p> pEdit->SetFocus();//調(diào)用成員函數(shù)設(shè)置焦點(diǎn)。</p><p><b> return;</b&
30、gt;</p><p><b> }</b></p><p> Header head;</p><p> head.type = SEND_MESSAGE;</p><p> head.len = m_strMessage.GetLength();</p><p> CTime tim
31、e = CTime::GetCurrentTime();//得到系統(tǒng)當(dāng)前時(shí)間。</p><p> CString t = time.Format("%H:%M:%S");//設(shè)置時(shí)間格式。</p><p> CString nikeName = theApp.m_strName;</p><p> CString str =nikeName
32、+ " " + t + "\r\n" +m_strMessage;//把要發(fā)送的信息都存儲(chǔ)在這str變量中。</p><p> m_pSocket->Send((char *)&head,sizeof(Header));//發(fā)送“頭信息”。</p><p> // TODO: Add your control notifi
33、cation handler code here</p><p> if(m_pSocket->Send((LPCTSTR)str, str.GetLength()))//發(fā)送用戶編輯的信息,并判斷Send函數(shù)的返回值。</p><p><b> {</b></p><p> m_strMessage = "";
34、</p><p> UpdateData(FALSE);//變量—>控件的值</p><p> CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);</p><p> pEdit->SetFocus();</p><p><b> }</b><
35、/p><p><b> else</b></p><p><b> {</b></p><p> AfxMessageBox("網(wǎng)絡(luò)傳輸錯(cuò)誤!");</p><p><b> }</b></p><p><b> }&
36、lt;/b></p><p><b> 第五個(gè)函數(shù):</b></p><p> BOOL CMyChatDlg::GetMessage()//由CClientSocket對(duì)象中的OnReceive方法調(diào)用。</p><p><b> {</b></p><p> char buff[1
37、000];//定義一個(gè)數(shù)組來(lái)接受消息。</p><p> memset(buff,0,sizeof(buff));//將數(shù)組全部初始化為0。</p><p> m_pSocket->Receive(buff, sizeof(buff),0);//接受消息。</p><p> CString strTemp = buff;</p><
38、p> strTemp += _T("\r\n");</p><p> m_MessageList.ReplaceSel(strTemp);//用strTemp變量中的內(nèi)容替換消息顯示框控件的當(dāng)前區(qū)域。</p><p> return TRUE;</p><p><b> }</b></p><
39、;p> 運(yùn)行結(jié)果與分析(測(cè)試)</p><p><b> 打開(kāi)服務(wù)器并初始化</b></p><p><b> 一個(gè)用戶登陸服務(wù)器</b></p><p> 客戶端發(fā)送了一條消息</p><p><b> 第二個(gè)用戶登陸</b></p><p
40、><b> 兩個(gè)用戶之間聊天</b></p><p> 昵稱(chēng)為唐毅的用戶離開(kāi)聊天室</p><p> 昵稱(chēng)為煙灰缸的用戶離開(kāi)聊天室</p><p><b> 總結(jié)(收獲與體會(huì))</b></p><p><b> 附:源代碼</b></p><
41、p> 注:以下代碼包括了一點(diǎn)VC自動(dòng)幫我們生成的部分。</p><p><b> 客戶端源代碼:</b></p><p> CMyChatApp類(lèi)中的InitInstance方法:</p><p> BOOL CMyChatApp::InitInstance()//初始化實(shí)例。</p><p><b&
42、gt; {</b></p><p> if (!AfxSocketInit())//初始化WINSOCK環(huán)境,一旦選擇支持WINSOCKET類(lèi)則由MFC為我們自動(dòng)生成。</p><p><b> {</b></p><p> AfxMessageBox(IDP_SOCKETS_INIT_FAILED);</p>
43、<p> return FALSE;</p><p><b> }</b></p><p> AfxEnableControlContainer();</p><p> // Standard initialization</p><p> // If you are not using these
44、 features and wish to reduce the size</p><p> // of your final executable, you should remove from the following</p><p> // the specific initialization routines you do not need.</p>&l
45、t;p> #ifdef _AFXDLL</p><p> Enable3dControls();// Call this when using MFC in a shared DLL</p><p><b> #else</b></p><p> Enable3dControlsStatic();// Call this
46、when linking to MFC statically</p><p><b> #endif</b></p><p> CClientSocket *clientSocket;</p><p> clientSocket = new CClientSocket();//NEW一個(gè)CClientSocket對(duì)象,用來(lái)之后與服務(wù)器端建
47、立連接。</p><p> CLoginDlg* loginDlg;</p><p> loginDlg = new CLoginDlg(clientSocket);//NEW一個(gè)CLoginDlg對(duì)象。</p><p> if(loginDlg->DoModal() == IDCANCEL)//顯示這個(gè)登陸窗口,并判斷返回值是否來(lái)IDCANCEL,如是
48、</p><p><b> {</b></p><p> delete clientSocket;</p><p> delete loginDlg;//則delete這兩個(gè)對(duì)象。</p><p> return false;//返回false后程序結(jié)束。</p><p><b
49、> }</b></p><p><b> else</b></p><p><b> {</b></p><p> delete loginDlg;//如果用戶點(diǎn)擊的是登陸按鈕,則會(huì)調(diào)用對(duì)應(yīng)的消息處理函數(shù),并delete這個(gè)登陸窗口對(duì)象。</p><p><b>
50、 }</b></p><p> CMyChatDlg *dlg;</p><p> dlg = new CMyChatDlg(clientSocket);</p><p> m_pMainWnd = dlg;//m_pMainWnd是CWinThread(是CMyApp的基類(lèi))的一個(gè)成員變量,用于儲(chǔ)存一個(gè)指向我們創(chuàng)建的一個(gè)線程的主窗口的對(duì)象。&l
51、t;/p><p> int nResponse = dlg->DoModal();//顯示客戶端主窗口,并接受函數(shù)的返回值。</p><p> return FALSE;</p><p><b> }</b></p><p> 在CMyChatApp類(lèi)中的成員變量:</p><p>
52、CString m_strName;</p><p><b> 定義了一個(gè)結(jié)構(gòu)體:</b></p><p> typedef struct tagHeader</p><p><b> {</b></p><p> chartype;</p><p> int
53、len; </p><p> } Header, *pHeader;</p><p> #define LOGIN_IO1</p><p> #define SEND_MESSAGE3</p><p> 客戶端套接字類(lèi)中的OnReceive成員函數(shù):</p><p> void CClientSo
54、cket::OnReceive(int nErrorCode) </p><p><b> {</b></p><p> // TODO: Add your specialized code here and/or call the base class</p><p> char buff[sizeof(Header)];</p&
55、gt;<p> memset(buff,0,sizeof(buff));</p><p> Receive(buff,sizeof(buff));</p><p> Header *header = (Header*)buff;//這里需要一個(gè)類(lèi)型的轉(zhuǎn)換。</p><p> int length = header->len;</p&
56、gt;<p> char type = header->type;</p><p> if(type == SEND_MESSAGE)</p><p><b> {</b></p><p> chatDlg->GetMessage();//定義一個(gè)CMyChatDlg *類(lèi)型的chatDlg變量作用就在此體現(xiàn)。
57、</p><p><b> }</b></p><p> if(type == LOGIN_IO)//收到服務(wù)器告知的更新用戶的消息。</p><p><b> {</b></p><p> chatDlg->UpdateUser();//調(diào)用CMyChatDlg類(lèi)中的UpdateU
58、ser方法。</p><p><b> }</b></p><p> CSocket::OnReceive(nErrorCode);</p><p><b> }</b></p><p> 在這個(gè)類(lèi)中還定義了兩個(gè)公有的成員變量:</p><p> CMyChatD
59、lg *chatDlg;//用來(lái)調(diào)用主窗口中的GetMessage和UpdateUser方法。</p><p> CString m_strName;//存放該客戶端的昵稱(chēng)。</p><p> 登陸窗口類(lèi)的構(gòu)造函數(shù):</p><p> CLoginDlg::CLoginDlg(CClientSocket *p_Socket, CWnd* pParent /*=
60、NULL*/)//創(chuàng)建它的對(duì)象的時(shí)候需要傳遞它一個(gè)CClientSocket對(duì)象</p><p> : CDialog(CLoginDlg::IDD, pParent)//的地址,用來(lái)建立連接。</p><p><b> {</b></p><p> ASSERT(p_Socket);//斷言assert是一個(gè)宏,一般可以用在判斷某件操作
61、是否成功上。</p><p> m_pSocket = p_Socket;//提取傳遞進(jìn)來(lái)的參數(shù)。</p><p> //{{AFX_DATA_INIT(CLoginDlg)</p><p> m_strName = _T("");</p><p> m_strServer = _T("127.0.0.1
62、");//_T是一個(gè)宏,這里的作用相當(dāng)于初始化了這兩個(gè)控件的值。</p><p> //}}AFX_DATA_INIT</p><p><b> }</b></p><p> 登陸窗口的確定按鈕響應(yīng)函數(shù):</p><p> void CLoginDlg::OnOK() </p><p
63、><b> {</b></p><p> // TODO: Add extra validation here</p><p> UpdateData();//用來(lái)刷新數(shù)據(jù)的,如果參數(shù)為真,則刷新控件的值到對(duì)應(yīng)的變量,若為假,則方向相反。</p><p> //m_pSocket->m_strName = this->
64、;m_strName;</p><p> if(!m_pSocket->Create())//創(chuàng)建。</p><p><b> {</b></p><p> AfxMessageBox("網(wǎng)絡(luò)創(chuàng)建錯(cuò)誤?。?!");</p><p> m_pSocket->Close();</p
65、><p><b> return;</b></p><p><b> }</b></p><p> if(!m_pSocket->Connect(m_strServer,9999))//連接,參數(shù)分別為服務(wù)器IP和端口號(hào)。</p><p><b> {</b><
66、/p><p> AfxMessageBox("連接服務(wù)器失?。。?!");</p><p> m_pSocket->Close();</p><p><b> return;</b></p><p><b> }</b></p><p> He
67、ader head;</p><p> head.type = LOGIN_IO;</p><p> head.len = m_strName.GetLength();</p><p> m_pSocket->Send((char *)&head,sizeof(Header));//向服務(wù)器端發(fā)送預(yù)備消息,告知消息類(lèi)型,準(zhǔn)備好接受數(shù)據(jù)。</
68、p><p> m_pSocket->Send(m_strName,m_strName.GetLength());//發(fā)送該客戶端的用戶昵稱(chēng)。</p><p> theApp.m_strName = m_strName;//如果不加此行,用戶的昵稱(chēng)將無(wú)法顯示到聊天窗口</p><p> CDialog::OnOK();//調(diào)用基類(lèi)的ONOK函數(shù),MFC自動(dòng)調(diào)用
69、的。</p><p><b> }</b></p><p> 登陸窗口類(lèi)中的成員變量有:</p><p> CClientSocket *m_pSocket;</p><p> CStringm_strName;</p><p> CStringm_strServer;</p&
70、gt;<p> 重載了一個(gè)CMyChatDlg類(lèi)的構(gòu)造函數(shù):</p><p> CMyChatDlg::CMyChatDlg(CClientSocket *p_Socket,CWnd* pParent /*=NULL*/)//需要傳遞已經(jīng)和服務(wù)器建立連接的CClientSocket對(duì)象</p><p> : CDialog(CMyChatDlg::IDD, pParen
71、t)//CClientSocket始終是一個(gè)主線,整個(gè)流程都要用到它,因此必需傳遞它。</p><p><b> {</b></p><p> m_pSocket = p_Socket;//提取傳遞的參數(shù)。</p><p> m_pSocket->chatDlg = this;//將本窗口的對(duì)象地址賦值給m_pSocket中的成員變
72、量chatDlg。</p><p> //{{AFX_DATA_INIT(CMyChatDlg)</p><p> m_strMessage = _T("");//初始化控件值。</p><p> m_num = _T("");</p><p> //}}AFX_DATA_INIT</p&
73、gt;<p> // Note that LoadIcon does not require a subsequent DestroyIcon in Win32</p><p> m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//讀取圖標(biāo)。</p><p><b> }</b></p>
74、;<p> DoDataExchange函數(shù),完成了控件與變量的關(guān)聯(lián)(前幾個(gè)類(lèi)中也有該函數(shù)):</p><p> void CMyChatDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(p
75、DX);</p><p> //{{AFX_DATA_MAP(CMyChatDlg)</p><p> DDX_Control(pDX, IDC_LIST_USER, m_UserList);</p><p> DDX_Control(pDX, IDC_EDIT_LIST, m_MessageList);</p><p> DDX_T
76、ext(pDX, IDC_EDIT_MESSAGE, m_strMessage);</p><p> DDX_Text(pDX, IDC_STATIC_NUM, m_num);</p><p> //}}AFX_DATA_MAP</p><p><b> }</b></p><p><b> 消息映射宏
77、:</b></p><p> EGIN_MESSAGE_MAP(CMyChatDlg, CDialog)</p><p> //{{AFX_MSG_MAP(CMyChatDlg)</p><p> ON_WM_SYSCOMMAND()</p><p> ON_WM_PAINT()</p><p>
78、 ON_WM_QUERYDRAGICON()</p><p> ON_BN_CLICKED(ID_SEND, OnSend)</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> CMyChatDlg類(lèi)中的OnSend方法:</p><p>
79、 void CMyChatDlg::OnSend() //響應(yīng)發(fā)送按鈕的函數(shù)。</p><p><b> {</b></p><p> UpdateData();//控件的值—>變量</p><p> if(m_strMessage == "")</p><p><b> {&
80、lt;/b></p><p> AfxMessageBox("不能發(fā)送空消息?。。?quot;);</p><p> CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);//得到該控件類(lèi)型的對(duì)象地址。</p><p> pEdit->SetFocus();//調(diào)用成員函數(shù)設(shè)置焦點(diǎn)。<
81、;/p><p><b> return;</b></p><p><b> }</b></p><p> Header head;</p><p> head.type = SEND_MESSAGE;</p><p> head.len = m_strMessage.G
82、etLength();</p><p> CTime time = CTime::GetCurrentTime();//得到系統(tǒng)當(dāng)前時(shí)間。</p><p> CString t = time.Format("%H:%M:%S");//設(shè)置時(shí)間格式。</p><p> CString nikeName = theApp.m_strName;&
83、lt;/p><p> CString str =nikeName+ " " + t + "\r\n" +m_strMessage;//把要發(fā)送的信息都存儲(chǔ)在這str變量中。</p><p> m_pSocket->Send((char *)&head,sizeof(Header));//發(fā)送“頭信息”。</p>
84、<p> // TODO: Add your control notification handler code here</p><p> if(m_pSocket->Send((LPCTSTR)str, str.GetLength()))//發(fā)送用戶編輯的信息,并判斷Send函數(shù)的返回值。</p><p><b> {</b></p&g
85、t;<p> m_strMessage = "";</p><p> UpdateData(FALSE);//變量—>控件的值</p><p> CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);</p><p> pEdit->SetFocus();<
86、/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> AfxMessageBox("網(wǎng)絡(luò)傳輸錯(cuò)誤!");</p><p><b> }&
87、lt;/b></p><p><b> }</b></p><p> CMyChatDlg類(lèi)中的OnCancel方法:</p><p> void CMyChatDlg::OnCancel()//響應(yīng)退出鍵。 </p><p><b> {</b></p><p&g
88、t; // TODO: Add extra cleanup here</p><p> if(m_pSocket)</p><p><b> {</b></p><p> m_pSocket->Close();//關(guān)閉連接。</p><p> delete m_pSocket;</p>&l
89、t;p><b> }</b></p><p> CDialog::OnCancel();</p><p><b> }</b></p><p> CMyChatDlg類(lèi)中的GetMessage方法:</p><p> BOOL CMyChatDlg::GetMessage()//由C
90、ClientSocket對(duì)象中的OnReceive方法調(diào)用。</p><p><b> {</b></p><p> char buff[1000];//定義一個(gè)數(shù)組來(lái)接受消息。</p><p> memset(buff,0,sizeof(buff));//將數(shù)組全部初始化為0。</p><p> m_pSock
91、et->Receive(buff, sizeof(buff),0);//接受消息。</p><p> CString strTemp = buff;</p><p> strTemp += _T("\r\n");</p><p> m_MessageList.ReplaceSel(strTemp);//用strTemp變量中的內(nèi)容替
92、換消息顯示框控件的當(dāng)前區(qū)域。</p><p> return TRUE;</p><p><b> }</b></p><p> CMyChatDlg類(lèi)中的UpdateUser方法:</p><p> oid CMyChatDlg::UpdateUser()</p><p><b&g
93、t; {</b></p><p> char buff[1000];</p><p> memset(buff,0,sizeof(buff));</p><p> m_pSocket->Receive(buff, sizeof(buff),0);</p><p> CString user_info = buff
94、;</p><p> CString array[100];//存放用戶名稱(chēng)</p><p> int b = 0;</p><p> for( int i=0; i<user_info.GetLength(); i++ )//拆分服務(wù)器端發(fā)來(lái)的用戶名稱(chēng),并用ARRAY數(shù)組來(lái)存儲(chǔ)。</p><p><b> {<
95、/b></p><p> if(i != (user_info.GetLength() - 1))//判斷是否已經(jīng)到達(dá)UER_INFO的尾端。</p><p><b> {</b></p><p> if ( user_info[i]=='&' )//判斷是否已經(jīng)到一個(gè)昵稱(chēng)的結(jié)尾。</p>&l
96、t;p><b> {</b></p><p> b ++;//用戶加一</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> ar
97、ray[b] = array[b] + user_info[i];//將一個(gè)用戶名稱(chēng)拷貝到一個(gè)數(shù)組單元中。</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> m_num.Format(&q
98、uot;%d", b+1);//將INT類(lèi)型的b轉(zhuǎn)換為CString類(lèi)型。</p><p> UpdateData(FALSE);//變量到控件。</p><p> m_UserList.ResetContent();//置空列表框。</p><p> for(int j=0; j<b+1; j++)</p><p>&
99、lt;b> {</b></p><p> m_UserList.AddString(array[j]);//將轉(zhuǎn)換好的用戶名稱(chēng)依次顯示出來(lái)。</p><p><b> }</b></p><p><b> }</b></p><p> 以上就是客戶端的源代碼。</p
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- mfc課程設(shè)計(jì)報(bào)告---聊天室程序設(shè)計(jì)
- 用vc++簡(jiǎn)單的多線程聊天室課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-- 用winsock實(shí)現(xiàn)聊天室的vc++程序設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-- 用winsock實(shí)現(xiàn)聊天室的vc++程序設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)
- vc++設(shè)計(jì)簡(jiǎn)單的聊天室畢業(yè)設(shè)計(jì)
- 聊天室課程設(shè)計(jì)---聊天程序的設(shè)計(jì)和實(shí)現(xiàn)
- vc++網(wǎng)絡(luò)聊天室的實(shí)現(xiàn)計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)
- vc++網(wǎng)絡(luò)聊天軟件課程設(shè)計(jì)
- [vc++畢設(shè)]vc做的聊天室+論文
- vc++程序設(shè)計(jì)
- 基于java的聊天室程序設(shè)計(jì)
- web課程設(shè)計(jì)—— 聊天室
- vc++課程設(shè)計(jì)----用winsock實(shí)現(xiàn)聊天
- vc++面向?qū)ο笳n程設(shè)計(jì)報(bào)告---局域網(wǎng)聊天程序
- 程序設(shè)計(jì)(vc++)實(shí)踐-課程實(shí)踐報(bào)告
- java課程設(shè)計(jì)--聊天室系統(tǒng)
- java網(wǎng)絡(luò)聊天室課程設(shè)計(jì)
- java課程設(shè)計(jì)---聊天室系統(tǒng)
評(píng)論
0/150
提交評(píng)論