2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  軟件課程設(shè)計報告</b></p><p>  電子信息工程學(xué)院09級 電子工程專業(yè)</p><p>  題目: 簡易網(wǎng)絡(luò)聊天系統(tǒng)</p><p>  2012年4月25日</p><p><b>  簡易網(wǎng)絡(luò)聊天系統(tǒng)</b></p><p>  

2、摘要:計算機(jī)網(wǎng)絡(luò)通信技術(shù)已經(jīng)深入我們的生活,并給我們即使通信帶來了很大的方</p><p>  隨著網(wǎng)絡(luò)的日益普及,各種聊天工具也層出不窮。本課程設(shè)計就是實(shí)現(xiàn)個簡易的網(wǎng)絡(luò)聊天程序。利用MFC為開發(fā)工具,實(shí)現(xiàn)基本的通信功能,以Windows為開發(fā)平臺,VC6.0為開發(fā)環(huán)境,程序運(yùn)行平臺為WindowsXP。</p><p>  關(guān)鍵字:網(wǎng)絡(luò)通信,MFC,SOCKET嵌套字,客戶端,服務(wù)器&l

3、t;/p><p><b>  引言</b></p><p>  1.1 課程設(shè)計的背景:在互聯(lián)網(wǎng)非常普及的今天,網(wǎng)絡(luò)聊天已經(jīng)成為我們?nèi)粘I钪胁豢扇鄙俚囊环N通信工具,聊天程序也應(yīng)該是一種基礎(chǔ)的程序。一個簡單的聊天程序,就是在多個I/O端點(diǎn)之間實(shí)現(xiàn)多對多的通信。基于SOCKET嵌套字的網(wǎng)通信是一種靈活的,易于實(shí)現(xiàn)的方法。在SOCKET API的幫助下,開發(fā)基于SOCKET的

4、局域網(wǎng)通信軟件是易于實(shí)現(xiàn)的。</p><p>  1.2 課程設(shè)計的目的:本設(shè)計的目標(biāo)是用C++語言設(shè)計一個實(shí)時聊天系統(tǒng)的程序。程序?qū)懲旰笞罱K生成一個客戶端,它由client和server兩部分組成,client和server之間的通信基于TCP協(xié)議。實(shí)現(xiàn)數(shù)據(jù)的收發(fā)。輸入聊天室使用的昵稱及目的主機(jī)的IP,連接到目的主機(jī),客戶端與客戶端之間即可實(shí)現(xiàn)簡易的聊天和傳輸文件的功能.</p><p>

5、;  第二章 設(shè)計依據(jù)及框圖</p><p>  2.1 設(shè)計平臺: 本課程設(shè)計的基本的網(wǎng)絡(luò)編程都是建立在Winsock基礎(chǔ)上的。Winsock是90年代初,為了方便網(wǎng)絡(luò)編程,由Microsoft聯(lián)合了其他幾家公司共同制定的一套WINDOWS下的網(wǎng)絡(luò)編程接口,它是通過C語言的動態(tài)鏈接庫方式提供給用戶及軟件開發(fā)者的,主要由winsock.h頭文件和動態(tài)鏈接庫winsock.dll組成,目前有兩個版本:Winsock

6、1.1和Winsock2.0。作為網(wǎng)絡(luò)編程接口,Winsock屏蔽了網(wǎng)絡(luò)底層的復(fù)雜的協(xié)議和數(shù)據(jù)結(jié)構(gòu),使得編程人員對網(wǎng)絡(luò)的操作變得非常簡單,因此,在Win32平臺上,訪問眾多的基層網(wǎng)絡(luò)協(xié)議,Winsock是首選接口。開發(fā)平臺我選用了VC6.0,因為一直以來都使用VC6進(jìn)行學(xué)習(xí),對這個IDE最為熟悉,再者VC同樣是由微軟開發(fā)的系統(tǒng),與其操作系統(tǒng),網(wǎng)絡(luò)接口具有最為密切的契合優(yōu)點(diǎn),所以選擇了VC6.0。</p><p>

