版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p> [摘要]…………………………………………………………………3</p><p> 一 設(shè)計(jì)內(nèi)容…………………………………………………………..3</p><p> 1、設(shè)計(jì)目的……………………………………………………………………3</p><p> 2
2、、設(shè)計(jì)要求……………………………………………………………………3</p><p> 二 設(shè)計(jì)原理……………………………………………………………3</p><p> 三 設(shè)計(jì)過程…………………………………………………………….4</p><p> 1、程序設(shè)計(jì)流程及源代碼…………………………………………………….4</p><p> (
3、1)流程圖……………………………………………………………………….4</p><p> (2)源代碼……………………………………………………………………….4</p><p> I服務(wù)器………………………………………………………………………4</p><p> II客戶端……………………………………………………………………..9</p><
4、p> 2、調(diào)試分析過程描述……………………………………………………………14</p><p> 3、結(jié)果分析………………………………………………………………………19</p><p> [結(jié)論]………………………………………………..………………….20</p><p> [參考文獻(xiàn)]………………………………………………….…………..20</p
5、><p><b> [摘要]</b></p><p> 當(dāng)今世界正處于信息時(shí)代,計(jì)算機(jī)和通信網(wǎng)絡(luò)是這一時(shí)代所謂“信息基礎(chǔ)設(shè)施”。在互聯(lián)網(wǎng)相當(dāng)普及的今天,在互聯(lián)網(wǎng)上聊天對(duì)很多“網(wǎng)蟲”來說已經(jīng)是家常便飯了。聊天室程序可以說是網(wǎng)上最簡(jiǎn)單的多點(diǎn)通信程序。一個(gè)簡(jiǎn)單的聊天室, 從程序員的觀點(diǎn)來看就是在多個(gè)I/O端點(diǎn)之間實(shí)現(xiàn)多對(duì)多的通信?;赟OCKET的局域網(wǎng)通信是一種靈活的、易
6、于實(shí)現(xiàn)的、低成本的方法。它可以運(yùn)行在各種使用TCP/IP協(xié)議作為通訊協(xié)議的網(wǎng)絡(luò)上。而在SOCKET API的幫助下,開發(fā)基于SOCKET的局域網(wǎng)通信軟件也是易于實(shí)現(xiàn)的。</p><p> 來源:http://www.51otaku.com sdeer圣迪奧</p><p><b> [正文]</b></p><p><b>
7、一、設(shè)計(jì)內(nèi)容</b></p><p><b> 1、設(shè)計(jì)目的</b></p><p> 綜合運(yùn)用本課程及計(jì)算機(jī)網(wǎng)絡(luò)的相關(guān)知識(shí)設(shè)計(jì)并實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)應(yīng)用程序,以Visual C++作為開發(fā)平臺(tái),通過實(shí)踐復(fù)習(xí)鞏固課堂所學(xué)的理論知識(shí),提高對(duì)所學(xué)知識(shí)的綜合應(yīng)用能力。</p><p><b> 2、設(shè)計(jì)要求</b>&l
8、t;/p><p> 采用客戶/服務(wù)器模式,分為客戶端程序和服務(wù)器端程序。服務(wù)器采用WINSOCK I/O模型中的任一種,支持多個(gè)客戶同時(shí)在線聊天??蛻舳顺绦蚝头?wù)器程序通過網(wǎng)絡(luò)交換聊天字符串內(nèi)容,服務(wù)器窗口的列表框中顯示當(dāng)前在線用戶,支持客戶端之間的私聊(可以通過服務(wù)器中轉(zhuǎn),或考慮UDP打洞直接建立端端連接)。</p><p><b> 二、設(shè)計(jì)原理</b></
9、p><p> 服務(wù)器端通過socket()系統(tǒng)調(diào)用創(chuàng)建一個(gè)Socket數(shù)組后(即設(shè)定了接受連接客戶的最大數(shù)目),與指定的本地端口綁定bind(),就可以在端口進(jìn)行偵聽listen()。如果有客戶端連接請(qǐng)求,則在數(shù)組中選擇一個(gè)空Socket,將客戶端地址賦給這個(gè)Socket。然后登錄成功的客戶就可以在服務(wù)器上聊天了。客戶端程序相對(duì)簡(jiǎn)單,只需要建立一個(gè)Socket與服務(wù)器端連接,成功后通過這個(gè)Socket來發(fā)送和接收數(shù)
10、據(jù)就可以了。socket聊天室基本原理是,拋開CGI(公共網(wǎng)關(guān)接口)和www服務(wù)器,根據(jù)html規(guī)范,接收到瀏覽器的請(qǐng)求以后,模仿www服務(wù)器的響應(yīng),將聊天內(nèi)容發(fā)回瀏覽器。在瀏覽器看來就像瀏覽一個(gè)巨大的頁面一樣始終處于頁面聯(lián)接狀態(tài), 這就是一個(gè)專門的聊天服務(wù)器,一個(gè)簡(jiǎn)化了的www服務(wù)器。</p><p><b> 三、設(shè)計(jì)過程</b></p><p> 1、程序設(shè)
11、計(jì)流程及源代碼</p><p><b> (1)流程圖</b></p><p><b> (2)源代碼</b></p><p><b> I服務(wù)器:</b></p><p> // ServerDlg.cpp : implementation file</p>
12、;<p><b> //</b></p><p> #include "stdafx.h"</p><p> #include "Server.h"</p><p> #include "ServerDlg.h"</p><p> #if
13、def _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><p>
14、; /////////////////////////////////////////////////////////////////////////////</p><p> // CAboutDlg dialog used for App About</p><p> class CAboutDlg : public CDialog</p><p><
15、;b> {</b></p><p><b> public:</b></p><p> CAboutDlg();</p><p> protected:</p><p> DECLARE_MESSAGE_MAP()</p><p><b> };</b
16、></p><p> CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)</p><p><b> {</b></p><p><b> }</b></p><p> void CAboutDlg::DoDataExchange(CData
17、Exchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)</p&g
18、t;<p> END_MESSAGE_MAP()</p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CServerDlg dialog</p><p> CServerDlg::CServerDlg
19、(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CServerDlg::IDD, pParent)</p><p><b> {</b></p><p> m_hIcon = AfxGetApp()->LoadIcon(IDI_ICONAPP);</p><p>&l
20、t;b> }</b></p><p> void CServerDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p> DDX_Cont
21、rol(pDX, IDC_LIST_USER, m_lbUser);</p><p> DDX_Text(pDX, IDC_EDIT_DISPLAY, m_strDisplay);</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CServerDlg, CDialog)</p>&
22、lt;p> ON_WM_SYSCOMMAND()</p><p> ON_WM_PAINT()</p><p> ON_WM_QUERYDRAGICON()</p><p> ON_BN_CLICKED(IDC_BN_START, OnBnStart)</p><p> ON_BN_CLICKED(IDC_BN_CLOSE,
23、OnBnClose)</p><p> ON_MESSAGE(WM_RECEIVE, OnReceive)</p><p> ON_MESSAGE(WM_CLIENTCLOSE, OnClientClose)</p><p> ON_MESSAGE(WM_ACCEPT, OnAccept)</p><p> ON_WM_DESTROY
24、()</p><p> END_MESSAGE_MAP()</p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CServerDlg message handlers</p><p> BO
25、OL CServerDlg::OnInitDialog()</p><p><b> {</b></p><p> CDialog::OnInitDialog();</p><p> ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);</p><p> ASS
26、ERT(IDM_ABOUTBOX < 0xF000);</p><p> CMenu* pSysMenu = GetSystemMenu(FALSE);</p><p> if (pSysMenu != NULL)</p><p><b> {</b></p><p> CString strAboutMe
27、nu;</p><p> strAboutMenu.LoadString(IDS_ABOUTBOX);</p><p> if (!strAboutMenu.IsEmpty())</p><p><b> {</b></p><p> pSysMenu->AppendMenu(MF_SEPARATOR);&
28、lt;/p><p> pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);</p><p><b> }</b></p><p><b> }</b></p><p> SetIcon(m_hIcon, TRUE);
29、// Set big icon</p><p> SetIcon(m_hIcon, FALSE);// Set small icon</p><p> m_iNetPort = 3127;</p><p> m_Server.Initialize(this);</p><p> m_bServer = FALSE;</p&g
30、t;<p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p> return TRUE; // return TRUE unless you set the focus to a control</p><p><b> }</b></p><p>
31、void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam)</p><p><b> {</b></p><p> if ((nID & 0xFFF0) == IDM_ABOUTBOX)</p><p><b> {</b></p><p&
32、gt; CAboutDlg dlgAbout;</p><p> dlgAbout.DoModal();</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p>
33、 CDialog::OnSysCommand(nID, lParam);</p><p><b> }</b></p><p><b> }</b></p><p> void CServerDlg::OnPaint() </p><p><b> {</b></
34、p><p> if (IsIconic())</p><p><b> {</b></p><p> CPaintDC dc(this); // device context for painting</p><p> SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSaf
35、eHdc(), 0);</p><p> int cxIcon = GetSystemMetrics(SM_CXICON);</p><p> int cyIcon = GetSystemMetrics(SM_CYICON);</p><p> CRect rect;</p><p> GetClientRect(&rect)
36、;</p><p> int x = (rect.Width() - cxIcon + 1) / 2;</p><p> int y = (rect.Height() - cyIcon + 1) / 2;</p><p> dc.DrawIcon(x, y, m_hIcon);</p><p><b> }</b>
37、;</p><p><b> else</b></p><p><b> {</b></p><p> CDialog::OnPaint();</p><p><b> }</b></p><p><b> }</b>&l
38、t;/p><p> HCURSOR CServerDlg::OnQueryDragIcon()</p><p><b> {</b></p><p> return (HCURSOR) m_hIcon;</p><p><b> }</b></p><p> void
39、CServerDlg::OnBnStart() </p><p><b> {</b></p><p><b> // 創(chuàng)建套接字</b></p><p> m_Server.Create(m_iNetPort);</p><p><b> // 開始監(jiān)聽</b><
40、;/p><p> m_Server.Listen();</p><p><b> // 顯示</b></p><p> CString strInfo;</p><p> strInfo.LoadString(IDS_CREATE_SERVER);</p><p> ShowInDispla
41、y(strInfo);</p><p> m_bServer = TRUE;</p><p> GetDlgItem(IDC_BN_START)->EnableWindow(FALSE);</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE);</p><p><b
42、> }</b></p><p> void CServerDlg::OnBnClose() </p><p><b> {</b></p><p> CloseServer();</p><p> GetDlgItem(IDC_BN_START)->EnableWindow(TRUE);
43、</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p><b> }</b></p><p> void CServerDlg::OnAccept()</p><p><b> {</b></p>
44、<p><b> // 創(chuàng)建新客戶</b></p><p> CMySocket *pNewClient = new CMySocket;</p><p> pNewClient->Initialize(this);</p><p> m_Server.Accept(*pNewClient);</p>&l
45、t;p><b> // 放入鏈表中</b></p><p> m_lsClient.AddTail(pNewClient);</p><p><b> }</b></p><p> void CServerDlg::OnClientClose(WPARAM wParam, LPARAM lParam)<
46、/p><p><b> {</b></p><p> CMySocket *p_delClient = (CMySocket*)wParam;</p><p><b> // 關(guān)閉該用戶</b></p><p> p_delClient->ShutDown();</p>&l
47、t;p> char buffer[BUFFERSIZE];</p><p> while(p_delClient->Receive(buffer, BUFFERSIZE)>0);</p><p> p_delClient->Close();</p><p> // 在用戶鏈表中刪除該用戶</p><p> P
48、OSITION psCur, psList = m_lsClient.GetHeadPosition();</p><p> CMySocket *p_curClient;</p><p> while(psList!=NULL)</p><p><b> {</b></p><p> psCur = psLis
49、t;</p><p> p_curClient = (CMySocket *)m_lsClient.GetNext(psList);</p><p> if(p_delClient==p_curClient)</p><p><b> {</b></p><p> m_lsClient.RemoveAt(psCu
50、r);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> // 發(fā)送信息告訴其他用戶該客戶退出</p><p> CString strMsg;<
51、/p><p> strMsg.LoadString(IDS_CLIENT_CLOSE);</p><p> NETMESSAGE netMessage(PTC_CLIENT_QUIT, p_delClient->GetName(), _T(""), p_delClient->GetName() + strMsg);</p><p>
52、 SendToAllClient(netMessage);</p><p> // 界面上清理該用戶信息</p><p> m_lbUser.DeleteString(m_lbUser.FindString(-1, p_delClient->GetName()));</p><p> ShowInDisplay(p_delClient->GetNa
53、me() + strMsg);</p><p><b> // 刪除該用戶</b></p><p> delete p_delClient;</p><p><b> }</b></p><p> void CServerDlg::OnReceive(WPARAM wParam, LPARA
54、M lParam)</p><p><b> {</b></p><p> CMySocket *p_curClient = (CMySocket*)wParam;</p><p> NETMESSAGE netMessage;</p><p> p_curClient->Receive((char *)&
55、amp;netMessage, sizeof(netMessage));</p><p> switch(netMessage.type)</p><p><b> {</b></p><p> case PTC_NEW:// 新客戶加入</p><p> NewClientAdd(p_curClient,
56、 &netMessage);</p><p><b> break;</b></p><p> case PTC_SAY:// 普通聊天</p><p> ShowMessage(netMessage);</p><p><b> break;</b></p>&
57、lt;p><b> }</b></p><p> // 把加工過的信息發(fā)送給其他用戶</p><p> SendToAllClient(netMessage);</p><p><b> }</b></p><p> void CServerDlg::CloseServer()<
58、;/p><p><b> {</b></p><p> if(!m_bServer) return;</p><p> // 向所有客戶發(fā)送服務(wù)端關(guān)閉的信息</p><p> CString strInfo;</p><p> strInfo.LoadString(IDS_CLOSESERV
59、ER);</p><p> NETMESSAGE netMessage(PTC_SYSTEM, _T(""), _T(""), strInfo);</p><p> SendToAllClient(netMessage);</p><p> // 服務(wù)端界面顯示關(guān)閉信息</p><p> Sho
60、wInDisplay(strInfo);</p><p><b> // 關(guān)閉服務(wù)端</b></p><p> m_Server.Close();</p><p><b> // 關(guān)閉客戶端</b></p><p> char buffer[BUFFERSIZE];</p>&
61、lt;p> CMySocket *m_pClient;</p><p> POSITION psList = m_lsClient.GetHeadPosition();</p><p> while(psList!=NULL)</p><p><b> {</b></p><p> m_pClient =
62、 (CMySocket *)m_lsClient.GetNext(psList);</p><p> m_pClient->ShutDown();</p><p> while(m_pClient->Receive(buffer, BUFFERSIZE)>0);</p><p> m_pClient->Close();</p>
63、;<p> delete m_pClient;</p><p><b> }</b></p><p> m_lsClient.RemoveAll();</p><p> m_bServer = FALSE;</p><p><b> }</b></p><
64、p> // 向所有戶發(fā)出信息</p><p> void CServerDlg::SendToAllClient(const NETMESSAGE &netMessage)</p><p><b> {</b></p><p> CMySocket *m_pClient;</p><p> POS
65、ITION psList = m_lsClient.GetHeadPosition();</p><p> while(psList!=NULL)</p><p><b> {</b></p><p> m_pClient = (CMySocket *)m_lsClient.GetNext(psList);</p><
66、p> m_pClient->SendMsg(netMessage);</p><p><b> }</b></p><p><b> }</b></p><p> void CServerDlg::ShowInDisplay(CString str)</p><p><b&
67、gt; {</b></p><p> m_strDisplay += str + "\r\n";</p><p> UpdateData(false);</p><p><b> }</b></p><p> void CServerDlg::OnDestroy() </p
68、><p><b> {</b></p><p> CDialog::OnDestroy();</p><p> // TODO: Add your message handler code here</p><p><b> }</b></p><p><b>
69、 // 新用戶加入 </b></p><p> void CServerDlg::NewClientAdd(CMySocket *p_client, NETMESSAGE *netMessage)</p><p><b> {</b></p><p><b> // 存入用戶名字</b></p&g
70、t;<p> p_client->SetName(netMessage->form);</p><p> // 在列表框中顯示該用戶</p><p> m_lbUser.AddString(p_client->GetName());</p><p> // 發(fā)送用戶列表給該客戶</p><p> NE
71、TMESSAGE netMsg(PTC_USER_LIST, _T(""), _T(""), _T(""));</p><p> int iListLen = m_lbUser.GetCount();</p><p> CString strMsg;</p><p> for(int index=m_
72、lbUser.GetTopIndex(); index<iListLen; index++)</p><p><b> {</b></p><p> m_lbUser.GetText(index, strMsg);</p><p> strcpy(netMsg.data, (LPCTSTR)strMsg);</p>&
73、lt;p> p_client->SendMsg(netMsg);</p><p><b> }</b></p><p><b> // 加工信息</b></p><p> strMsg.LoadString(IDS_NEW_CLIENT);</p><p> strMsg =
74、p_client->GetName() + strMsg;</p><p> strcpy(netMessage->data, (LPCTSTR)strMsg);</p><p> // 顯示該用戶進(jìn)入</p><p> ShowInDisplay(strMsg);</p><p><b> }</b>
75、;</p><p><b> // 顯示普通消息</b></p><p> void CServerDlg::ShowMessage(NETMESSAGE netMessage)</p><p><b> {</b></p><p> CString strTo = netMessage.t
76、o;</p><p> if(strTo==_T(""))</p><p><b> {</b></p><p> strTo = "所有人";</p><p><b> }</b></p><p> CString strF
77、orm = netMessage.form;</p><p> CString strMsg = netMessage.data;</p><p> CString strOut = strForm + "對(duì)" + strTo + "說:" + strMsg;</p><p> ShowInDisplay(strOut)
78、;</p><p><b> }</b></p><p><b> II客戶端:</b></p><p> // ClientDlg.cpp : implementation file</p><p><b> //</b></p><p>
79、#include "stdafx.h"</p><p> #include "Client.h"</p><p> #include "ClientDlg.h"</p><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW<
80、/p><p> #undef THIS_FILE</p><p> static char THIS_FILE[ ] = __FILE__;</p><p><b> #endif</b></p><p> ///////////////////////////////////////////////////////
81、//////////////////////</p><p> // CAboutDlg dialog used for App About</p><p> class CAboutDlg : public CDialog</p><p><b> {</b></p><p><b> public:
82、</b></p><p> CAboutDlg();</p><p> enum { IDD = IDD_ABOUTBOX };</p><p> protected:</p><p> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV suppo
83、rt</p><p> protected:</p><p> DECLARE_MESSAGE_MAP()</p><p><b> };</b></p><p> CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)</p><p><b
84、> {</b></p><p><b> }</b></p><p> void CAboutDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchan
85、ge(pDX);</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)</p><p> END_MESSAGE_MAP()</p><p> //////////////////////////////////////////////
86、///////////////////////////////</p><p> // CClientDlg dialog</p><p> CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CClientDlg::IDD, pParent)</p><p&
87、gt;<b> {</b></p><p> m_strDisplay = _T("");</p><p> m_strSend = _T("");</p><p> m_bWhispering = FALSE;</p><p> m_hIcon = AfxGetApp(
88、)->LoadIcon(IDR_MAINFRAME);</p><p><b> }</b></p><p> void CClientDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog
89、::DoDataExchange(pDX);</p><p> DDX_Control(pDX, IDC_LIST_USER, m_lbUser);</p><p> DDX_Text(pDX, IDC_EDIT_DIAPLAY, m_strDisplay);</p><p> DDX_Text(pDX, IDC_EDIT_SEND, m_strSend);&
90、lt;/p><p> DDX_Check(pDX, IDC_CHECK_WHISPERING, m_bWhispering);</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CClientDlg, CDialog)</p><p> ON_WM_SYSCOMMAND()&
91、lt;/p><p> ON_WM_PAINT()</p><p> ON_WM_QUERYDRAGICON()</p><p> ON_BN_CLICKED(IDC_BN_CONNECT, OnBnConnect)</p><p> ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)</p><
92、;p> ON_BN_CLICKED(IDC_BN_SEND, OnBnSend)</p><p> ON_MESSAGE(WM_RECEIVE, OnReceive)</p><p> ON_MESSAGE(WM_SOCKETCLOSE, OnServerClose)</p><p> ON_MESSAGE(WM_SEND, OnSend)</p
93、><p> ON_MESSAGE(WM_CONNCET, OnConnect)</p><p> ON_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser)</p><p> END_MESSAGE_MAP()</p><p> //////////////////////////////////////
94、///////////////////////////////////////</p><p> // CClientDlg message handlers</p><p> BOOL CClientDlg::OnInitDialog()</p><p><b> {</b></p><p> CDialog:
95、:OnInitDialog();</p><p> ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);</p><p> ASSERT(IDM_ABOUTBOX < 0xF000);</p><p> CMenu* pSysMenu = GetSystemMenu(FALSE);</p>
96、<p> if (pSysMenu != NULL)</p><p><b> {</b></p><p> CString strAboutMenu;</p><p> strAboutMenu.LoadString(IDS_ABOUTBOX);</p><p> if (!strAboutMen
97、u.IsEmpty())</p><p><b> {</b></p><p> pSysMenu->AppendMenu(MF_SEPARATOR);</p><p> pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);</p><p&
98、gt;<b> }</b></p><p><b> }</b></p><p> SetIcon(m_hIcon, TRUE);// Set big icon</p><p> SetIcon(m_hIcon, FALSE);// Set small icon</p><p>&
99、lt;b> // 參數(shù)初始化</b></p><p> m_Socket.Initialize(this);</p><p> m_strNetIP = _T("127.0.0.1");</p><p> m_iNetPort = 3127;</p><p> m_bConnect = FALS
100、E;</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p> GetDlgItem(IDC_BN_SEND)->EnableWindow(FALSE);</p><p> return TRUE; // return TRUE unless you set the foc
101、us to a control</p><p><b> }</b></p><p> void CClientDlg::OnSysCommand(UINT nID, LPARAM lParam)</p><p><b> {</b></p><p> if ((nID & 0xFF
102、F0) == IDM_ABOUTBOX)</p><p><b> {</b></p><p> CAboutDlg dlgAbout;</p><p> dlgAbout.DoModal();</p><p><b> }</b></p><p><b>
103、 else</b></p><p><b> {</b></p><p> CDialog::OnSysCommand(nID, lParam);</p><p><b> }</b></p><p><b> }</b></p><p
104、> void CClientDlg::OnPaint() </p><p><b> {</b></p><p> if (IsIconic())</p><p><b> {</b></p><p> CPaintDC dc(this); // device context for
105、 painting</p><p> SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);</p><p> int cxIcon = GetSystemMetrics(SM_CXICON);</p><p> int cyIcon = GetSystemMetrics(SM_CYICON);
106、</p><p> CRect rect;</p><p> GetClientRect(&rect);</p><p> int x = (rect.Width() - cxIcon + 1) / 2;</p><p> int y = (rect.Height() - cyIcon + 1) / 2;</p>
107、<p> dc.DrawIcon(x, y, m_hIcon);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> CDialog::OnPaint();</p&
108、gt;<p><b> }</b></p><p><b> }</b></p><p> HCURSOR CClientDlg::OnQueryDragIcon()</p><p><b> {</b></p><p> return (HCURSOR
109、) m_hIcon;</p><p><b> }</b></p><p> void CClientDlg::OnBnConnect() </p><p><b> {</b></p><p> CString strConnectError;</p><p>&l
110、t;b> // 獲取用戶名字</b></p><p> CInputDlg inputDlg;</p><p> int iResult = inputDlg.DoModal();</p><p> if(iResult==IDCANCEL){return;}</p><p> m_strName = inputD
111、lg.m_strName;</p><p><b> // 創(chuàng)建套接字</b></p><p> if(!m_Socket.Create())</p><p><b> {</b></p><p> strConnectError.LoadString(IDS_FAIL_CREATE_SOC
112、KET);</p><p> ShowInDisplay(strConnectError);</p><p><b> return;</b></p><p><b> }</b></p><p> CString strInfo;</p><p> strInfo
113、.LoadString(IDS_CONNECTING);</p><p> ShowInDisplay(strInfo);</p><p><b> // 連接服務(wù)器</b></p><p> if(!m_Socket.Connect(m_strNetIP, m_iNetPort))</p><p><b&g
114、t; {</b></p><p> int n = m_Socket.GetLastError();</p><p> strConnectError.LoadString(IDS_FAIL_CONNECT);</p><p> ShowInDisplay(strConnectError);</p><p><b&g
115、t; return;</b></p><p><b> }</b></p><p> strInfo.LoadString(IDS_SUCCEED_CONNECT);</p><p> ShowInDisplay(strInfo);</p><p> m_bConnect = TRUE;</p
116、><p> // 發(fā)送自已的名字</p><p> NETMESSAGE netMessage(PTC_NEW, m_strName, _T(""), _T(""));</p><p> m_Socket.SendMsg(netMessage);</p><p> GetDlgItem(IDC_BN
117、_CONNECT)->EnableWindow(FALSE);</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE);</p><p> GetDlgItem(IDC_BN_SEND)->EnableWindow(TRUE);</p><p><b> }</b>&l
118、t;/p><p> void CClientDlg::OnBnClose() </p><p><b> {</b></p><p> if(m_bConnect) </p><p><b> {</b></p><p> m_Socket.Close();</p
119、><p> m_bConnect = FALSE;</p><p> GetDlgItem(IDC_BN_CONNECT)->EnableWindow(TRUE);</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p> GetDlgItem(IDC_B
120、N_SEND)->EnableWindow(FALSE);</p><p> m_lbUser.ResetContent();</p><p> CString strMsg;</p><p> strMsg.LoadString(IDS_BREAK);</p><p> ShowInDisplay(strMsg);</p
121、><p><b> }</b></p><p><b> }</b></p><p> void CClientDlg::OnBnSend() </p><p><b> {</b></p><p><b> OnSend();</
122、b></p><p> m_strSend = _T("");</p><p> UpdateData(FALSE);</p><p><b> }</b></p><p> void CClientDlg::OnReceive()</p><p><b&g
123、t; {</b></p><p> NETMESSAGE netMessage;</p><p> m_Socket.Receive((char *)&netMessage, sizeof(netMessage));</p><p> CString strForm = netMessage.form;</p><p&
124、gt; // 過濾自已發(fā)出的信息</p><p> if(strForm==m_strName) return;</p><p> CString strTo = netMessage.to;</p><p> CString strMsg = netMessage.data;</p><p> switch(netMessage.
125、type)</p><p><b> {</b></p><p> case PTC_USER_LIST:// 用戶列表</p><p> m_lbUser.AddString(strMsg);</p><p><b> break;</b></p><p>
126、 case PTC_NEW:// 新用戶進(jìn)入</p><p> m_lbUser.AddString(strForm);</p><p> ShowInDisplay(strMsg);</p><p><b> break;</b></p><p> case PTC_SAY:</p>
127、<p> ShowMessage(netMessage);</p><p> case PTC_WHISPERING:// 密語</p><p> if(strTo!=m_strName) return;</p><p> ShowMessage(netMessage);</p><p><b> brea
128、k;</b></p><p> case PTC_CLIENT_QUIT:// 有用戶退出</p><p> m_lbUser.DeleteString(m_lbUser.FindString(-1, strForm));</p><p> ShowInDisplay(strMsg);</p><p><b>
129、; break;</b></p><p><b> }</b></p><p><b> }</b></p><p> void CClientDlg::OnServerClose()</p><p><b> {</b></p><p
130、> if(!m_bConnect) return;</p><p> CString strMsg;</p><p> strMsg.LoadString(IDS_SERVER_CLOSE);</p><p> ShowInDisplay(strMsg);</p><p> m_Socket.Close();</p>
131、;<p> m_bConnect = FALSE;</p><p> GetDlgItem(IDC_BN_CONNECT)->EnableWindow(TRUE);</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p> GetDlgItem(IDC_BN_S
132、END)->EnableWindow(FALSE);</p><p> m_lbUser.ResetContent();</p><p><b> }</b></p><p> void CClientDlg::OnSend()</p><p><b> {</b></p>
133、<p> UpdateData(TRUE);</p><p> // 主要是填充NETMESSAGE結(jié)構(gòu)體</p><p> NETMESSAGE netMessage;</p><p> strcpy(netMessage.form, m_strName);</p><p> strcpy(netMessage.da
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)---網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-java聊天室
- vc++課程設(shè)計(jì)--聊天室程序設(shè)計(jì)
- mfc課程設(shè)計(jì)報(bào)告---聊天室程序設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告--基于linux網(wǎng)絡(luò)聊天室設(shè)計(jì)
- java課程設(shè)計(jì)之簡(jiǎn)單聊天室
- 聊天室課程設(shè)計(jì)---聊天程序的設(shè)計(jì)和實(shí)現(xiàn)
- java網(wǎng)絡(luò)聊天室課程設(shè)計(jì)
- tcp課程設(shè)計(jì)--網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告-android_socket_聊天室
- 基于java的簡(jiǎn)單網(wǎng)絡(luò)聊天室編程
- 基于java的聊天室程序設(shè)計(jì)
- mfc聊天軟件課程設(shè)計(jì)---網(wǎng)絡(luò)聊天程序設(shè)計(jì)
- mfc聊天軟件課程設(shè)計(jì)---網(wǎng)絡(luò)聊天程序設(shè)計(jì)
- web課程設(shè)計(jì)—— 聊天室
- 使用vb設(shè)計(jì)聊天室-多點(diǎn)對(duì)多點(diǎn)網(wǎng)絡(luò)程序設(shè)計(jì)
- java課程設(shè)計(jì)--簡(jiǎn)單的網(wǎng)絡(luò)聊天程序
- 軟件課程設(shè)計(jì)報(bào)告---簡(jiǎn)易網(wǎng)絡(luò)聊天室
- java課程設(shè)計(jì)報(bào)告---利用java實(shí)現(xiàn)簡(jiǎn)單聊天室
評(píng)論
0/150
提交評(píng)論