版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《軟件開發(fā)集成環(huán)境》課程設(shè)計(jì)</p><p> 題目:小QQ聊天工具</p><p><b> 系 院: </b></p><p><b> 專 業(yè):</b></p><p><b> 年 級: </b></p>
2、<p><b> 組 別: </b></p><p><b> 成 員: </b></p><p><b> 完成日期: </b></p><p><b> 指導(dǎo)教師:</b></p><p><b> ?。?lt;
3、/b></p><p><b> 目 錄</b></p><p> 目的和意義 *****************************************</p><p> 項(xiàng)目背景 *******************************************</p><p> 設(shè)計(jì)要求
4、*******************************************</p><p> 項(xiàng)目說明 *******************************************</p><p> 需求分析 **************************************************</p><p> 性能分析
5、**************************************************</p><p> 可行性分析 ************************************************</p><p> 主要數(shù)據(jù) *******************************************</p><p>
6、 程序運(yùn)行的條件 ************************************</p><p> 源代碼 ************************************************</p><p> 服務(wù)器編碼 ***********************************************</p><p> 執(zhí)
7、行編碼 **************************************************</p><p> 執(zhí)行結(jié)果與分析 *******************************************</p><p> 設(shè)計(jì)總結(jié) **************************************************</p>&l
8、t;p> 參考文獻(xiàn) **************************************************</p><p><b> 一:目的和意義</b></p><p> 21世紀(jì)是一個(gè)以網(wǎng)絡(luò)核心的信息化時(shí)代,要實(shí)現(xiàn)信息化,增強(qiáng)人們之間的交流很大部分是依靠在QQ上聊,但前提是必須有完善的QQ聊天室,通過本課程設(shè)計(jì)使學(xué)生對QQ聊天室的功能和
9、運(yùn)行的具體過程有所了解,同時(shí)也對掌握的只是有了更深的運(yùn)用,將所學(xué)知識用于實(shí)踐之中,增強(qiáng)了學(xué)生的動手能力。</p><p><b> 二:項(xiàng)目背景</b></p><p> 當(dāng)今是一個(gè)以網(wǎng)絡(luò)為核心的信息化時(shí)代,是一個(gè)蓬勃發(fā)展的時(shí)代,因此,僅僅依靠電話進(jìn)行交流已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足人們的需求。小QQ聊天工具則應(yīng)運(yùn)而生,它的方便靈活為人們解決了這個(gè)難題。為了體現(xiàn)我們所學(xué)的知識
10、以及提高我們的操作實(shí)踐能力,經(jīng)過討論后本小組決定設(shè)計(jì)一個(gè)簡單的QQ聊天室。</p><p><b> 三:設(shè)計(jì)要求</b></p><p> 根據(jù)要求對QQ聊天室進(jìn)行需求分析,提交需求作品;</p><p> 在需求分析的基礎(chǔ)上進(jìn)行系統(tǒng)設(shè)計(jì);</p><p> 便于客戶端進(jìn)行操作;</p><
11、p> 聊天室操作程序源代碼易懂;</p><p> 要求界面設(shè)計(jì)簡潔、使用方便,能夠完成基本的聊天室功能。</p><p><b> 四:項(xiàng)目說明</b></p><p> 聊天室分為服務(wù)器端和客戶端兩部分,服務(wù)器端程序主要負(fù)責(zé)偵聽客戶端發(fā)來的消息,客戶端需要登錄到服務(wù)器端才可以實(shí)現(xiàn)正常的聊天功能。</p><
12、p> 1、服務(wù)器端的主要功能如下:</p><p> 在特定端口上進(jìn)行偵聽,等待客戶端連接。</p><p> 用戶可以配置服務(wù)器端的偵聽接口,默認(rèn)端口為 1080。</p><p> 向已經(jīng)連接到服務(wù)器端的用戶發(fā)送系統(tǒng)消息。</p><p><b> 統(tǒng)計(jì)在線人數(shù)。</b></p><
13、;p> 當(dāng)停止服務(wù)器時(shí),斷開所有的用戶連接。</p><p> 2、客戶端的重要功能如下:</p><p> 連接到已經(jīng)開啟聊天服務(wù)的服務(wù)器端。</p><p> 用戶可以配置要連接的服務(wù)器端的 IP 地址和端口號。</p><p> 用戶可以配置連接后顯示的用戶名。</p><p> 當(dāng)服務(wù)器端開啟
14、的話,用戶可以隨時(shí)登陸和注銷。</p><p> 用戶可以向所有人或某一個(gè)人發(fā)送消息。</p><p><b> (一)需求分析:</b></p><p><b> 注冊:</b></p><p> 服務(wù)器收到用戶的注冊請求,便開始接受客戶傳遞的信息,諸如客戶的昵稱,姓名,籍貫,個(gè)人資料等,
15、接受完畢后,便通過 Jdbc-Odbc 與后臺數(shù)據(jù)庫連接,然后向數(shù)據(jù)庫添加記錄,如果成功,便向客戶返回其號碼??蛻羰盏椒?wù)器返回的信息后,便打開主登陸窗口。</p><p><b> 登陸:</b></p><p> 在客戶端用戶輸入其號碼和密碼,然后建立與服務(wù)器的連接,告訴服務(wù)器我要登陸,開始通過Jdbc-Odbc 讀取數(shù)據(jù)庫,然后與用戶輸入的信息比較如果成功便
16、打開主窗口,然后客戶向服務(wù)器請求讀取好友名單,服務(wù)器收到該請求,開始讀取數(shù)據(jù)庫的表,得到好友的號碼后再在icp 表中讀取好友資料,然后向客戶端發(fā)送這些信息,客戶收到后就在主創(chuàng)口顯示好友。,并且建立幾個(gè)矢量,用、用以存儲好友的昵稱號碼。</p><p><b> ?。ǘ┬阅芊治觯?lt;/b></p><p> 本系統(tǒng)由于采用免費(fèi)的 oracle 數(shù)據(jù)庫軟件,連接數(shù)最多不
17、能超過200,所以并發(fā)訪問數(shù)據(jù)庫的人數(shù)不能超過200。</p><p><b> (三)可行性分析:</b></p><p> 經(jīng)濟(jì)可行性:本系統(tǒng)需要一個(gè) oracle 數(shù)據(jù)庫服務(wù)器,由于使用人數(shù)比較少,安裝一個(gè)免費(fèi)的 oracle 數(shù)據(jù)庫完全可以應(yīng)付需要。</p><p> 操作可行性:只要一臺以上計(jì)算機(jī)連接在同一局域網(wǎng)內(nèi),本系統(tǒng)可以安
18、裝使用。所以操作上完全不存在問題。</p><p><b> 五:主要數(shù)據(jù)</b></p><p> // MyQQServer.cpp : Defines the class behaviors for the application.</p><p><b> //</b></p><p>
19、; #include "stdafx.h"</p><p> #include "MyQQServer.h"</p><p> #include "MyQQServerDlg.h"</p><p> #include "ClientSocket.h"</p><
20、;p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[] = __FILE__;</p><p><b> #endif</b></p>
21、<p> /////////////////////////////////////////////////////////////////////////////</p><p> // CMyQQServerApp</p><p> BEGIN_MESSAGE_MAP(CMyQQServerApp, CWinApp)</p><p> //
22、{{AFX_MSG_MAP(CMyQQServerApp)</p><p> // NOTE - the ClassWizard will add and remove mapping macros here.</p><p> // DO NOT EDIT what you see in these blocks of generated code!</p>&l
23、t;p> //}}AFX_MSG</p><p> ON_COMMAND(ID_HELP, CWinApp::OnHelp)</p><p> END_MESSAGE_MAP()</p><p> /////////////////////////////////////////////////////////////////////////////&
24、lt;/p><p> // CMyQQServerApp construction</p><p> CMyQQServerApp::CMyQQServerApp()</p><p><b> {</b></p><p> // TODO: add construction code here,</p>
25、<p> // Place all significant initialization in InitInstance</p><p> m_pClientSocketList = new CPtrList();</p><p><b> }</b></p><p> ///////////////////////////
26、//////////////////////////////////////////////////</p><p> // The one and only CMyQQServerApp object</p><p> CMyQQServerApp theApp;</p><p> CCriticalSection g_cs;</p><
27、p> /////////////////////////////////////////////////////////////////////////////</p><p> // CMyQQServerApp initialization</p><p> BOOL CMyQQServerApp::InitInstance()</p><p>&l
28、t;b> {</b></p><p> if (!AfxSocketInit())</p><p><b> {</b></p><p> AfxMessageBox(IDP_SOCKETS_INIT_FAILED);</p><p> return FALSE;</p><
29、;p><b> }</b></p><p> AfxEnableControlContainer();</p><p> AfxInitRichEdit();</p><p> m_af.Start("IDR_MATINURF_GTBASE",NULL,GTP_LOAD_RESOURCE,NULL,"
30、MATINURF") ;</p><p> // Standard initialization</p><p> // If you are not using these features and wish to reduce the size</p><p> // of your final executable, you should r
31、emove from the following</p><p> // the specific initialization routines you do not need.</p><p> #ifdef _AFXDLL</p><p> Enable3dControls();// Call this when using MFC in a s
32、hared DLL</p><p><b> #else</b></p><p> Enable3dControlsStatic();// Call this when linking to MFC statically</p><p><b> #endif</b></p><p> C
33、MyQQServerDlg dlg;</p><p> m_pMainWnd = &dlg;</p><p> int nResponse = dlg.DoModal();</p><p> if (nResponse == IDOK)</p><p><b> {</b></p><
34、p> // TODO: Place code here to handle when the dialog is</p><p> // dismissed with OK</p><p><b> }</b></p><p> else if (nResponse == IDCANCEL)</p><p&g
35、t;<b> {</b></p><p> // TODO: Place code here to handle when the dialog is</p><p> // dismissed with Cancel</p><p><b> }</b></p><p> // Sin
36、ce the dialog has been closed, return FALSE so that we exit the</p><p> // application, rather than start the application's message pump.</p><p> return FALSE;</p><p><b&g
37、t; }</b></p><p> int CMyQQServerApp::ExitInstance() </p><p><b> {</b></p><p> Message msObj;</p><p> msObj.iType = SYSERROR;</p><p>
38、 msObj.iSubType = SERVERQUIT;</p><p> CPtrList * m_pClientList = m_pClientSocketList;</p><p> POSITION pos = m_pClientList ->GetHeadPosition();</p><p><b> if(pos)</b
39、></p><p><b> {</b></p><p> CClientSocket * m_pClientSocket;</p><p> for(int i = 0; i < m_pClientList ->GetCount(); i++)</p><p><b> {<
40、/b></p><p> m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));</p><p> m_pClientSocket ->Send(&msObj,sizeof(Message));</p><p> Slee
41、p(100);</p><p><b> }</b></p><p><b> }</b></p><p><b> //刪除</b></p><p> DeleteAllList();</p><p> return CWinApp
42、::ExitInstance();</p><p><b> }</b></p><p> void CMyQQServerApp::DeleteAllList()</p><p><b> {</b></p><p><b> //刪除</b></p>
43、<p> POSITION pos = m_pClientSocketList ->GetHeadPosition();</p><p><b> if(pos)</b></p><p><b> {</b></p><p> CClientSocket * m_pClientSocket;<
44、;/p><p> for(int i = 0; i < m_pClientSocketList ->GetCount(); i++)</p><p><b> {</b></p><p> m_pClientSocket = static_cast < CClientSocket *>(m_pClientSocketL
45、ist->GetNext(pos));</p><p> ASSERT(m_pClientSocket != NULL);</p><p> ASSERT_VALID(m_pClientSocket);</p><p> delete m_pClientSocket;</p><p><b> }</b>
46、</p><p><b> }</b></p><p> delete m_pClientSocketList;</p><p><b> }</b></p><p> // MyQQClient.cpp : Defines the class behaviors for the appl
47、ication.</p><p><b> //</b></p><p> #include "stdafx.h"</p><p> #include "MyQQClient.h"</p><p> #include "MyQQClientDlg.h"&
48、lt;/p><p> #include "MainSocket.h"</p><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[]
49、 = __FILE__;</p><p><b> #endif</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CMyQQClientApp</p><p>
50、; BEGIN_MESSAGE_MAP(CMyQQClientApp, CWinApp)</p><p> //{{AFX_MSG_MAP(CMyQQClientApp)</p><p> // NOTE - the ClassWizard will add and remove mapping macros here.</p><p> // DO
51、NOT EDIT what you see in these blocks of generated code!</p><p> //}}AFX_MSG</p><p> ON_COMMAND(ID_HELP, CWinApp::OnHelp)</p><p> END_MESSAGE_MAP()</p><p> ////////
52、/////////////////////////////////////////////////////////////////////</p><p> // CMyQQClientApp construction</p><p> CMyQQClientApp::CMyQQClientApp()</p><p><b> {</b>
53、</p><p> // TODO: add construction code here,</p><p> // Place all significant initialization in InitInstance</p><p><b> }</b></p><p> /////////////////
54、////////////////////////////////////////////////////////////</p><p> // The one and only CMyQQClientApp object</p><p> CMyQQClientApp theApp;</p><p> ////////////////////////////
55、/////////////////////////////////////////////////</p><p> // CMyQQClientApp initialization</p><p> BOOL CMyQQClientApp::InitInstance()</p><p><b> {</b></p><
56、;p> if (!AfxSocketInit())</p><p><b> {</b></p><p> AfxMessageBox(IDP_SOCKETS_INIT_FAILED);</p><p> return FALSE;</p><p><b> }</b></p&
57、gt;<p> AfxEnableControlContainer();</p><p> AfxInitRichEdit();</p><p> m_af.Start("IDR_MATINURF_GTBASE",NULL,GTP_LOAD_RESOURCE,NULL,"MATINURF") ;</p><p&
58、gt; // Standard initialization</p><p> // If you are not using these features and wish to reduce the size</p><p> // of your final executable, you should remove from the following</p>
59、<p> // the specific initialization routines you do not need.</p><p> #ifdef _AFXDLL</p><p> Enable3dControls();// Call this when using MFC in a shared DLL</p><p><b
60、> #else</b></p><p> Enable3dControlsStatic();// Call this when linking to MFC statically</p><p><b> #endif</b></p><p> CMyQQClientDlg dlg;</p><p
61、> m_pMainWnd = &dlg;</p><p> int nResponse = dlg.DoModal();</p><p> if (nResponse == IDOK)</p><p><b> {</b></p><p> // TODO: Place code here to
62、handle when the dialog is</p><p> // dismissed with OK</p><p><b> }</b></p><p> else if (nResponse == IDCANCEL)</p><p><b> {</b></p>
63、<p> // TODO: Place code here to handle when the dialog is</p><p> // dismissed with Cancel</p><p><b> }</b></p><p> // Since the dialog has been closed, retu
64、rn FALSE so that we exit the</p><p> // application, rather than start the application's message pump.</p><p> return FALSE;</p><p><b> }</b></p><p>
65、; int CMyQQClientApp::ExitInstance() </p><p><b> {</b></p><p> return CWinApp::ExitInstance();</p><p><b> }</b></p><p><b> 六:程序運(yùn)行的條件&
66、lt;/b></p><p><b> 網(wǎng)站打開</b></p><p><b> 服務(wù)器打開</b></p><p><b> 二個(gè)復(fù)制端口相同</b></p><p><b> 多人進(jìn)入聊天室</b></p><p&g
67、t;<b> 七:源代碼</b></p><p><b> 服務(wù)編碼</b></p><p> // MyQQServer.cpp : Defines the class behaviors for the application.</p><p><b> //</b></p>
68、<p> #include "stdafx.h"</p><p> #include "MyQQServer.h"</p><p> #include "MyQQServerDlg.h"</p><p> #include "ClientSocket.h"</p
69、><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[] = __FILE__;</p><p><b> #endif</b>&
70、lt;/p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CMyQQServerApp</p><p> BEGIN_MESSAGE_MAP(CMyQQServerApp, CWinApp)</p><
71、p> //{{AFX_MSG_MAP(CMyQQServerApp)</p><p> // NOTE - the ClassWizard will add and remove mapping macros here.</p><p> // DO NOT EDIT what you see in these blocks of generated code!</
72、p><p> //}}AFX_MSG</p><p> ON_COMMAND(ID_HELP, CWinApp::OnHelp)</p><p> END_MESSAGE_MAP()</p><p> /////////////////////////////////////////////////////////////////////
73、////////</p><p> // CMyQQServerApp construction</p><p> CMyQQServerApp::CMyQQServerApp()</p><p><b> {</b></p><p> // TODO: add construction code here,&l
74、t;/p><p> // Place all significant initialization in InitInstance</p><p> m_pClientSocketList = new CPtrList();</p><p><b> }</b></p><p> //////////////////
75、///////////////////////////////////////////////////////////</p><p> // The one and only CMyQQServerApp object</p><p> CMyQQServerApp theApp;</p><p> CCriticalSection g_cs; </p
76、><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CMyQQServerApp initialization</p><p> BOOL CMyQQServerApp::InitInstance()</p>&
77、lt;p><b> {</b></p><p> if (!AfxSocketInit())</p><p><b> {</b></p><p> AfxMessageBox(IDP_SOCKETS_INIT_FAILED);</p><p> return FALSE;</
78、p><p><b> }</b></p><p> AfxEnableControlContainer();</p><p> AfxInitRichEdit();</p><p> m_af.Start("IDR_MATINURF_GTBASE",NULL,GTP_LOAD_RESOURCE,N
79、ULL,"MATINURF") ;</p><p> // Standard initialization</p><p> // If you are not using these features and wish to reduce the size</p><p> // of your final executable, yo
80、u should remove from the following</p><p> // the specific initialization routines you do not need.</p><p> #ifdef _AFXDLL</p><p> Enable3dControls();// Call this when using
81、MFC in a shared DLL</p><p><b> #else</b></p><p> Enable3dControlsStatic();// Call this when linking to MFC statically</p><p><b> #endif</b></p>&l
82、t;p> CMyQQServerDlg dlg;</p><p> m_pMainWnd = &dlg;</p><p> int nResponse = dlg.DoModal();</p><p> if (nResponse == IDOK)</p><p><b> {</b></p
83、><p> // TODO: Place code here to handle when the dialog is</p><p> // dismissed with OK</p><p><b> }</b></p><p> else if (nResponse == IDCANCEL)</p>
84、;<p><b> {</b></p><p> // TODO: Place code here to handle when the dialog is</p><p> // dismissed with Cancel</p><p><b> }</b></p><p&g
85、t; // Since the dialog has been closed, return FALSE so that we exit the</p><p> // application, rather than start the application's message pump.</p><p> return FALSE;</p><p&
86、gt;<b> }</b></p><p> int CMyQQServerApp::ExitInstance() </p><p><b> {</b></p><p> Message msObj;</p><p> msObj.iType = SYSERROR;</p>
87、<p> msObj.iSubType = SERVERQUIT;</p><p> CPtrList * m_pClientList = m_pClientSocketList;</p><p> POSITION pos = m_pClientList ->GetHeadPosition();</p><p><b> if(
88、pos)</b></p><p><b> {</b></p><p> CClientSocket * m_pClientSocket;</p><p> for(int i = 0; i < m_pClientList ->GetCount(); i++)</p><p><b&
89、gt; {</b></p><p> m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));</p><p> m_pClientSocket ->Send(&msObj,sizeof(Message));</p><p
90、> Sleep(100);</p><p><b> }</b></p><p><b> }</b></p><p><b> //刪除</b></p><p> DeleteAllList();</p><p> retu
91、rn CWinApp::ExitInstance();</p><p><b> }</b></p><p> void CMyQQServerApp::DeleteAllList()</p><p><b> {</b></p><p><b> //刪除</b>&l
92、t;/p><p> POSITION pos = m_pClientSocketList ->GetHeadPosition();</p><p><b> if(pos)</b></p><p><b> {</b></p><p> CClientSocket * m_pClient
93、Socket;</p><p> for(int i = 0; i < m_pClientSocketList ->GetCount(); i++)</p><p><b> {</b></p><p> m_pClientSocket = static_cast < CClientSocket *>(m_pCli
94、entSocketList->GetNext(pos));</p><p> ASSERT(m_pClientSocket != NULL);</p><p> ASSERT_VALID(m_pClientSocket);</p><p> delete m_pClientSocket;</p><p><b> }&
95、lt;/b></p><p><b> }</b></p><p> delete m_pClientSocketList;</p><p><b> }</b></p><p><b> 執(zhí)行編碼</b></p><p> // Ch
96、atDialog.cpp : implementation file</p><p><b> //</b></p><p> #include "stdafx.h"</p><p> #include "MyQQClient.h"</p><p> #include &q
97、uot;ChatDialog.h"</p><p> #include "MainSocket.h"</p><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE</p><p>
98、static char THIS_FILE[] = __FILE__;</p><p><b> #endif</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CChatDialog
99、 dialog</p><p> CChatDialog::CChatDialog(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CChatDialog::IDD, pParent)</p><p><b> {</b></p><p> //{{AFX_DATA_INI
100、T(CChatDialog)</p><p> // NOTE: the ClassWizard will add member initialization here</p><p> //}}AFX_DATA_INIT</p><p><b> }</b></p><p> void CChatDialog:
101、:DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p> //{{AFX_DATA_MAP(CChatDialog)</p><p> DDX_Control(pDX
102、, IDC_SENDMESSAGE, m_MessageCtrl);</p><p> DDX_Control(pDX, IDC_RECEIVE, m_ReceiveCtrl);</p><p> //}}AFX_DATA_MAP</p><p><b> }</b></p><p> BEGIN_MESSAGE
103、_MAP(CChatDialog, CDialog)</p><p> //{{AFX_MSG_MAP(CChatDialog)</p><p> ON_WM_CLOSE()</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> //////
104、///////////////////////////////////////////////////////////////////////</p><p> // CChatDialog message handlers</p><p> void CChatDialog::DisplayMessage(CString UserName, CString strChatMessag
105、e)</p><p><b> {</b></p><p> CString strChat;</p><p> int nSLine = m_ReceiveCtrl.GetLineCount();</p><p> CHARFORMAT2 uFont;</p><p> uFont.c
106、bSize = sizeof(uFont);</p><p> uFont.dwMask = CFM_COLOR;</p><p> uFont.dwEffects = ~CFE_AUTOCOLOR;</p><p> uFont.crTextColor = RGB(200,90,50);</p><p> m_ReceiveCtrl
107、.GetWindowText(strChat);</p><p> int nLength = strChat.GetLength();</p><p> m_ReceiveCtrl.SetSel(nLength,nLength);</p><p> m_ReceiveCtrl.SetWordCharFormat(uFont);</p><
108、p> strChat = UserName + _T(" 說:\r\n");</p><p> m_ReceiveCtrl.ReplaceSel(strChat);</p><p> uFont.dwEffects = CFE_AUTOCOLOR;</p><p> m_ReceiveCtrl.SetWordCharFormat(u
109、Font);</p><p> strChat = _T(" ") + strChatMessage + _T("\r\n");</p><p> m_ReceiveCtrl.ReplaceSel(strChat);</p><p> int nELine = m_ReceiveCtrl.GetLineCount(
110、);</p><p> m_ReceiveCtrl.LineScroll(nELine - nSLine);</p><p><b> }</b></p><p> void CChatDialog::OnOK() </p><p><b> {</b></p><p&g
111、t; CString strMessage;</p><p> m_MessageCtrl.GetWindowText(strMessage);</p><p> if (strMessage.IsEmpty()) return;</p><p> ((CMainSocket *)m_pClientSocket)->SendMessage(m_Clie
112、ntName,strMessage);</p><p> CString strChat;</p><p> int nSLine = m_ReceiveCtrl.GetLineCount();</p><p> CHARFORMAT2 uFont;</p><p> uFont.cbSize = sizeof(uFont);<
113、/p><p> uFont.dwMask = CFM_COLOR;</p><p> uFont.dwEffects = ~CFE_AUTOCOLOR;</p><p> uFont.crTextColor = RGB(0,0,255);</p><p> m_ReceiveCtrl.GetWindowText(strChat);<
114、/p><p> int nLength = strChat.GetLength();</p><p> m_ReceiveCtrl.SetSel(nLength,nLength);</p><p> m_ReceiveCtrl.SetWordCharFormat(uFont);</p><p> strChat = ((CMainSock
115、et *)m_pClientSocket)->m_UserName + _T(" 說: \r\n");</p><p> m_ReceiveCtrl.ReplaceSel(strChat);</p><p> uFont.dwEffects = CFE_AUTOCOLOR;</p><p> m_ReceiveCtrl.SetW
116、ordCharFormat(uFont);</p><p> strChat = _T(" ") + strMessage + _T("\r\n");</p><p> m_ReceiveCtrl.ReplaceSel(strChat);</p><p> int nELine = m_ReceiveCtrl.Ge
117、tLineCount();</p><p> //m_ReceiveCtrl.LineScroll(nELine - nSLine);</p><p> m_MessageCtrl.SetWindowText("");</p><p> m_MessageCtrl.SetFocus();</p><p> //
118、CDialog::OnOK();</p><p><b> }</b></p><p> void CChatDialog::OnClose() </p><p><b> {</b></p><p> // TODO: Add your message handler code here
119、 and/or call default</p><p> DestroyWindow();</p><p> CDialog::OnClose();</p><p><b> }</b></p><p> BOOL CChatDialog::OnInitDialog() </p><p>
120、;<b> {</b></p><p> CDialog::OnInitDialog();</p><p> // TODO: Add extra initialization here</p><p> //SetIcon(m_hIcon, TRUE);// Set big icon</p><p>
121、 //SetIcon(m_hIcon, FALSE);// Set small icon</p><p> CString strTip;</p><p> strTip.Format("%s 說話:",m_UserName);</p><p> SetWindowText(strTip);</p><p>
122、 return TRUE; // return TRUE unless you set the focus to a control</p><p> // EXCEPTION: OCX Property Pages should return FALSE</p><p><b> }</b></p><p> BOOL CChatDi
123、alog::DestroyWindow() </p><p><b> {</b></p><p> for(int i=0;i<m_pClientSocket->m_ChatDlgs.GetSize();i++)</p><p><b> {</b></p><p> CCha
124、tDialog * ChatDlg = (CChatDialog *)m_pClientSocket->m_ChatDlgs.GetAt(i);</p><p> if(ChatDlg->m_UserName == m_UserName)</p><p><b> {</b></p><p> m_pClientSocket-
125、>m_ChatDlgs.RemoveAt(i);</p><p> //delete ChatDlg;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p&g
126、t; return CDialog::DestroyWindow();</p><p><b> }</b></p><p><b> 七:執(zhí)行結(jié)果與分析</b></p><p> 輸入端口,單擊“啟動”,如下圖所示:</p><p> 啟動客戶端,輸入IP地址、端口(必須與服務(wù)器端口相同
127、)、昵稱、選擇頭像,單擊“登錄”,如下圖:</p><p><b> 登錄結(jié)果如下圖:</b></p><p> 此時(shí),服務(wù)器接到信號,登錄成功,如下圖:</p><p><b> 八:設(shè)計(jì)總結(jié)</b></p><p> 本小組設(shè)計(jì)的QQ聊天室功能雖然不夠齊全,但是根據(jù)廣大客戶的需求進(jìn)行設(shè)計(jì)
128、,本小組設(shè)計(jì)的聊天室操作簡單,適于廣大的群體,老少皆宜。設(shè)計(jì)QQ聊天室時(shí)不僅運(yùn)用了當(dāng)前所學(xué)知識,也在該課程設(shè)計(jì)中全體成員得到進(jìn)一步的提高,體現(xiàn)了本小組的團(tuán)結(jié)精神,當(dāng)然還離不開老師的指導(dǎo)和同學(xué)們的幫助 。</p><p><b> 九:參考文獻(xiàn)</b></p><p> 《C語言程序設(shè)計(jì)》 何欽銘 顏暉主編</p><p> 《數(shù)據(jù)結(jié)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于linux的socket網(wǎng)絡(luò)編程聊天工具課程設(shè)計(jì)
- 基于netbios的聊天工具
- 課程設(shè)計(jì)報(bào)告---聊天工具服務(wù)器端設(shè)計(jì)
- 基于android的即時(shí)聊天工具
- 基于OpenSSL開發(fā)的聊天工具的設(shè)計(jì)與實(shí)現(xiàn).pdf
- java網(wǎng)頁版即時(shí)聊天工具開題報(bào)告
- 局域網(wǎng)聊天工具設(shè)計(jì)畢業(yè)論文
- 網(wǎng)絡(luò)聊天工具的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 聊天工具仿真表情插件的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 開題報(bào)告-基于android的即時(shí)聊天工具
- 基于.net的局域網(wǎng)聊天工具
- 網(wǎng)絡(luò)聊天工具的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 基于java的網(wǎng)絡(luò)安全聊天工具畢業(yè)設(shè)計(jì)
- 基于.net的局域網(wǎng)聊天工具論文
- java基于tcp_ip協(xié)議的聊天工具的設(shè)計(jì)與開發(fā)畢業(yè)設(shè)計(jì)
- 畢業(yè)論文---局域網(wǎng)聊天工具的設(shè)計(jì)與實(shí)現(xiàn)
- 軟件開發(fā)工具課程設(shè)計(jì)報(bào)告---軟件開發(fā)的現(xiàn)狀及發(fā)展
- 基于arm9-linux系統(tǒng)下的聊天工具軟件設(shè)計(jì)【開題報(bào)告】
- 網(wǎng)絡(luò)視頻聊天工具的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 畢業(yè)設(shè)計(jì)--網(wǎng)絡(luò)聊天工具的設(shè)計(jì)與實(shí)現(xiàn)(含外文翻譯)
評論
0/150
提交評論