7、  2.2 設(shè)計思想、設(shè)計框圖及數(shù)據(jù)庫表結(jié)構(gòu)</p><p> ?。?)系統(tǒng)總體設(shè)計思想:通常的通信工具,都采用客戶機(jī)/服務(wù)器(C/S)體系結(jié)構(gòu),C/S結(jié)構(gòu)是這樣的一種結(jié)構(gòu):它包括一個客戶機(jī)(或前端),一個服務(wù)器(或稱后端),客戶機(jī)的作用是訪問和處理遠(yuǎn)程服務(wù)器上的數(shù)據(jù),服務(wù)器的作用是接收和處理客戶機(jī)的數(shù)據(jù)請求。有時,可能有多個客戶向同一個服務(wù)器同時請求服務(wù),這就需要服務(wù)器決定怎樣處理這些請求。Client/Ser

8、ver結(jié)構(gòu)是當(dāng)前數(shù)據(jù)庫應(yīng)用程序中極為流行的一種方式。尤其是網(wǎng)絡(luò)技術(shù)的發(fā)展,使得當(dāng)前很多系統(tǒng)都采用這種方式進(jìn)行構(gòu)造,其最大的優(yōu)點(diǎn)是將計算機(jī)工作任務(wù)分別由客戶端和服務(wù)器端來共同完成,這樣有利于充分合理的利用系統(tǒng)資源。另外它的服務(wù)器端還可以將信息集中起來,任何客戶機(jī)都可以通過訪問服務(wù)器而獲得所需的信息。Client/Server模型最終可歸結(jié)為一種“請求/應(yīng)答”關(guān)系。一個請求總是首先被客戶發(fā)出,然后服務(wù)器總是被動地接收請求,返回客戶需要的結(jié)果

9、。在客戶發(fā)出一個請求之前,服務(wù)進(jìn)程一直處于休眠狀態(tài)。一個客戶提出請求后,服務(wù)進(jìn)程被“喚醒”并且為客戶提供服務(wù),對客戶的請求做出所需要的應(yīng)答。在客戶端啟動后,客戶端計算得到本地網(wǎng)絡(luò)的廣播地址,進(jìn)行廣播查找服務(wù)器端</p><p><b> ?。?)設(shè)計框圖</b></p><p>  圖(1)設(shè)計思路框圖</p><p>  (3)數(shù)據(jù)庫表結(jié)構(gòu)及

10、表間關(guān)系</p><p>  圖(2)數(shù)據(jù)庫表結(jié)構(gòu)及表間關(guān)系</p><p>  第三章 各模塊功能及主要模塊的流程圖</p><p>  3.1 各模塊功能簡介</p><p>  1.Connect():int connect ( SOCKET s, const struct sockaddr FAR* name, int namelen

11、);</p><p><b>  【使用說明】</b></p><p>  與通信對象建立連接,主要用在客戶端。其中s、name和namelen的含義與使用方法和bind()相同。如果連接失敗,該函數(shù)會返回SOCKET_ERROR。</p><p>  2.listen():int listen (SOCKET s,int backlog);&

12、lt;/p><p><b>  【使用說明】</b></p><p>  對于服務(wù)器端程序,當(dāng)申請到Socket,并指定通信對象為INADDR_ANY之后,就應(yīng)該等待一個客戶端程序的連接。當(dāng)沒有連接請求時,就進(jìn)入等待狀態(tài),直至有一個請求到達(dá)為止。其中:</p><p>  s<輸入>:是socket()創(chuàng)建的socket。</p&

