版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p> [摘要]…………………………………………………………………3</p><p> 一 設(shè)計內(nèi)容…………………………………………………………..3</p><p> 1、設(shè)計目的……………………………………………………………………3</p><p> 2
2、、設(shè)計要求……………………………………………………………………3</p><p> 二 設(shè)計原理……………………………………………………………3</p><p> 三 設(shè)計過程…………………………………………………………….4</p><p> 1、程序設(shè)計流程及源代碼…………………………………………………….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> [參考文獻]………………………………………………….…………..20</p
5、><p><b> [摘要]</b></p><p> 當(dāng)今世界正處于信息時代,計算機和通信網(wǎng)絡(luò)是這一時代所謂“信息基礎(chǔ)設(shè)施”。在互聯(lián)網(wǎng)相當(dāng)普及的今天,在互聯(lián)網(wǎng)上聊天對很多“網(wǎng)蟲”來說已經(jīng)是家常便飯了。聊天室程序可以說是網(wǎng)上最簡單的多點通信程序。一個簡單的聊天室, 從程序員的觀點來看就是在多個I/O端點之間實現(xiàn)多對多的通信?;赟OCKET的局域網(wǎng)通信是一種靈活的、易
6、于實現(xiàn)的、低成本的方法。它可以運行在各種使用TCP/IP協(xié)議作為通訊協(xié)議的網(wǎng)絡(luò)上。而在SOCKET API的幫助下,開發(fā)基于SOCKET的局域網(wǎng)通信軟件也是易于實現(xiàn)的。</p><p><b> [正文]</b></p><p><b> 一、設(shè)計內(nèi)容</b></p><p><b> 1、設(shè)計目的<
7、/b></p><p> 綜合運用本課程及計算機網(wǎng)絡(luò)的相關(guān)知識設(shè)計并實現(xiàn)一個網(wǎng)絡(luò)應(yīng)用程序,以Visual C++作為開發(fā)平臺,通過實踐復(fù)習(xí)鞏固課堂所學(xué)的理論知識,提高對所學(xué)知識的綜合應(yīng)用能力。</p><p><b> 2、設(shè)計要求</b></p><p> 采用客戶/服務(wù)器模式,分為客戶端程序和服務(wù)器端程序。服務(wù)器采用WINSOC
8、K I/O模型中的任一種,支持多個客戶同時在線聊天??蛻舳顺绦蚝头?wù)器程序通過網(wǎng)絡(luò)交換聊天字符串內(nèi)容,服務(wù)器窗口的列表框中顯示當(dāng)前在線用戶,支持客戶端之間的私聊(可以通過服務(wù)器中轉(zhuǎn),或考慮UDP打洞直接建立端端連接)。</p><p><b> 二、設(shè)計原理</b></p><p> 服務(wù)器端通過socket()系統(tǒng)調(diào)用創(chuàng)建一個Socket數(shù)組后(即設(shè)定了接受連接
9、客戶的最大數(shù)目),與指定的本地端口綁定bind(),就可以在端口進行偵聽listen()。如果有客戶端連接請求,則在數(shù)組中選擇一個空Socket,將客戶端地址賦給這個Socket。然后登錄成功的客戶就可以在服務(wù)器上聊天了??蛻舳顺绦蛳鄬唵?,只需要建立一個Socket與服務(wù)器端連接,成功后通過這個Socket來發(fā)送和接收數(shù)據(jù)就可以了。socket聊天室基本原理是,拋開CGI(公共網(wǎng)關(guān)接口)和www服務(wù)器,根據(jù)html規(guī)范,接收到瀏覽器的
10、請求以后,模仿www服務(wù)器的響應(yīng),將聊天內(nèi)容發(fā)回瀏覽器。在瀏覽器看來就像瀏覽一個巨大的頁面一樣始終處于頁面聯(lián)接狀態(tài), 這就是一個專門的聊天服務(wù)器,一個簡化了的www服務(wù)器。</p><p><b> 三、設(shè)計過程</b></p><p> 1、程序設(shè)計流程及源代碼</p><p><b> (1)流程圖</b><
11、;/p><p><b> (2)源代碼</b></p><p><b> I服務(wù)器:</b></p><p> // ServerDlg.cpp : implementation file</p><p><b> //</b></p><p>
12、#include "stdafx.h"</p><p> #include "Server.h"</p><p> #include "ServerDlg.h"</p><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW<
13、/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><b> {</b></p><p><b> public:
15、</b></p><p> CAboutDlg();</p><p> protected:</p><p> DECLARE_MESSAGE_MAP()</p><p><b> };</b></p><p> CAboutDlg::CAboutDlg() : CDialo
16、g(CAboutDlg::IDD)</p><p><b> {</b></p><p><b> }</b></p><p> void CAboutDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b>&
17、lt;/p><p> CDialog::DoDataExchange(pDX);</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)</p><p> END_MESSAGE_MAP()</p><p> ///
18、//////////////////////////////////////////////////////////////////////////</p><p> // CServerDlg dialog</p><p> CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)</p><p> : CDialog(
19、CServerDlg::IDD, pParent)</p><p><b> {</b></p><p> m_hIcon = AfxGetApp()->LoadIcon(IDI_ICONAPP);</p><p><b> }</b></p><p> void CServerDlg
20、::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p> DDX_Control(pDX, IDC_LIST_USER, m_lbUser);</p><p> D
21、DX_Text(pDX, IDC_EDIT_DISPLAY, m_strDisplay);</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CServerDlg, CDialog)</p><p> ON_WM_SYSCOMMAND()</p><p> ON_WM_P
22、AINT()</p><p> ON_WM_QUERYDRAGICON()</p><p> ON_BN_CLICKED(IDC_BN_START, OnBnStart)</p><p> ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)</p><p> ON_MESSAGE(WM_RECEIVE, On
23、Receive)</p><p> ON_MESSAGE(WM_CLIENTCLOSE, OnClientClose)</p><p> ON_MESSAGE(WM_ACCEPT, OnAccept)</p><p> ON_WM_DESTROY()</p><p> END_MESSAGE_MAP()</p><
24、p> /////////////////////////////////////////////////////////////////////////////</p><p> // CServerDlg message handlers</p><p> BOOL CServerDlg::OnInitDialog()</p><p><b>
25、; {</b></p><p> CDialog::OnInitDialog();</p><p> ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);</p><p> ASSERT(IDM_ABOUTBOX < 0xF000);</p><p> CMenu
26、* pSysMenu = GetSystemMenu(FALSE);</p><p> if (pSysMenu != NULL)</p><p><b> {</b></p><p> CString strAboutMenu;</p><p> strAboutMenu.LoadString(IDS_ABOU
27、TBOX);</p><p> if (!strAboutMenu.IsEmpty())</p><p><b> {</b></p><p> pSysMenu->AppendMenu(MF_SEPARATOR);</p><p> pSysMenu->AppendMenu(MF_STRING, I
28、DM_ABOUTBOX, strAboutMenu);</p><p><b> }</b></p><p><b> }</b></p><p> SetIcon(m_hIcon, TRUE);// Set big icon</p><p> SetIcon(m_hIcon, FAL
29、SE);// Set small icon</p><p> m_iNetPort = 3127;</p><p> m_Server.Initialize(this);</p><p> m_bServer = FALSE;</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(F
30、ALSE);</p><p> return TRUE; // return TRUE unless you set the focus to a control</p><p><b> }</b></p><p> void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam)<
31、/p><p><b> {</b></p><p> if ((nID & 0xFFF0) == IDM_ABOUTBOX)</p><p><b> {</b></p><p> CAboutDlg dlgAbout;</p><p> dlgAbout.Do
32、Modal();</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> CDialog::OnSysCommand(nID, lParam);</p><p>&
33、lt;b> }</b></p><p><b> }</b></p><p> void CServerDlg::OnPaint() </p><p><b> {</b></p><p> if (IsIconic())</p><p><
34、b> {</b></p><p> CPaintDC dc(this); // device context for painting</p><p> SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);</p><p> int cxIcon = GetSystemMe
35、trics(SM_CXICON);</p><p> int cyIcon = GetSystemMetrics(SM_CYICON);</p><p> CRect rect;</p><p> GetClientRect(&rect);</p><p> int x = (rect.Width() - cxIcon + 1
36、) / 2;</p><p> int y = (rect.Height() - cyIcon + 1) / 2;</p><p> dc.DrawIcon(x, y, m_hIcon);</p><p><b> }</b></p><p><b> else</b></p>
37、<p><b> {</b></p><p> CDialog::OnPaint();</p><p><b> }</b></p><p><b> }</b></p><p> HCURSOR CServerDlg::OnQueryDragIcon()
38、</p><p><b> {</b></p><p> return (HCURSOR) m_hIcon;</p><p><b> }</b></p><p> void CServerDlg::OnBnStart() </p><p><b> {&
39、lt;/b></p><p><b> // 創(chuàng)建套接字</b></p><p> m_Server.Create(m_iNetPort);</p><p><b> // 開始監(jiān)聽</b></p><p> m_Server.Listen();</p><p>
40、;<b> // 顯示</b></p><p> CString strInfo;</p><p> strInfo.LoadString(IDS_CREATE_SERVER);</p><p> ShowInDisplay(strInfo);</p><p> m_bServer = TRUE;</p&
41、gt;<p> GetDlgItem(IDC_BN_START)->EnableWindow(FALSE);</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE);</p><p><b> }</b></p><p> void CServerDlg::O
42、nBnClose() </p><p><b> {</b></p><p> CloseServer();</p><p> GetDlgItem(IDC_BN_START)->EnableWindow(TRUE);</p><p> GetDlgItem(IDC_BN_CLOSE)->Enable
43、Window(FALSE);</p><p><b> }</b></p><p> void CServerDlg::OnAccept()</p><p><b> {</b></p><p><b> // 創(chuàng)建新客戶</b></p><p>
44、; CMySocket *pNewClient = new CMySocket;</p><p> pNewClient->Initialize(this);</p><p> m_Server.Accept(*pNewClient);</p><p><b> // 放入鏈表中</b></p><p>
45、 m_lsClient.AddTail(pNewClient);</p><p><b> }</b></p><p> void CServerDlg::OnClientClose(WPARAM wParam, LPARAM lParam)</p><p><b> {</b></p><p&g
46、t; CMySocket *p_delClient = (CMySocket*)wParam;</p><p><b> // 關(guān)閉該用戶</b></p><p> p_delClient->ShutDown();</p><p> char buffer[BUFFERSIZE];</p><p> wh
47、ile(p_delClient->Receive(buffer, BUFFERSIZE)>0);</p><p> p_delClient->Close();</p><p> // 在用戶鏈表中刪除該用戶</p><p> POSITION psCur, psList = m_lsClient.GetHeadPosition();</
48、p><p> CMySocket *p_curClient;</p><p> while(psList!=NULL)</p><p><b> {</b></p><p> psCur = psList;</p><p> p_curClient = (CMySocket *)m_lsCl
49、ient.GetNext(psList);</p><p> if(p_delClient==p_curClient)</p><p><b> {</b></p><p> m_lsClient.RemoveAt(psCur);</p><p><b> break;</b></p&
50、gt;<p><b> }</b></p><p><b> }</b></p><p> // 發(fā)送信息告訴其他用戶該客戶退出</p><p> CString strMsg;</p><p> strMsg.LoadString(IDS_CLIENT_CLOSE);<
51、;/p><p> NETMESSAGE netMessage(PTC_CLIENT_QUIT, p_delClient->GetName(), _T(""), p_delClient->GetName() + strMsg);</p><p> SendToAllClient(netMessage);</p><p> // 界面上
52、清理該用戶信息</p><p> m_lbUser.DeleteString(m_lbUser.FindString(-1, p_delClient->GetName()));</p><p> ShowInDisplay(p_delClient->GetName() + strMsg);</p><p><b> // 刪除該用戶<
53、;/b></p><p> delete p_delClient;</p><p><b> }</b></p><p> void CServerDlg::OnReceive(WPARAM wParam, LPARAM lParam)</p><p><b> {</b></p
54、><p> CMySocket *p_curClient = (CMySocket*)wParam;</p><p> NETMESSAGE netMessage;</p><p> p_curClient->Receive((char *)&netMessage, sizeof(netMessage));</p><p>
55、 switch(netMessage.type)</p><p><b> {</b></p><p> case PTC_NEW:// 新客戶加入</p><p> NewClientAdd(p_curClient, &netMessage);</p><p><b> break;&l
56、t;/b></p><p> case PTC_SAY:// 普通聊天</p><p> ShowMessage(netMessage);</p><p><b> break;</b></p><p><b> }</b></p><p> // 把加
57、工過的信息發(fā)送給其他用戶</p><p> SendToAllClient(netMessage);</p><p><b> }</b></p><p> void CServerDlg::CloseServer()</p><p><b> {</b></p><p&
58、gt; if(!m_bServer) return;</p><p> // 向所有客戶發(fā)送服務(wù)端關(guān)閉的信息</p><p> CString strInfo;</p><p> strInfo.LoadString(IDS_CLOSESERVER);</p><p> NETMESSAGE netMessage(PTC_SYSTE
59、M, _T(""), _T(""), strInfo);</p><p> SendToAllClient(netMessage);</p><p> // 服務(wù)端界面顯示關(guān)閉信息</p><p> ShowInDisplay(strInfo);</p><p><b> // 關(guān)閉服
60、務(wù)端</b></p><p> m_Server.Close();</p><p><b> // 關(guān)閉客戶端</b></p><p> char buffer[BUFFERSIZE];</p><p> CMySocket *m_pClient;</p><p> POSI
61、TION psList = m_lsClient.GetHeadPosition();</p><p> while(psList!=NULL)</p><p><b> {</b></p><p> m_pClient = (CMySocket *)m_lsClient.GetNext(psList);</p><p
62、> m_pClient->ShutDown();</p><p> while(m_pClient->Receive(buffer, BUFFERSIZE)>0);</p><p> m_pClient->Close();</p><p> delete m_pClient;</p><p><b&
63、gt; }</b></p><p> m_lsClient.RemoveAll();</p><p> m_bServer = FALSE;</p><p><b> }</b></p><p> // 向所有戶發(fā)出信息</p><p> void CServerDlg::
64、SendToAllClient(const NETMESSAGE &netMessage)</p><p><b> {</b></p><p> CMySocket *m_pClient;</p><p> POSITION psList = m_lsClient.GetHeadPosition();</p>&l
65、t;p> while(psList!=NULL)</p><p><b> {</b></p><p> m_pClient = (CMySocket *)m_lsClient.GetNext(psList);</p><p> m_pClient->SendMsg(netMessage);</p><p
66、><b> }</b></p><p><b> }</b></p><p> void CServerDlg::ShowInDisplay(CString str)</p><p><b> {</b></p><p> m_strDisplay += str
67、 + "\r\n";</p><p> UpdateData(false);</p><p><b> }</b></p><p> void CServerDlg::OnDestroy() </p><p><b> {</b></p><p>
68、 CDialog::OnDestroy();</p><p> // TODO: Add your message handler code here</p><p><b> }</b></p><p><b> // 新用戶加入 </b></p><p> void CServerDl
69、g::NewClientAdd(CMySocket *p_client, NETMESSAGE *netMessage)</p><p><b> {</b></p><p><b> // 存入用戶名字</b></p><p> p_client->SetName(netMessage->form);&
70、lt;/p><p> // 在列表框中顯示該用戶</p><p> m_lbUser.AddString(p_client->GetName());</p><p> // 發(fā)送用戶列表給該客戶</p><p> NETMESSAGE netMsg(PTC_USER_LIST, _T(""), _T("
71、"), _T(""));</p><p> int iListLen = m_lbUser.GetCount();</p><p> CString strMsg;</p><p> for(int index=m_lbUser.GetTopIndex(); index<iListLen; index++)</p>
72、;<p><b> {</b></p><p> m_lbUser.GetText(index, strMsg);</p><p> strcpy(netMsg.data, (LPCTSTR)strMsg);</p><p> p_client->SendMsg(netMsg);</p><p&g
73、t;<b> }</b></p><p><b> // 加工信息</b></p><p> strMsg.LoadString(IDS_NEW_CLIENT);</p><p> strMsg = p_client->GetName() + strMsg;</p><p> str
74、cpy(netMessage->data, (LPCTSTR)strMsg);</p><p> // 顯示該用戶進入</p><p> ShowInDisplay(strMsg);</p><p><b> }</b></p><p><b> // 顯示普通消息</b></p
75、><p> void CServerDlg::ShowMessage(NETMESSAGE netMessage)</p><p><b> {</b></p><p> CString strTo = netMessage.to;</p><p> if(strTo==_T(""))</p
76、><p><b> {</b></p><p> strTo = "所有人";</p><p><b> }</b></p><p> CString strForm = netMessage.form;</p><p> CString strMs
77、g = netMessage.data;</p><p> CString strOut = strForm + "對" + strTo + "說:" + strMsg;</p><p> ShowInDisplay(strOut);</p><p><b> }</b></p>&l
78、t;p><b> II客戶端:</b></p><p> // ClientDlg.cpp : implementation file</p><p><b> //</b></p><p> #include "stdafx.h"</p><p> #inclu
79、de "Client.h"</p><p> #include "ClientDlg.h"</p><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE</p><p>
80、static char THIS_FILE[ ] = __FILE__;</p><p><b> #endif</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CAboutDlg
81、dialog used for App About</p><p> class CAboutDlg : public CDialog</p><p><b> {</b></p><p><b> public:</b></p><p> CAboutDlg();</p>&
82、lt;p> enum { IDD = IDD_ABOUTBOX };</p><p> protected:</p><p> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support</p><p> protected:</p><p>
83、DECLARE_MESSAGE_MAP()</p><p><b> };</b></p><p> CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)</p><p><b> {</b></p><p><b> }</b&g
84、t;</p><p> void CAboutDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p><b> }</b></p&
85、gt;<p> BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)</p><p> END_MESSAGE_MAP()</p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // C
86、ClientDlg dialog</p><p> CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CClientDlg::IDD, pParent)</p><p><b> {</b></p><p> m_strDispl
87、ay = _T("");</p><p> m_strSend = _T("");</p><p> m_bWhispering = FALSE;</p><p> m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);</p><p><b&g
88、t; }</b></p><p> void CClientDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p> DDX_Control(p
89、DX, 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);</p><p> DDX_Check(pDX, IDC_CHECK_WHISPERING,
90、 m_bWhispering);</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CClientDlg, CDialog)</p><p> ON_WM_SYSCOMMAND()</p><p> ON_WM_PAINT()</p><p>
91、ON_WM_QUERYDRAGICON()</p><p> ON_BN_CLICKED(IDC_BN_CONNECT, OnBnConnect)</p><p> ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)</p><p> ON_BN_CLICKED(IDC_BN_SEND, OnBnSend)</p>&l
92、t;p> ON_MESSAGE(WM_RECEIVE, OnReceive)</p><p> ON_MESSAGE(WM_SOCKETCLOSE, OnServerClose)</p><p> ON_MESSAGE(WM_SEND, OnSend)</p><p> ON_MESSAGE(WM_CONNCET, OnConnect)</p&g
93、t;<p> ON_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser)</p><p> END_MESSAGE_MAP()</p><p> /////////////////////////////////////////////////////////////////////////////</p><p&g
94、t; // CClientDlg message handlers</p><p> BOOL CClientDlg::OnInitDialog()</p><p><b> {</b></p><p> CDialog::OnInitDialog();</p><p> ASSERT((IDM_ABOUTBO
95、X & 0xFFF0) == IDM_ABOUTBOX);</p><p> ASSERT(IDM_ABOUTBOX < 0xF000);</p><p> CMenu* pSysMenu = GetSystemMenu(FALSE);</p><p> if (pSysMenu != NULL)</p><p><
96、b> {</b></p><p> CString strAboutMenu;</p><p> strAboutMenu.LoadString(IDS_ABOUTBOX);</p><p> if (!strAboutMenu.IsEmpty())</p><p><b> {</b><
97、;/p><p> pSysMenu->AppendMenu(MF_SEPARATOR);</p><p> pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);</p><p><b> }</b></p><p><b> }
98、</b></p><p> SetIcon(m_hIcon, TRUE);// Set big icon</p><p> SetIcon(m_hIcon, FALSE);// Set small icon</p><p><b> // 參數(shù)初始化</b></p><p> m_Socke
99、t.Initialize(this);</p><p> m_strNetIP = _T("127.0.0.1");</p><p> m_iNetPort = 3127;</p><p> m_bConnect = FALSE;</p><p> GetDlgItem(IDC_BN_CLOSE)->Enab
100、leWindow(FALSE);</p><p> GetDlgItem(IDC_BN_SEND)->EnableWindow(FALSE);</p><p> return TRUE; // return TRUE unless you set the focus to a control</p><p><b> }</b>
101、</p><p> void CClientDlg::OnSysCommand(UINT nID, LPARAM lParam)</p><p><b> {</b></p><p> if ((nID & 0xFFF0) == IDM_ABOUTBOX)</p><p><b> {</
102、b></p><p> CAboutDlg dlgAbout;</p><p> dlgAbout.DoModal();</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b>
103、;</p><p> CDialog::OnSysCommand(nID, lParam);</p><p><b> }</b></p><p><b> }</b></p><p> void CClientDlg::OnPaint() </p><p><
104、b> {</b></p><p> if (IsIconic())</p><p><b> {</b></p><p> CPaintDC dc(this); // device context for painting</p><p> SendMessage(WM_ICONERASEBK
105、GND, (WPARAM) dc.GetSafeHdc(), 0);</p><p> int cxIcon = GetSystemMetrics(SM_CXICON);</p><p> int cyIcon = GetSystemMetrics(SM_CYICON);</p><p> CRect rect;</p><p> G
106、etClientRect(&rect);</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&g
107、t;<b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> CDialog::OnPaint();</p><p><b> }</b></p><p>&
108、lt;b> }</b></p><p> HCURSOR CClientDlg::OnQueryDragIcon()</p><p><b> {</b></p><p> return (HCURSOR) m_hIcon;</p><p><b> }</b></
109、p><p> void CClientDlg::OnBnConnect() </p><p><b> {</b></p><p> CString strConnectError;</p><p><b> // 獲取用戶名字</b></p><p> CInputD
110、lg inputDlg;</p><p> int iResult = inputDlg.DoModal();</p><p> if(iResult==IDCANCEL){return;}</p><p> m_strName = inputDlg.m_strName;</p><p><b> // 創(chuàng)建套接字</
111、b></p><p> if(!m_Socket.Create())</p><p><b> {</b></p><p> strConnectError.LoadString(IDS_FAIL_CREATE_SOCKET);</p><p> ShowInDisplay(strConnectError)
112、;</p><p><b> return;</b></p><p><b> }</b></p><p> CString strInfo;</p><p> strInfo.LoadString(IDS_CONNECTING);</p><p> ShowInD
113、isplay(strInfo);</p><p><b> // 連接服務(wù)器</b></p><p> if(!m_Socket.Connect(m_strNetIP, m_iNetPort))</p><p><b> {</b></p><p> int n = m_Socket.Get
114、LastError();</p><p> strConnectError.LoadString(IDS_FAIL_CONNECT);</p><p> ShowInDisplay(strConnectError);</p><p><b> return;</b></p><p><b> }<
115、/b></p><p> strInfo.LoadString(IDS_SUCCEED_CONNECT);</p><p> ShowInDisplay(strInfo);</p><p> m_bConnect = TRUE;</p><p> // 發(fā)送自已的名字</p><p> NETMESSA
116、GE netMessage(PTC_NEW, m_strName, _T(""), _T(""));</p><p> m_Socket.SendMsg(netMessage);</p><p> GetDlgItem(IDC_BN_CONNECT)->EnableWindow(FALSE);</p><p> G
117、etDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE);</p><p> GetDlgItem(IDC_BN_SEND)->EnableWindow(TRUE);</p><p><b> }</b></p><p> void CClientDlg::OnBnClose() </p&g
118、t;<p><b> {</b></p><p> if(m_bConnect) </p><p><b> {</b></p><p> m_Socket.Close();</p><p> m_bConnect = FALSE;</p><p>
119、 GetDlgItem(IDC_BN_CONNECT)->EnableWindow(TRUE);</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p> GetDlgItem(IDC_BN_SEND)->EnableWindow(FALSE);</p><p> m_l
120、bUser.ResetContent();</p><p> CString strMsg;</p><p> strMsg.LoadString(IDS_BREAK);</p><p> ShowInDisplay(strMsg);</p><p><b> }</b></p><p>
121、<b> }</b></p><p> void CClientDlg::OnBnSend() </p><p><b> {</b></p><p><b> OnSend();</b></p><p> m_strSend = _T("");&
122、lt;/p><p> UpdateData(FALSE);</p><p><b> }</b></p><p> void CClientDlg::OnReceive()</p><p><b> {</b></p><p> NETMESSAGE netMessag
123、e;</p><p> m_Socket.Receive((char *)&netMessage, sizeof(netMessage));</p><p> CString strForm = netMessage.form;</p><p> // 過濾自已發(fā)出的信息</p><p> if(strForm==m_strN
124、ame) return;</p><p> CString strTo = netMessage.to;</p><p> CString strMsg = netMessage.data;</p><p> switch(netMessage.type)</p><p><b> {</b></p>
125、<p> case PTC_USER_LIST:// 用戶列表</p><p> m_lbUser.AddString(strMsg);</p><p><b> break;</b></p><p> case PTC_NEW:// 新用戶進入</p><p> m_lbUse
126、r.AddString(strForm);</p><p> ShowInDisplay(strMsg);</p><p><b> break;</b></p><p> case PTC_SAY:</p><p> ShowMessage(netMessage);</p><p>
127、case PTC_WHISPERING:// 密語</p><p> if(strTo!=m_strName) return;</p><p> ShowMessage(netMessage);</p><p><b> break;</b></p><p> case PTC_CLIENT_QUIT:
128、// 有用戶退出</p><p> m_lbUser.DeleteString(m_lbUser.FindString(-1, strForm));</p><p> ShowInDisplay(strMsg);</p><p><b> break;</b></p><p><b> }</b
129、></p><p><b> }</b></p><p> void CClientDlg::OnServerClose()</p><p><b> {</b></p><p> if(!m_bConnect) return;</p><p> CStrin
130、g strMsg;</p><p> strMsg.LoadString(IDS_SERVER_CLOSE);</p><p> ShowInDisplay(strMsg);</p><p> m_Socket.Close();</p><p> m_bConnect = FALSE;</p><p> Ge
131、tDlgItem(IDC_BN_CONNECT)->EnableWindow(TRUE);</p><p> GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p> GetDlgItem(IDC_BN_SEND)->EnableWindow(FALSE);</p><p> m_lbUs
132、er.ResetContent();</p><p><b> }</b></p><p> void CClientDlg::OnSend()</p><p><b> {</b></p><p> UpdateData(TRUE);</p><p> // 主要
133、是填充NETMESSAGE結(jié)構(gòu)體</p><p> NETMESSAGE netMessage;</p><p> strcpy(netMessage.form, m_strName);</p><p> strcpy(netMessage.data, m_strSend);</p><p> // 取得列表框中的用戶</p&g
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)編程課程設(shè)計-簡單的聊天室程序設(shè)計
- 網(wǎng)絡(luò)編程課程設(shè)計---網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計-java聊天室
- vc++課程設(shè)計--聊天室程序設(shè)計
- mfc課程設(shè)計報告---聊天室程序設(shè)計
- 網(wǎng)絡(luò)編程課程設(shè)計報告--基于linux網(wǎng)絡(luò)聊天室設(shè)計
- java課程設(shè)計之簡單聊天室
- 聊天室課程設(shè)計---聊天程序的設(shè)計和實現(xiàn)
- java網(wǎng)絡(luò)聊天室課程設(shè)計
- tcp課程設(shè)計--網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計報告-android_socket_聊天室
- 基于java的簡單網(wǎng)絡(luò)聊天室編程
- 基于java的聊天室程序設(shè)計
- mfc聊天軟件課程設(shè)計---網(wǎng)絡(luò)聊天程序設(shè)計
- mfc聊天軟件課程設(shè)計---網(wǎng)絡(luò)聊天程序設(shè)計
- web課程設(shè)計—— 聊天室
- 使用vb設(shè)計聊天室-多點對多點網(wǎng)絡(luò)程序設(shè)計
- java課程設(shè)計--簡單的網(wǎng)絡(luò)聊天程序
- 軟件課程設(shè)計報告---簡易網(wǎng)絡(luò)聊天室
- java課程設(shè)計報告---利用java實現(xiàn)簡單聊天室
評論
0/150
提交評論