網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡(jiǎn)單的聊天室程序設(shè)計(jì)_第1頁
已閱讀1頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論