13、gt;<p>  backlog<輸入>:等待連接的隊列長度,可取1~5。如果當(dāng)某個客戶程序要求連接之時,服務(wù)器已與其他客戶程序連接,則后來的連接請求會被放在隊列中,等待服務(wù)器空閑的時候再與之連接。當(dāng)隊列達(dá)到指定長度(backlog的值)時,再來的連接請求都將被拒絕。</p><p>  3.a(chǎn)ccept():SOCKET accept (SOCKET s,struct sockaddr

14、 FAR* addr,int FAR* addrlen);</p><p><b>  【使用說明】</b></p><p>  對與服務(wù)器端程序,在接收到一個連接請求之后,要為這個連接建立一個新的socket,這個任務(wù)由accept()函數(shù)來完成,并把它作為返回值。新建的Socket與原來的Socket有相同的特性,包括端口號。原來的Socket用于繼續(xù)等待其他的連

15、接請求,而新生成的Socket才是與客戶端進(jìn)行通信的實(shí)際Socket。一般將參數(shù)中的SOCKET稱做“監(jiān)聽”Socket,它只負(fù)責(zé)接受連接,不負(fù)責(zé)通話;而accept 返回的SOCKET則稱為“會話”Socket,它只負(fù)責(zé)與客戶端通話。參數(shù)中的指針addr和addrlen用來返回客戶機(jī)的sockaddr_in結(jié)構(gòu)體,通過addr可得到客戶機(jī)的IP地址和連接端口。使用方法則與bind()中的name和namelen相同。<

16、/p><p>  4.recv()/send():</p><p>  建立連接后,用來接收和發(fā)送數(shù)據(jù)。其中:</p><p>  s<輸入>:是連接用的socket。</p><p>  buf、len和flags的含義與作用方法與recvfrom()/connect()中的相同,分別表示接收和發(fā)送的數(shù)據(jù)包字符串的地址、長度和標(biāo)志。

17、</p><p>  3.2 主要流程圖(四號宋體加粗)</p><p>  圖(3)分別為服務(wù)器端和客戶端流程圖</p><p>  第四章 軟件調(diào)試分析</p><p>  圖(4)服務(wù)器端顯示界面</p><p>  圖(5)客戶端顯示界面</p><p>  圖(6)幾個同學(xué)聊天記錄客戶

18、端顯示</p><p>  圖(7)聊天時的服務(wù)器端</p><p><b>  第五章 結(jié)語</b></p><p>  5.1 結(jié)論與討論:用C語言編寫Windows應(yīng)用程序有兩種方式:一種是Windows C編程方式,另一種是Visual C++編程方式。在一般情況下,Visual C++編程方式編寫的程序源代碼量小、開發(fā)時的工作量小、工

19、作難度也較小,但編譯后的代碼量較大,運(yùn)行速度略低;而Windows C編程方式編寫的程序源代碼量雖然較大,但可執(zhí)行代碼效率高。隨著技術(shù)的進(jìn)步,Visual C++編程方式已被廣泛采用,但象網(wǎng)絡(luò)編程等一些對速度要求高、對硬件操作較多的程序,大多數(shù)還是用Windows C編程方式開發(fā)的。</p><p>  在上面的程序中,大家注意到,客戶端程序,我并沒有把要發(fā)送的信息直接顯示在ID編輯框中,而是在發(fā)送后,由服務(wù)器端

20、再發(fā)給各個進(jìn)入聊天室的客戶,客戶端程序連接完成,就開始接收服務(wù)器發(fā)送的信息,這樣的客戶端程序,事實(shí)上就是一個簡單的端口掃描程序,有興趣的讀者可以試試連接不同IP地址機(jī)器的不同端口,就可以根據(jù)返回的的信息,判斷這臺機(jī)器都開啟了哪些網(wǎng)絡(luò)服務(wù)程序了。通過聊天室程序的編寫,可以基本了解Windows Sockets API編程的基本過程和精要之處。本程序在VC++6.0下編譯通過,在使用windows 98/2000/XP/NT的局域網(wǎng)里運(yùn)行良

21、好。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1]侯俊杰.深入淺出MFC[M].華中科技大學(xué)出版社.2001</p><p>  [2]孫鑫.VC++深入詳解[M].電子工業(yè)出版社. ISBN 7-121-02530-2</p><p>  [3]黃強(qiáng).WINDOWS網(wǎng)絡(luò)編程[M].人民郵電出

