版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 《TCP/IP和網(wǎng)絡(luò)編程》課程設(shè)計</p><p><b> 題目:網(wǎng)上聊天</b></p><p> 姓 名 </p><p> 學(xué) 號 </p><p> 指導(dǎo)教師 </p><p><b> 二零一零
2、年 月 日</b></p><p><b> 系統(tǒng)功能描述</b></p><p> 使用Socket實現(xiàn)網(wǎng)上聊天功能。用戶可以通過客戶端連接到服務(wù)器端并進行網(wǎng)上聊天。當然,聊天時可以啟動多個客戶端。服務(wù)器支持多個主題,進入服務(wù)器后可選定主題,啟動客戶端后,輸入服務(wù)器的IP地址即可。用戶聊天必須處于同一個主題中。</p><p>
3、;<b> 系統(tǒng)的模塊劃分</b></p><p><b> 服務(wù)器端:</b></p><p> CAboutDlg:生成關(guān)于的對話框類</p><p> CCChatServerApp:對應(yīng)用程序進行初始化</p><p> CCChatServerDoc、 CCChatServerV
4、iew:一份文檔可以有多個相關(guān)的視圖,當用戶在文檔上打開一個窗口時,框架創(chuàng)建一個視圖并將其與文檔連接。</p><p> CClientSocket:設(shè)置非阻塞,將前臺的界面處理和后臺的網(wǎng)絡(luò)通信都整合到消息傳遞模型。獲取輸入的用戶名,聊天室列表。</p><p> CINIFILE:可以讀取.修改變量數(shù)值,可以設(shè)置新的組,新的變量</p><p> CMain
5、Frame:創(chuàng)建應(yīng)用程序主窗口,使之以樹菜單保持展開狀態(tài)</p><p> CMyFormView:在程序中應(yīng)用窗體,可將新窗體插入。</p><p> CMyTreeView:將聊天室列表以樹形排列,并實現(xiàn)用戶發(fā)送消息的方法。</p><p> CParseMessage:實現(xiàn)信息的傳輸。</p><p> CServerSocke
6、t:實現(xiàn)多個客戶端的登錄。</p><p> CSetServerPortDlg:設(shè)定連接的端口。</p><p> Message:建立一個結(jié)構(gòu)體,設(shè)定房間名、用戶名、以及發(fā)送內(nèi)容的類型和長度。</p><p><b> 客戶端:</b></p><p> CChatClientApp:實現(xiàn)客戶端與服務(wù)器端的連
7、接。</p><p> ChatClientDoc:從服務(wù)器端獲取聊天室內(nèi)房間的名稱的文本。</p><p> CClientFormView:初始化房間的名稱。</p><p> CClientLog:顯示上次登錄的用戶名的對話框。</p><p> CConnectServerDlg:客戶端與服務(wù)器端的連接的對話框。</p&
8、gt;<p> CIniFile:讀取當前目錄下的ini文件。</p><p> CShowMessage:顯示其他客戶端發(fā)送的消息。</p><p> CParseMessage:用戶登錄時的所選擇登陸端口,IP,用戶名的對話框。</p><p> CMyTreeView:客戶端上顯示的樹形列表,以及可實現(xiàn)發(fā)送消息頭像閃動等。</p&g
9、t;<p><b> 調(diào)試數(shù)據(jù)</b></p><p><b> 首先啟動服務(wù)器端</b></p><p> 分別啟動兩個客戶端,用戶名為A 、B</p><p> 將兩個用戶進入同一頻道</p><p><b> A向B發(fā)送消息</b></p&g
10、t;<p><b> B收到消息</b></p><p><b> 回復(fù)A發(fā)送的消息</b></p><p><b> A收到B的消息</b></p><p><b> 主要代碼</b></p><p> 客戶端:if(!m_sk
11、MainSocket.Create())</p><p><b> {</b></p><p> AfxMessageBox("端口創(chuàng)建錯誤");</p><p> return FALSE;</p><p><b> }</b></p><p>
12、 int iTryTimes = 0;</p><p> CString strName;</p><p> if(!IniFile.Create("username.ini",1))</p><p><b> {</b></p><p> AfxMessageBox("初始化文件
13、不存在");</p><p> return FALSE;</p><p><b> }</b></p><p> CString strServerIp;</p><p> int iServerPort;</p><p> IniFile.GetVarStr("U
14、SERNAME","DEFUALTNAME",strName);</p><p> if(!IniFile.GetVarStr("SERVERIP","DEFUALTSERVERIP",strServerIp))</p><p><b> {</b></p><p>
15、strServerIp = _T("127.0.0.1");</p><p><b> }</b></p><p> if(!IniFile.GetVarInt("SERVERPORT","DEFAULTSERVERPORT",iServerPort))</p><p><b
16、> {</b></p><p> iServerPort = 1080;</p><p><b> }</b></p><p> while(iTryTimes < 3)</p><p><b> {</b></p><p> CConne
17、ctServerDlg Dlg(strName,strServerIp,iServerPort);</p><p> if(Dlg.DoModal() == IDCANCEL)</p><p> return FALSE;</p><p> if(!m_skMainSocket.Connect(Dlg.m_strServerIp,Dlg.m_iServerPo
18、rt))</p><p><b> {</b></p><p> if(MessageBox(NULL,"服務(wù)器連接錯誤","重試?",IDRETRY) == IDNO)</p><p><b> {</b></p><p> //ExitInsta
19、nce();</p><p> return FALSE;</p><p><b> }</b></p><p> iTryTimes ++;</p><p><b> }</b></p><p><b> else</b></p>
20、<p><b> {</b></p><p> Message msObj;</p><p> msObj.iType = FIRSTLOG;</p><p> msObj.iSubType = FIRSTTIME;</p><p> CString strTemp = Dlg.m_strUser
21、Name;</p><p> int iLen = strTemp.GetLength();</p><p> lstrcpy(msObj.strName,_T(strTemp.GetBuffer(iLen)));</p><p> strTemp.ReleaseBuffer();</p><p> m_skMainSocket.Se
22、nd(&msObj,sizeof(Message));</p><p> m_skMainSocket.SetUserName(strTemp);</p><p> return TRUE;</p><p><b> }</b></p><p> if(iTryTimes >=3)</p>
23、;<p><b> {</b></p><p> AfxMessageBox("已經(jīng)重試3次,退出");</p><p> return FALSE;</p><p><b> }</b></p><p><b> }</b><
24、/p><p> return TRUE;</p><p><b> }</b></p><p> 這是關(guān)于客戶端登錄服務(wù)器端的代碼</p><p> void CShowMessage::OnOK() </p><p><b> {</b></p><
25、;p> // TODO: Add extra validation here</p><p> //得到當前按鈕的文本</p><p> CString strButtonTitle;</p><p> GetDlgItemText(IDOK,strButtonTitle);</p><p> //殺死接受用戶信息時啟動的On
26、Timer</p><p> CMainFrame * pFrame;</p><p> pFrame = (CMainFrame *)AfxGetMainWnd();</p><p> ASSERT(pFrame != NULL);</p><p> ASSERT_VALID(pFrame);</p><p>
27、; CMyTreeView * pView;</p><p> pView = (CMyTreeView * )pFrame ->GetTreeView();</p><p> pView ->KillTimer(iID);</p><p><b> //恢復(fù)任務(wù)欄圖標</b></p><p> t
28、heApp.TaskIcon.hIcon = theApp.LoadIcon(IDI_TASKICON);</p><p> Shell_NotifyIcon(NIM_MODIFY,&theApp.TaskIcon);</p><p> //刪除接受用戶輸入時創(chuàng)建的新的鏈表項</p><p> pView->DeleteOneClient(m_
29、strClientName,iID);</p><p> if(strButtonTitle == "回復(fù)")</p><p><b> {</b></p><p> m_strMessage = "";</p><p> UpdateData(FALSE);</p&
30、gt;<p> SetDlgItemText(IDOK,"發(fā)送");</p><p> GetDlgItem(IDC_MESSAGE)->SetFocus();</p><p><b> }</b></p><p><b> else</b></p><p
31、><b> {</b></p><p><b> //回復(fù)發(fā)送人</b></p><p> UpdateData();</p><p> if(m_strMessage.GetLength())</p><p><b> {</b></p><
32、;p> //填充Message結(jié)構(gòu)</p><p> Message msObj;</p><p> memset(&msObj,0,sizeof(Message));</p><p> msObj.iType = USERSESSION;</p><p> msObj.iSubType = SAYINPRIVATE;
33、</p><p> CString strTemp = theApp.m_skMainSocket.GetRoomName();</p><p> int iLen = strTemp.GetLength();</p><p> lstrcpy(msObj.strRoom,_T(strTemp.GetBuffer(iLen)));</p>&l
34、t;p> strTemp.ReleaseBuffer();</p><p> strTemp = m_strMessage;</p><p> iLen = strTemp.GetLength();</p><p> iLen > 1024 ? 1024 : iLen;</p><p> lstrcpy(msObj.st
35、rContent,_T(strTemp.GetBuffer(iLen)));</p><p> strTemp.ReleaseBuffer();</p><p> theApp.m_skMainSocket.Send(&msObj,sizeof(Message));</p><p><b> //自己的名字</b></p&g
36、t;<p> strTemp = theApp.m_skMainSocket.GetUserName();</p><p> iLen = strTemp.GetLength();</p><p> iLen > 20 ? 20:iLen;</p><p> lstrcpy(msObj.strName,_T(strTemp.GetBuff
37、er(iLen)));</p><p> strTemp.ReleaseBuffer();</p><p><b> //說話對象的名字</b></p><p> strTemp =m_strClientName;</p><p> iLen = strTemp.GetLength();</p>&
38、lt;p> iLen > 20 ? 20 : iLen;</p><p> lstrcpy(msObj.strClientName,_T(strTemp.GetBuffer(iLen)));</p><p> strTemp.ReleaseBuffer();</p><p><b> //發(fā)送數(shù)據(jù)</b></p>
39、<p> theApp.m_skMainSocket.Send(&msObj,sizeof(Message));</p><p><b> }</b></p><p> CDialog::OnOK();</p><p><b> }</b></p><p><b&
40、gt; }</b></p><p> void CShowMessage::OnCancel() </p><p><b> {</b></p><p> // TODO: Add extra cleanup here</p><p> theApp.m_skMainSocket.SetbMessa
41、ge(FALSE);</p><p> //殺死接受用戶信息時啟動的OnTimer</p><p> CMainFrame * pFrame;</p><p> pFrame = (CMainFrame *)AfxGetMainWnd();</p><p> ASSERT(pFrame != NULL);</p><
42、;p> ASSERT_VALID(pFrame);</p><p> CMyTreeView * pView;</p><p> pView = (CMyTreeView * )pFrame ->GetTreeView();</p><p> pView ->KillTimer(iID);</p><p> pVi
43、ew->DeleteOneClient(m_strClientName,iID);</p><p><b> //恢復(fù)任務(wù)欄圖標</b></p><p> theApp.TaskIcon.hIcon = theApp.LoadIcon(IDI_TASKICON);</p><p> Shell_NotifyIcon(NIM_MODI
44、FY,&theApp.TaskIcon);</p><p> CDialog::OnCancel();</p><p><b> }</b></p><p> 這是客戶端在接收到另一客戶端發(fā)來信息時所能操作的代碼</p><p><b> 服務(wù)器端:</b></p>&
45、lt;p> void CClientSocket::OnReceive(int nErrorCode) </p><p><b> {</b></p><p> CMainFrame * pFrame = static_cast <CMainFrame *>(AfxGetMainWnd());</p><p> CMy
46、TreeView * pTreeView = pFrame->GetTreeView();</p><p> Message msContent;</p><p> memset(&msContent,0,sizeof(msContent));</p><p><b> //得到數(shù)據(jù)</b></p><p
47、> Receive(&msContent,sizeof(msContent));</p><p><b> //處理數(shù)據(jù)</b></p><p> //用戶第一次登陸,CClientSocket中保存信息</p><p> g_cs.Lock();</p><p> if(msContent.iT
48、ype == FIRSTLOG)// && msContent.iSubType == FIRSTTIME)</p><p><b> {</b></p><p> //static BOOL bFirst = TRUE;</p><p> if(msContent.iSubType == FIRSTTIME)</
49、p><p> theApp.m_pClientSocketList->AddTail(this);</p><p> CPtrList * m_pClientList = theApp.m_pClientSocketList;</p><p> int iCount = m_pClientList->GetCount();</p><
50、;p> POSITION pos = m_pClientList ->GetHeadPosition();</p><p><b> if(pos)</b></p><p><b> { </b></p><p> CString strUserName = msContent.strName;<
51、;/p><p> for(int i = 0; i < m_pClientList ->GetCount()-1; i++)</p><p><b> {</b></p><p> CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pCl
52、ientList->GetNext(pos));</p><p> if(m_pClientSocket ->GetUserName() == strUserName)</p><p><b> {</b></p><p> Message msObj;</p><p> memset(&ms
53、Obj,0,sizeof(Message));</p><p> msObj.iType = SYSERROR;</p><p> msObj.iSubType = USEREXSIT;</p><p> Send(&msObj,sizeof(Message));</p><p><b> return;</b
54、></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> Message msObj;</p><p> ::ZeroMemory(&msObj,siz
55、eof(msObj));</p><p> msObj.iType = USERLOG;</p><p> msObj.iSubType = ROOMLIST;</p><p> if(theApp.m_ChatRoomList.GetCount())</p><p><b> {</b></p>
56、<p> POSITION pos = theApp.m_ChatRoomList.GetHeadPosition();</p><p><b> if(pos)</b></p><p><b> {</b></p><p> for(int i = 0 ; i < theApp.m_ChatRoo
57、mList.GetCount();i ++)</p><p><b> {</b></p><p> CString * m_pstrRoom = static_cast < CString *>(theApp.m_ChatRoomList.GetNext(pos));</p><p> ASSERT(m_pstrRoom !
58、= NULL);</p><p> int iLen = m_pstrRoom->GetLength();</p><p> iLen > 20 ? iLen : 20;</p><p> lstrcpy(msObj.strRoom,m_pstrRoom->GetBuffer(iLen));</p><p> Sen
59、d(&msObj,sizeof(msObj));</p><p> Sleep(200);</p><p><b> }</b></p><p><b> }</b></p><p> //發(fā)送所有的用戶資料</p><p> msObj.iType = U
60、SERLOG;</p><p> msObj.iSubType = USERLIST;</p><p> CPtrList * m_pClientList = theApp.m_pClientSocketList;</p><p> pos = m_pClientList ->GetHeadPosition();</p><p>
61、 int iCount = m_pClientList ->GetCount();</p><p> if(pos && iCount > 0)</p><p><b> {</b></p><p> CClientSocket * m_pClientSocket;</p><p>
62、 for(int i = 0; i < iCount-1; i++)</p><p><b> {</b></p><p> m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));</p><p> CStrin
63、g strTemp = m_pClientSocket ->GetRoomName();</p><p> int iLen = strTemp.GetLength();</p><p> iLen > 20 ? 20 : iLen;</p><p> lstrcpy(msObj.strRoom,strTemp.GetBuffer(iLen));&
64、lt;/p><p> strTemp.ReleaseBuffer();</p><p> strTemp = m_pClientSocket ->GetUserName();</p><p> iLen = strTemp.GetLength();</p><p> iLen > 20 ? 20 : iLen;</p&g
65、t;<p> lstrcpy(msObj.strName,strTemp.GetBuffer(iLen));</p><p> strTemp.ReleaseBuffer();</p><p> Send(&msObj,sizeof(msObj));</p><p> Sleep(100);</p><p>&l
66、t;b> }</b></p><p><b> }</b></p><p> g_cs.Unlock();</p><p><b> }</b></p><p> SetUserName(msContent.strName);</p><p>
67、SetState(HAVELOGIN);</p><p><b> }</b></p><p> if(msContent.iType == USERLOG && msContent.iSubType == USERLOGIN)</p><p><b> {</b></p><p&
68、gt; //檢查用戶名是否存在</p><p> SetRoomName(msContent.strRoom);</p><p> SetState(HAVELOGIN);</p><p><b> }</b></p><p> else if(msContent.iType == USERSESSION &a
69、mp;& msContent.iSubType == CHANGEROOM)</p><p><b> {</b></p><p> CString strNewRoom = msContent.strContent;</p><p> SetRoomName(strNewRoom);</p><p>&l
70、t;b> }</b></p><p> CParseMessage Parse(pTreeView,msContent);</p><p> Parse.SWitchMessage();</p><p> g_cs.Unlock();</p><p> CSocket::OnReceive(nErrorCode);
71、</p><p><b> }</b></p><p> 記錄用戶的數(shù)據(jù),檢查用戶名是否錯誤</p><p><b> 系統(tǒng)功能的優(yōu)缺點</b></p><p> 該系統(tǒng)能較好的完成客戶端與客戶端之間進行聊天,能支持4個主題,不同主題之間的人不能進行聊天,但沒有實現(xiàn)服務(wù)器端查看客戶端聊天記錄
72、的功能,也沒有記錄下聊天的內(nèi)容。</p><p><b> 參考文獻</b></p><p> [1]丁展 劉海英. VisualC++ 網(wǎng)絡(luò)通信編程使用案例精選. 人民郵電出版社. 2004.4</p><p> [2]. 求是科技. VisualC++6.0程序設(shè)計從入門到精通. 人民郵電出版社.2006.1.1</p>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- mfc聊天軟件課程設(shè)計---網(wǎng)絡(luò)聊天程序設(shè)計
- mfc聊天軟件課程設(shè)計---網(wǎng)絡(luò)聊天程序設(shè)計
- 網(wǎng)絡(luò)編程課程設(shè)計---網(wǎng)絡(luò)聊天室
- java網(wǎng)絡(luò)聊天室課程設(shè)計
- tcp課程設(shè)計--網(wǎng)絡(luò)聊天室
- 軟件課程設(shè)計---簡易網(wǎng)絡(luò)聊天系統(tǒng)
- vc++網(wǎng)絡(luò)聊天軟件課程設(shè)計
- java課程設(shè)計--簡單的網(wǎng)絡(luò)聊天程序
- 網(wǎng)絡(luò)編程課程設(shè)計-java聊天室
- 軟件課程設(shè)計報告---簡易網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)課程設(shè)計---簡單聊天系統(tǒng)的設(shè)計與實現(xiàn)
- 網(wǎng)絡(luò)編程課程設(shè)計報告--基于linux網(wǎng)絡(luò)聊天室設(shè)計
- java課程設(shè)計-聊天程序
- 基于tcpip協(xié)議的網(wǎng)絡(luò)通信應(yīng)用程序課程設(shè)計報告
- 課程設(shè)計一個簡單的網(wǎng)絡(luò)聊天程序
- java課程設(shè)計聊天小程序
- java課程設(shè)計---即時聊天系統(tǒng)
- web課程設(shè)計—— 聊天室
- 網(wǎng)絡(luò)安全課程設(shè)計---基于des加密的聊天程序
- 網(wǎng)絡(luò)綜合課程設(shè)計---windows平臺下tcpip協(xié)議的設(shè)計與實現(xiàn)
評論
0/150
提交評論