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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論