22、版社. ISBN 978-7-115-10961-3</p><p><b>  附錄</b></p><p>  // ChatRoomDlg.cpp : implementation file</p><p><b>  //</b></p><p>  #include "stdaf

23、x.h"</p><p>  #include "ChatRoom.h"</p><p>  #include "ChatRoomDlg.h"</p><p>  #ifdef _DEBUG</p><p>  #define new DEBUG_NEW</p><p>

24、;  #undef THIS_FILE</p><p>  static char THIS_FILE[] = __FILE__;</p><p><b>  #endif</b></p><p>  ////////////////////////////////////////////////////////////////////////

25、/////</p><p>  // CAboutDlg dialog used for App About</p><p>  class CAboutDlg : public CDialog</p><p><b>  {</b></p><p><b>  public:</b></p&

26、gt;<p>  CAboutDlg();</p><p>  // Dialog Data</p><p>  //{{AFX_DATA(CAboutDlg)</p><p>  enum { IDD = IDD_ABOUTBOX };</p><p>  //}}AFX_DATA</p><p>  

27、// ClassWizard generated virtual function overrides</p><p>  //{{AFX_VIRTUAL(CAboutDlg)</p><p>  protected:</p><p>  virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV s

28、upport</p><p>  //}}AFX_VIRTUAL</p><p>  // Implementation</p><p>  protected:</p><p>  //{{AFX_MSG(CAboutDlg)</p><p>  //}}AFX_MSG</p><p>  D

29、ECLARE_MESSAGE_MAP()</p><p><b>  };</b></p><p>  CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)</p><p><b>  {</b></p><p>  //{{AFX_DATA_INIT(C

30、AboutDlg)</p><p>  //}}AFX_DATA_INIT</p><p><b>  }</b></p><p>  void CAboutDlg::DoDataExchange(CDataExchange* pDX)</p><p><b>  {</b></p>

31、<p>  CDialog::DoDataExchange(pDX);</p><p>  //{{AFX_DATA_MAP(CAboutDlg)</p><p>  //}}AFX_DATA_MAP</p><p><b>  }</b></p><p>  BEGIN_MESSAGE_MAP(CAboutD

32、lg, CDialog)</p><p>  //{{AFX_MSG_MAP(CAboutDlg)</p><p>  // No message handlers</p><p>  //}}AFX_MSG_MAP</p><p>  END_MESSAGE_MAP()</p><p>  /////////////

33、////////////////////////////////////////////////////////////////</p><p>  // CChatRoomDlg dialog</p><p>  CChatRoomDlg::CChatRoomDlg(CClientSocket *tmp,CWnd* pParent /*=NULL*/)</p><p&

34、gt;  : CDialog(CChatRoomDlg::IDD, pParent)</p><p><b>  {</b></p><p>  //{{AFX_DATA_INIT(CChatRoomDlg)</p><p>  m_IDC_EDIT_MESSAGE = _T("");</p><p>

35、;  m_IDC_EDIT_ADDRESS = _T("127.0.0.1");</p><p>  m_IDC_EDIT_NIKENAME = _T("");</p><p>  m_SL = FALSE;</p><p>  //}}AFX_DATA_INIT</p><p>  // Note t

36、hat LoadIcon does not require a subsequent DestroyIcon in Win32</p><p>  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);</p><p>  myServerSocket=tmp;</p><p><b>  }</b>

37、;</p><p>  void CChatRoomDlg::DoDataExchange(CDataExchange* pDX)</p><p><b>  {</b></p><p>  CDialog::DoDataExchange(pDX);</p><p>  //{{AFX_DATA_MAP(CChatRoo

38、mDlg)</p><p>  DDX_Control(pDX, Exit_BUTTON, m_BNExit);</p><p>  DDX_Control(pDX, Send_BUTTON, m_BNSend);</p><p>  DDX_Control(pDX, IDC_LIST1, m_IDC_LIST_CHATBOX_CONTROL);</p>

39、<p>  DDX_Control(pDX, IDC_LIST3, m_USER);</p><p>  DDX_Text(pDX, IDC_EDIT1, m_IDC_EDIT_MESSAGE);</p><p>  DDX_Text(pDX, IDC_EDIT3, m_IDC_EDIT_ADDRESS);</p><p>  DDX_Text(pDX

40、, IDC_EDIT2, m_IDC_EDIT_NIKENAME);</p><p>  DDX_Check(pDX, IDC_CHECK1, m_SL);</p><p>  //}}AFX_DATA_MAP</p><p><b>  }</b></p><p>  BEGIN_MESSAGE_MAP(CChatRo

41、omDlg, CDialog)</p><p>  //{{AFX_MSG_MAP(CChatRoomDlg)</p><p>  ON_WM_SYSCOMMAND()</p><p>  ON_WM_PAINT()</p><p>  ON_WM_QUERYDRAGICON()</p><p>  ON_BN_CLI

42、CKED(Exit_BUTTON, OnButton2)</p><p>  ON_BN_CLICKED(Send_BUTTON, OnButton1)</p><p>  ON_BN_CLICKED(Connect_BUTTON, OnConnectButton)</p><p>  //}}AFX_MSG_MAP</p><p>  EN

43、D_MESSAGE_MAP()</p><p>  /////////////////////////////////////////////////////////////////////////////</p><p>  // CChatRoomDlg message handlers</p><p>  BOOL CChatRoomDlg::OnInitDi

44、alog()</p><p><b>  {</b></p><p>  CDialog::OnInitDialog();</p><p>  // Add "About..." menu item to system menu.</p><p>  // IDM_ABOUTBOX must be i

45、n the system command range.</p><p>  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);</p><p>  ASSERT(IDM_ABOUTBOX < 0xF000);</p><p>  CMenu* pSysMenu = GetSystemMenu(FALSE);

46、</p><p>  if (pSysMenu != NULL)</p><p><b>  {</b></p><p>  CString strAboutMenu;</p><p>  strAboutMenu.LoadString(IDS_ABOUTBOX);</p><p>  if (!

47、strAboutMenu.IsEmpty())</p><p><b>  {</b></p><p>  pSysMenu->AppendMenu(MF_SEPARATOR);</p><p>  pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);</p&

48、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  // Set the icon for this dialog. The framework does this automatically</p><p>  // when the application

49、's main window is not a dialog</p><p>  SetIcon(m_hIcon, TRUE);// Set big icon</p><p>  SetIcon(m_hIcon, FALSE);// Set small icon</p><p>  // TODO: Add extra initialization

50、 here</p><p>  //m_STATIC_NIKENAME.SetWindowText(myServerSocket->NikeName);</p><p>  //*********************發(fā)送昵稱</p><p>  /*char message2[20];</p><p>  strcpy(mess

51、age2,"NEW_USER:");</p><p>  strcat(message2,myServerSocket->NikeName);</p><p>  if (myServerSocket->Send(message2,20))</p><p><b>  {</b></p><

52、;p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  AfxMessageBox("網(wǎng)絡(luò)傳輸錯誤!!!");</p><p><b>  }</b>

53、</p><p><b>  */</b></p><p><b>  //xmj</b></p><p>  m_BNSend.EnableWindow(FALSE); //"發(fā)送信息"按鈕狀態(tài)為無效</p><p>  m_BNExit.EnableWindow(FALSE)

54、; //"離開聊天室"按鈕狀態(tài)為無效</p><p>  return TRUE; // return TRUE unless you set the focus to a control</p><p><b>  }</b></p><p>  void CChatRoomDlg::OnSysCommand(UINT

55、 nID, LPARAM lParam)</p><p><b>  {</b></p><p>  if ((nID & 0xFFF0) == IDM_ABOUTBOX)</p><p><b>  {</b></p><p>  CAboutDlg dlgAbout;</p>

56、<p>  dlgAbout.DoModal();</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  CDialog::OnSysCommand(nID, lParam

57、);</p><p><b>  }</b></p><p><b>  }</b></p><p>  // If you add a minimize button to your dialog, you will need the code below</p><p>  // to dra

58、w the icon. For MFC applications using the document/view model,</p><p>  // this is automatically done for you by the framework.</p><p>  void CChatRoomDlg::OnPaint() </p><p><

59、b>  {</b></p><p>  if (IsIconic())</p><p><b>  {</b></p><p>  CPaintDC dc(this); // device context for painting</p><p>  SendMessage(WM_ICONERASEBK

60、GND, (WPARAM) dc.GetSafeHdc(), 0);</p><p>  // Center icon in client rectangle</p><p>  int cxIcon = GetSystemMetrics(SM_CXICON);</p><p>  int cyIcon = GetSystemMetrics(SM_CYICON);&

61、lt;/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>

62、<p>  // Draw the icon</p><p>  dc.DrawIcon(x, y, m_hIcon);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p>

63、<p>  CDialog::OnPaint();</p><p><b>  }</b></p><p><b>  }</b></p><p>  // The system calls this to obtain the cursor to display while the user drags<

64、;/p><p>  // the minimized window.</p><p>  HCURSOR CChatRoomDlg::OnQueryDragIcon()</p><p><b>  {</b></p><p>  return (HCURSOR) m_hIcon;</p><p>&

65、lt;b>  }</b></p><p>  void CChatRoomDlg::OnButton1() //發(fā)送按鈕的函數(shù)</p><p><b>  {</b></p><p>  // TODO: Add your control notification handler code here</p>&l

66、t;p><b>  int n;</b></p><p>  char message[1000];</p><p>  CString to_name;</p><p>  UpdateData(TRUE);</p><p>  if(m_SL==TRUE) //私聊</p><p>&l

67、t;b>  {</b></p><p>  if(m_USER.GetCurSel()>=0)</p><p><b>  {</b></p><p>  m_USER.GetText(m_USER.GetCurSel(),to_name);</p><p>  m_IDC_EDIT_MESSAG

68、E=myServerSocket->NikeName+"悄悄對"+to_name+"說"+m_IDC_EDIT_MESSAGE;</p><p>  m_IDC_LIST_CHATBOX_CONTROL.AddString(m_IDC_EDIT_MESSAGE);</p><p>  m_IDC_EDIT_MESSAGE="PrivC

69、hat|"+to_name+"|"+m_IDC_EDIT_MESSAGE;</p><p>  n=m_IDC_EDIT_MESSAGE.GetLength();</p><p>  sprintf(message,"%s",m_IDC_EDIT_MESSAGE.GetBuffer(n));</p><p>  me

70、ssage[n]=0; </p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  AfxMessageBox("沒有選擇私聊對象!");</p>&l

71、t;p><b>  return ;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p>

72、;<p>  m_IDC_EDIT_MESSAGE=myServerSocket->NikeName+"對大家說: "+m_IDC_EDIT_MESSAGE;</p><p>  n=m_IDC_EDIT_MESSAGE.GetLength();</p><p>  sprintf(message,"%s",m_IDC_EDIT_

73、MESSAGE.GetBuffer(n));</p><p>  message[n]=0;</p><p><b>  }</b></p><p>  if (myServerSocket->Send(message,n+1))</p><p><b>  {</b></p>

74、<p>  m_IDC_EDIT_MESSAGE="";</p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b><

75、/p><p>  AfxMessageBox("網(wǎng)絡(luò)傳輸錯誤!");</p><p><b>  }</b></p><p><b>  }</b></p><p>  void CChatRoomDlg::OnButton2() //離開按鈕的函數(shù)</p><p

76、><b>  {</b></p><p>  // TODO: Add your control notification handler code here</p><p><b>  //發(fā)送斷開信息</b></p><p>  char message2[20];</p><p>  s

77、trcpy(message2,"CLOSEUSE:");</p><p>  strcat(message2,myServerSocket->NikeName);</p><p>  if (myServerSocket->Send(message2,20))</p><p><b>  {</b></

78、p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  AfxMessageBox("網(wǎng)絡(luò)傳輸錯誤!!!");</p><p><b>  }

79、</b></p><p>  myServerSocket->Close();</p><p>  CDialog::OnOK();</p><p><b>  }</b></p><p>  BOOL CChatRoomDlg::GetMessage()//顯示聊天信息</p><

80、p><b>  {</b></p><p>  char buff[2000];</p><p>  char name[20];</p><p>  int count;</p><p>  count=myServerSocket->Receive(buff,2000); </p>&

81、lt;p>  buff[count]=0;</p><p>  char Flag[10];</p><p>  for(int i=0;i<8;i++) Flag[i]=buff[i];</p><p>  Flag[8]=0; </p><p>  if(strcmp(Flag,"USERLIST")

82、==0)//新用戶昵稱列表</p><p><b>  {</b></p><p>  m_USER.ResetContent();</p><p>  CString sTemp;</p><p><b>  int j=8;</b></p><p>  for(i=8;b

83、uff[i]!=0;i++)</p><p><b>  { </b></p><p>  if(buff[i]=='|')//昵稱分割符號</p><p><b>  {</b></p><p>  for(int m=0;j<i;j++,m++)</p>

84、;<p>  name[m]=buff[j];</p><p>  name[m]='\0';</p><p>  sTemp.Format("%s",name);//昵稱</p><p>  m_USER.AddString(sTemp);</p><p><b>  j=i+1;

85、</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else //聊天信息</p><p><b>  {</b><

86、/p><p>  m_IDC_LIST_CHATBOX_CONTROL.AddString(buff);</p><p><b>  }</b></p><p>  return true;</p><p><b>  } </b></p><p>  void CChatRo

87、omDlg::OnConnectButton() </p><p><b>  {</b></p><p>  // TODO: Add your control notification handler code here</p><p>  UpdateData(TRUE);</p><p>  char *nike

88、name,*address;</p><p><b>  int n;</b></p><p>  if (!myServerSocket->Create())</p><p><b>  {</b></p><p>  myServerSocket->Close();</p>

89、;<p>  AfxMessageBox("網(wǎng)絡(luò)創(chuàng)建錯誤!!");</p><p><b>  return;</b></p><p><b>  }</b></p><p>  n=m_IDC_EDIT_ADDRESS.GetLength();</p><p> 

90、 address=new char(n+1);</p><p>  sprintf(address,"%s",m_IDC_EDIT_ADDRESS.GetBuffer(n));</p><p>  address[n]=0;</p><p>  n=m_IDC_EDIT_NIKENAME.GetLength();</p><p

91、>  nikename=new char(n+1);</p><p>  sprintf(nikename,"%s",m_IDC_EDIT_NIKENAME.GetBuffer(n));</p><p>  nikename[n]=0;</p><p>  if (!myServerSocket->Connect(address,67

92、67))</p><p><b>  {</b></p><p>  myServerSocket->Close();</p><p>  AfxMessageBox("網(wǎng)絡(luò)連接錯誤,請檢查服務(wù)器地址。");</p><p><b>  return;</b></p&

93、gt;<p><b>  }</b></p><p>  m_BNSend.EnableWindow(TRUE); //"發(fā)送信息"按鈕狀態(tài)為有效</p><p>  m_BNExit.EnableWindow(TRUE); //"離開聊天室"按鈕狀態(tài)為有效</p><p>  myServ

94、erSocket->NikeName=nikename;</p><p>  //************發(fā)送新用戶昵稱 </p><p>  char message2[20];</p><p>  strcpy(message2,"NEW_USER:");</p><p>  strcat(message2,my

95、ServerSocket->NikeName);</p><p>  if (myServerSocket->Send(message2,20))</p><p><b>  {</b></p><p><b>  }</b></p><p><b>  else</

96、b></p><p><b>  {</b></p><p>  AfxMessageBox("網(wǎng)絡(luò)傳輸錯誤!!!");</p><p><b>  }</b></p><p><b>  }</b></p><p>  //

97、ChatRoomServer.cpp : Defines the class behaviors for the application.</p><p><b>  //</b></p><p>  #include "stdafx.h"</p><p>  #include "ChatRoomServer.h&

98、quot;</p><p>  #include "ChatRoomServerDlg.h"</p><p>  #ifdef _DEBUG</p><p>  #define new DEBUG_NEW</p><p>  #undef THIS_FILE</p><p>  static cha

99、r THIS_FILE[] = __FILE__;</p><p><b>  #endif</b></p><p>  /////////////////////////////////////////////////////////////////////////////</p><p>  // CChatRoomServerApp<

100、;/p><p>  CClientSocket curSocket; //全局CClientSocket</p><p>  BEGIN_MESSAGE_MAP(CChatRoomServerApp, CWinApp)</p><p>  //{{AFX_MSG_MAP(CChatRoomServerApp)</p><p>  // NOTE

101、- the ClassWizard will add and remove mapping macros here.</p><p>  // DO NOT EDIT what you see in these blocks of generated code!</p><p>  //}}AFX_MSG</p><p>  ON_COMMAND(ID_HEL

102、P, CWinApp::OnHelp)</p><p>  END_MESSAGE_MAP()</p><p>  /////////////////////////////////////////////////////////////////////////////</p><p>  // CChatRoomServerApp construction<

103、/p><p>  CChatRoomServerApp::CChatRoomServerApp()</p><p><b>  {</b></p><p>  // TODO: add construction code here,</p><p>  // Place all significant initializat

104、ion in InitInstance</p><p><b>  }</b></p><p>  /////////////////////////////////////////////////////////////////////////////</p><p>  // The one and only CChatRoomServer

105、App object</p><p>  CChatRoomServerApp theApp;</p><p>  /////////////////////////////////////////////////////////////////////////////</p><p>  // CChatRoomServerApp initialization&l

106、t;/p><p>  BOOL CChatRoomServerApp::InitInstance()</p><p><b>  {</b></p><p>  if (!AfxSocketInit())</p><p><b>  {</b></p><p>  AfxMess

107、ageBox(IDP_SOCKETS_INIT_FAILED);</p><p>  return FALSE;</p><p><b>  }</b></p><p>  AfxEnableControlContainer();</p><p>  // Standard initialization</p>

108、;<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><p>  // the specific initializat

109、ion routines you do not need.</p><p>  #ifdef _AFXDLL</p><p>  Enable3dControls();// Call this when using MFC in a shared DLL</p><p><b>  #else</b></p><p&g

110、t;  Enable3dControlsStatic();// Call this when linking to MFC statically</p><p><b>  #endif</b></p><p>  CChatRoomServerDlg dlg;</p><p>  m_pMainWnd = &dlg;</p&g

111、t;<p>  curSocket.SetDlg(&dlg); //調(diào)用SetDlg()</p><p>  int nResponse = dlg.DoModal();</p><p>  if (nResponse == IDOK)</p><p><b>  {</b></p><p>  

112、// 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><b

113、>  {</b></p><p>  // TODO: Place code here to handle when the dialog is</p><p>  // dismissed with Cancel</p><p><b>  }</b></p><p>  // Since the

114、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>  }&l

115、t;/b></p><p><b>  致謝</b></p><p>  首先要感謝*老師,是她在整個課程設(shè)計過程中給我提供了設(shè)計所需要的資料,幫助解答設(shè)計中遇到的問題。其次要感謝學(xué)校實(shí)驗室,為我準(zhǔn)備好了設(shè)計的學(xué)習(xí)環(huán)境,再次是要感謝和我一起做課程設(shè)計的同學(xué)們,正是有了他們,我們才在遇到問題時,相互鼓勵,最終解決了問題,圓滿地完成了課程設(shè)計的各項工作。</p

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論