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

下載本文檔

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

文檔簡介

1、<p><b>  畢業(yè)設(shè)計(jì)</b></p><p>  題目 用VC++設(shè)計(jì)簡單的聊天室程序 </p><p>  專 業(yè) </p><p>  學(xué) 號 </p><p>  姓

2、 名 </p><p>  指 導(dǎo) 教 師 </p><p><b>  摘 要</b></p><p>  計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)發(fā)展至今已經(jīng)大大

3、超越了人們當(dāng)初的預(yù)想,無論是人們?nèi)粘5墓ぷ鬟€是學(xué)習(xí),我們都越來越多的依靠到互聯(lián)網(wǎng)。各種實(shí)時(shí)性的聊天娛樂軟件也同時(shí)誕生,而且為我們的即時(shí)通訊帶來了眾多的方便,比如說大家所熟知的騰訊QQ、微軟的MSN、移動的Fetion等,都是做的比較成功的實(shí)時(shí)聊天工具。隨著網(wǎng)絡(luò)的日益普及,各種聊天工具也層出不窮,但當(dāng)我們學(xué)習(xí)了《TCP/IP協(xié)議與網(wǎng)絡(luò)編程》這門課程之后,我們便會覺得,其實(shí)要實(shí)現(xiàn)簡單的網(wǎng)絡(luò)通訊其實(shí)并不難。接下來的課程設(shè)計(jì)就是針對一個簡單的網(wǎng)

4、絡(luò)聊天程序,利用MFC為開發(fā)工具,實(shí)現(xiàn)基本的通訊功能。在課程設(shè)計(jì)中,系統(tǒng)開發(fā)平臺為Windows 2000,程序設(shè)計(jì)設(shè)計(jì)語言采用Visual C++,數(shù)據(jù)庫采用MS SQL 2000,程序運(yùn)行平臺為Windows 98/2000/XP。</p><p>  關(guān)鍵詞: VC6.0聊天室,小型聊天工具,Visual聊天 </p><p><b>  1 引 言</b>

5、</p><p>  1.1課題背景及意義</p><p>  當(dāng)今社會正處于信息時(shí)代,計(jì)算機(jī)和通信網(wǎng)絡(luò)是這一時(shí)代所謂“信息基礎(chǔ)設(shè)施”。在互聯(lián)網(wǎng)相當(dāng)普及的今天,在互聯(lián)網(wǎng)上聊天對很多“網(wǎng)蟲”來說已經(jīng)是家常便飯了。聊天室程序可以說是網(wǎng)上最簡單的多點(diǎn)通信程序。一個簡單的聊天室, 從程序員的觀點(diǎn)來看就是在多個I/O端點(diǎn)之間實(shí)現(xiàn)多對多的通信?;赟OCKET的局域網(wǎng)通信是一種靈活的、易于實(shí)現(xiàn)的、低成

6、本的方法。它可以運(yùn)行在各種使用TCP/IP協(xié)議作為通訊協(xié)議的網(wǎng)絡(luò)上。而在SOCKET API的幫助下,開發(fā)基于SOCKET的局域網(wǎng)通信軟件也是易于實(shí)現(xiàn)的。</p><p><b>  1.2 實(shí)驗(yàn)</b></p><p>  Visual C++(簡稱VC)是Microsoft公司推出的目前使用極為廣泛的基于Windows平臺的C++可視化開發(fā)環(huán)境。VC基于C,C++

7、語言,主要由是MFC組成,是與系統(tǒng)聯(lián)系非常緊密的編程工具,它兼有高級,和低級語言的雙重性,功能強(qiáng)大,靈活,執(zhí)行效率高,幾乎可說VC在 Windows平臺無所不能。VC主要是針對Windows系統(tǒng),適合一些系統(tǒng)級 的開發(fā),可以方便實(shí)現(xiàn)一些底層 的調(diào)用。在VC里邊嵌入?yún)R編語言很簡單。當(dāng)對系統(tǒng)性能要求很高的時(shí)候,可用VC開發(fā)。VC在多線程、網(wǎng)絡(luò)通信、分布應(yīng)用方面,有著不可比擬的優(yōu)勢。</p><p&g

8、t;<b>  1.3 可行性分析</b></p><p>  本課程設(shè)計(jì)主要解決在客戶端于客戶端的信息交換和客戶端于服務(wù)器的信息交換及服務(wù)器的信息處理上的管理的課程設(shè)計(jì)。</p><p>  此程序主要分為兩部分:服務(wù)器端和客戶端。服務(wù)器端用于提供一個網(wǎng)絡(luò)端口,等待客戶端發(fā)出請求,登錄到此服務(wù)端,然后進(jìn)行網(wǎng)絡(luò)通訊和消息的轉(zhuǎn)發(fā);客戶端可通過服務(wù)器端的IP地址發(fā)送連接請

9、求,然后登陸聊天室。在服務(wù)器端的成員列表欄中會顯示在線的所有人名單,有人退出聊天室,成員列表會自動除名。服務(wù)器端同時(shí)也提供了成員之間的私聊功能,此時(shí)服務(wù)器端作為一個轉(zhuǎn)發(fā)站,進(jìn)行消息的轉(zhuǎn)發(fā)。整個程序的主體使用了CSocket類的方法,實(shí)現(xiàn)了網(wǎng)絡(luò)通訊聊天。</p><p>  先啟動服務(wù)器端聊天程序,這是聊天服務(wù)器需要指定一個端口號,客戶端則根據(jù)這個端口號以及服務(wù)器的網(wǎng)絡(luò)地址與服務(wù)器進(jìn)行通信。在這里,把端口號成為“聊

10、天頻道” 。</p><p>  在后面的程序代碼分析中將看到,端口號并不等同于聊天頻道,而是在聊天頻道上增加一個固定的偏移值,使得這個聊天頻道不會和系統(tǒng)保留的端口發(fā)生沖突。</p><p>  服務(wù)器啟動后將在這個指定的端口號中等待客戶的連接。對于公共聊天室,服務(wù)器對客戶的數(shù)目不做任何限制。而對于私人聊天室,每個聊天頻道則只能允許兩個客戶互相連接,使得一方發(fā)送的信息只能到達(dá)對方的主機(jī)中。

11、這里的服務(wù)器提供的是公共聊天服務(wù)。</p><p>  通過分析發(fā)現(xiàn),該程序完全可以通過Visual C++中MFC完成。</p><p><b>  2需求分析</b></p><p><b>  2.1 設(shè)計(jì)目的</b></p><p>  綜合運(yùn)用本課程及計(jì)算機(jī)網(wǎng)絡(luò)的相關(guān)知識設(shè)計(jì)并實(shí)現(xiàn)一個網(wǎng)絡(luò)

12、應(yīng)用程序,以Visual C++作為開發(fā)平臺,通過實(shí)踐復(fù)習(xí)鞏固課堂所學(xué)的理論知識,提高對所學(xué)知識的綜合應(yīng)用能力。</p><p><b>  2.2 設(shè)計(jì)要求</b></p><p>  采用客戶/服務(wù)器模式,分為客戶端程序和服務(wù)器端程序。服務(wù)器采用WINSOCK I/O模型中的任一種,支持多個客戶同時(shí)在線聊天??蛻舳顺绦蚝头?wù)器程序通過網(wǎng)絡(luò)交換聊天字符串內(nèi)容,服務(wù)器

13、窗口的列表框中顯示當(dāng)前在線用戶,支持客戶端之間的私聊(可以通過服務(wù)器中轉(zhuǎn),或考慮UDP打洞直接建立端端連接)。</p><p>  課程設(shè)計(jì)要求設(shè)計(jì)并編程完成兩個方面的內(nèi)容:首先建立一個使用TCP協(xié)議的聊天室服務(wù)器,這個服務(wù)器可以同時(shí)支持多個用戶的在線聊天;其次設(shè)計(jì)一個可以和服務(wù)器通信的聊天室客戶端。</p><p><b>  2.3 功能要求</b></p&

14、gt;<p>  支持多個客戶端的連接,在服務(wù)器和多個客戶端之間進(jìn)行數(shù)據(jù)傳輸;</p><p>  接收客戶端發(fā)送的消息,并顯示在一個列表框中;</p><p>  在用戶連接上后有提示,顯示出連接的用戶名字;</p><p>  發(fā)送信息時(shí)可以顯示聊天的所有記錄;</p><p>  2.4 系統(tǒng)主要功能和主要功能描述:<

15、;/p><p>  服務(wù)器端聊天程序必須能夠做3件事情:</p><p>  服務(wù)器聊天程序要在待定的端口上等待來自聊天客戶的連接請求,并且需要維護(hù)一個客戶連接表,以記錄所有成功的連接。</p><p>  服務(wù)器聊天程序要及時(shí)接受從各個聊天客戶發(fā)送過來的信息,然后把這些信息轉(zhuǎn)發(fā)到一個或多個客戶連接。對于公共聊天室,服務(wù)器將把接受到的信息向除源端外的所有客戶發(fā)送過去。&

16、lt;/p><p>  服務(wù)器還要監(jiān)控這些連接的狀態(tài),在客戶主動離開或發(fā)生故障時(shí)從列表中刪除相應(yīng)的表項(xiàng),并及時(shí)更新連接表。</p><p>  這些要求可以通過CSocket類提供的功能實(shí)現(xiàn)。從CSocket派生出兩個類CListenSocket和CClientSocket,它們分別用來偵聽客戶的連接請求和建立與客戶的連接。服務(wù)器只需要一個偵聽套接字CListenSocket,然后根據(jù)客戶的連

17、接請求動態(tài)創(chuàng)建客戶套接字CClientSocket。客戶套接字的數(shù)量是不可預(yù)知的,因此需要一個列表來記錄。MFC的CPtrList類就能實(shí)現(xiàn)這種功能。</p><p>  客戶端聊天程序需要完成以下幾個功能:</p><p>  客戶端聊天程序要負(fù)責(zé)建立和維護(hù)與服務(wù)器的連接,通過獲取用戶的設(shè)置嘗試與服務(wù)器的連接,并且隨時(shí)檢測連接的狀態(tài)。</p><p>  客戶端聊

18、天程序要把用戶輸入的信息及時(shí)發(fā)送到聊天服務(wù)器。一般情況下,當(dāng)用戶輸入一行信息并且按下回車鍵后聊天程序就要把這一行信息發(fā)送出去,才能及時(shí)地滿足用戶的交互需求。</p><p>  要隨時(shí)準(zhǔn)備好接受來自服務(wù)器的信息,隨時(shí)把接受到的信息顯示出來,讓用戶及時(shí)看到對方的響應(yīng)。</p><p>  在用戶退出聊天過程是要關(guān)閉與服務(wù)器的連接。比較好的做法是提前通知服務(wù)器或者直接給服務(wù)器發(fā)送一條退出通知,

19、使得服務(wù)器能夠及時(shí)掌握客戶端的連接狀態(tài),把對方客戶的退出信息及時(shí)發(fā)送到對等實(shí)體上。</p><p>  客戶端聊天程序需要使用一個通過CSocket類派生出來的CChatSocket類來實(shí)現(xiàn)。該套接字用來發(fā)送一個與服務(wù)器的連接請求和維持與服務(wù)器的連接,發(fā)送和接收聊天信息,完成上述各項(xiàng)功能。</p><p><b>  3設(shè)計(jì)流程圖</b></p><

20、;p>  根據(jù)對用戶的要求及功能設(shè)置可以得到以下的流程圖3.1,用戶首先啟動客戶端,登陸服務(wù)器并向服務(wù)器發(fā)送信息,啟動服務(wù)器,服務(wù)器等待客戶要求并向客戶反饋在線用戶信息,用戶向服務(wù)器發(fā)送信息,服務(wù)器處理用戶的數(shù)據(jù),然后用戶開始聊天??蛻舳说牧奶旆譃閷λ腥说男畔⒑退搅牡男畔?,該信息應(yīng)通過程序控制分別進(jìn)行處理。</p><p>  圖3.1 設(shè)計(jì)流程圖</p><p>  4 調(diào)試分析

21、過程描述</p><p><b>  1、登陸界面</b></p><p>  圖4.1登陸服務(wù)器界面</p><p><b>  2、服務(wù)器界面</b></p><p>  圖4.2 啟動服務(wù)器界面</p><p>  3、客戶端的連接界面。</p><

22、p>  圖4.3 登陸客戶端界面</p><p><b>  4、創(chuàng)建用戶界面</b></p><p>  圖4.4 輸入名稱張三</p><p>  5、用戶連接服務(wù)器界面 </p><p>  圖4.5 張三登陸服務(wù)器</p><p>  6、為用戶的連接界面,在李四連接后,張三和李四用

23、戶同時(shí)出現(xiàn)在用戶列表內(nèi):</p><p>  圖4.6 李四登陸服務(wù)器</p><p>  7、為用戶李四的連接界面,在王五連接后,張三,李四和王五用戶同時(shí)出現(xiàn)在用戶列表內(nèi):</p><p>  圖4.7 王五登陸服務(wù)器</p><p>  服務(wù)器顯示:在張三,李四,王五進(jìn)入聊天室后的界面為圖4.8.:</p><p>

24、;  圖4.8 用戶成功登陸后界面</p><p>  開始聊天,群聊:客戶端發(fā)送信息時(shí)的界面為圖4.9</p><p><b>  圖4.9 聊天界面</b></p><p>  10、為私聊界面。張三與李四私聊:點(diǎn)擊私聊選項(xiàng),并發(fā)送私聊內(nèi)容。</p><p>  圖4.10 張三私聊界面</p><

25、;p>  11、為張三私聊界面,李四和張三私聊,張三能看到李四發(fā)送的內(nèi)容:</p><p>  圖4.11 李四私聊界面</p><p>  12、為王五的界面顯示,王五看不到張三和李四的私聊內(nèi)容:</p><p>  圖4.12 非私聊對象界面</p><p><b>  致謝</b></p>&l

26、t;p>  該次課程設(shè)計(jì)的制作我主要是參照了圖書館內(nèi)的相關(guān)書籍,找到一個類似的程序,然后按照書上的內(nèi)容一步步的做出來了,雖然這個程序算不上是我自己寫出來的,但通過這樣的一個過程,還是讓我學(xué)會了很多東西,也算能比較熟練地掌握MFC這一個軟件了,這算是一個不小的收獲吧,而且,在做這個程序的過程中,讓我認(rèn)識到了在做這樣程序中,遇到解決不了的問題與同學(xué)的討論時(shí)很重要的,譬如可以以運(yùn)行,但是就是無法出現(xiàn)連接的顯示和狀態(tài)。最后與同學(xué)討論后,才

27、知道是服務(wù)器端有了錯誤,沒有設(shè)置自己的IP地址,然后對于客戶端進(jìn)行了一番修改,才終于出現(xiàn)了上述的結(jié)果。雖然沒有徹底做的出來,但是還是比較開心的,因?yàn)樽约褐懒四睦锊蛔?,哪里不可以,可以在以后多多的做練?xí)來充實(shí)自己。</p><p>  在課程設(shè)計(jì)過程中,收獲知識,提高能力的同時(shí),我也學(xué)到了很多人生的哲理,懂得怎么樣去制定計(jì)劃,怎么樣去實(shí)現(xiàn)這個計(jì)劃,并掌握了在執(zhí)行過程中怎么樣去克服心理上的不良情緒。因此在以后的生活

28、和學(xué)習(xí)的過程中,我一定會把課程設(shè)計(jì)的精神帶到生活中,不畏艱難,勇往直前!</p><p>  我以后還是需要多多的練習(xí),多多的勤奮,這樣才有可能讓自己有信心,有動力,讓自己不至于懂的太少而怯場,因?yàn)椴欢粫?,相信自己以后會編寫出讓自己滿意的程序和軟件的。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 任泰明著.

29、TCP/IP協(xié)議與網(wǎng)絡(luò)編程. 西安電子科技大學(xué)出版社. 2004</p><p>  [2] 唐克著. MFC程序設(shè)計(jì):Using Visual C++ 6.0. 北京希望電子出版社. 2002</p><p>  [3] 鄧全良著. Winsock網(wǎng)絡(luò)程序設(shè)計(jì). 中國鐵道出版社. 2002</p><p>  [4]《Visual C++6.0使用與開發(fā)》 清華大

30、學(xué)出版社,木林森、高峰霞、羅麗瓊、奚紅宇編著</p><p>  [5]《Visual c++ 實(shí)用教程(第三版) 鄭阿奇 , 電子工業(yè)出版社</p><p><b>  源代碼</b></p><p><b>  I服務(wù)器:</b></p><p>  // ServerDlg.cpp : imp

31、lementation file</p><p><b>  //</b></p><p>  #include "stdafx.h"</p><p>  #include "Server.h"</p><p>  #include "ServerDlg.h"&

32、lt;/p><p>  #ifdef _DEBUG</p><p>  #define new DEBUG_NEW</p><p>  #undef THIS_FILE</p><p>  static char THIS_FILE[ ] = __FILE__;</p><p><b>  #endif</

33、b></p><p>  /////////////////////////////////////////////////////////////////////////////</p><p>  // CAboutDlg dialog used for App About</p><p>  class CAboutDlg : public CDialo

34、g</p><p><b>  {</b></p><p><b>  public:</b></p><p>  CAboutDlg();</p><p>  protected:</p><p>  DECLARE_MESSAGE_MAP()</p><

35、;p><b>  };</b></p><p>  CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)</p><p><b>  {</b></p><p><b>  }</b></p><p>  void CAbout

36、Dlg::DoDataExchange(CDataExchange* pDX)</p><p><b>  {</b></p><p>  CDialog::DoDataExchange(pDX);</p><p><b>  }</b></p><p>  BEGIN_MESSAGE_MAP(CA

37、boutDlg, CDialog)</p><p>  END_MESSAGE_MAP()</p><p>  /////////////////////////////////////////////////////////////////////////////</p><p>  // CServerDlg dialog</p><p>

38、;  CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)</p><p>  : CDialog(CServerDlg::IDD, pParent)</p><p><b>  {</b></p><p>  m_hIcon = AfxGetApp()->LoadIcon(IDI_ICONAPP

39、);</p><p><b>  }</b></p><p>  void CServerDlg::DoDataExchange(CDataExchange* pDX)</p><p><b>  {</b></p><p>  CDialog::DoDataExchange(pDX);</p

40、><p>  DDX_Control(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(CServerD

41、lg, CDialog)</p><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_

42、BN_CLICKED(IDC_BN_CLOSE, OnBnClose)</p><p>  ON_MESSAGE(WM_RECEIVE, OnReceive)</p><p>  ON_MESSAGE(WM_CLIENTCLOSE, OnClientClose)</p><p>  ON_MESSAGE(WM_ACCEPT, OnAccept)</p>

43、<p>  ON_WM_DESTROY()</p><p>  END_MESSAGE_MAP()</p><p>  // CServerDlg message handlers</p><p>  BOOL CServerDlg::OnInitDialog()</p><p><b>  {</b><

44、;/p><p>  CDialog::OnInitDialog();</p><p>  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);</p><p>  ASSERT(IDM_ABOUTBOX < 0xF000);</p><p>  CMenu* pSysMenu = GetS

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

46、<p>  if (!strAboutMenu.IsEmpty())</p><p><b>  {</b></p><p>  pSysMenu->AppendMenu(MF_SEPARATOR);</p><p>  pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strA

47、boutMenu);</p><p><b>  }</b></p><p><b>  }</b></p><p>  SetIcon(m_hIcon, TRUE); </p><p>  SetIcon(m_hIcon, FALSE); </p><p>  m

48、_iNetPort = 3127;</p><p>  m_Server.Initialize(this);</p><p>  m_bServer = FALSE;</p><p>  GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p>  return TRUE; // r

49、eturn TRUE unless you set the focus to a control</p><p><b>  }</b></p><p>  void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam)</p><p><b>  {</b></p&g

50、t;<p>  if ((nID & 0xFFF0) == IDM_ABOUTBOX)</p><p><b>  {</b></p><p>  CAboutDlg dlgAbout;</p><p>  dlgAbout.DoModal();</p><p><b>  }</b

51、></p><p><b>  else</b></p><p><b>  {</b></p><p>  CDialog::OnSysCommand(nID, lParam);</p><p><b>  }</b></p><p><b

52、>  }</b></p><p>  void CServerDlg::OnPaint() </p><p><b>  {</b></p><p>  if (IsIconic())</p><p><b>  {</b></p><p>  CPaint

53、DC dc(this); // device context for painting</p><p>  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);</p><p>  int cxIcon = GetSystemMetrics(SM_CXICON);</p><p>  int cyI

54、con = GetSystemMetrics(SM_CYICON);</p><p>  CRect rect;</p><p>  GetClientRect(&rect);</p><p>  int x = (rect.Width() - cxIcon + 1) / 2;</p><p>  int y = (rect.Heig

55、ht() - cyIcon + 1) / 2;</p><p>  dc.DrawIcon(x, y, m_hIcon);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><

56、;p>  CDialog::OnPaint();</p><p><b>  }</b></p><p><b>  }</b></p><p>  HCURSOR CServerDlg::OnQueryDragIcon()</p><p><b>  {</b><

57、/p><p>  return (HCURSOR) m_hIcon;</p><p><b>  }</b></p><p>  void CServerDlg::OnBnStart() </p><p><b>  {</b></p><p><b>  // 創(chuàng)建套

58、接字</b></p><p>  m_Server.Create(m_iNetPort);</p><p><b>  // 開始監(jiān)聽</b></p><p>  m_Server.Listen();</p><p><b>  // 顯示</b></p><p>

59、;  CString strInfo;</p><p>  strInfo.LoadString(IDS_CREATE_SERVER);</p><p>  ShowInDisplay(strInfo);</p><p>  m_bServer = TRUE;</p><p>  GetDlgItem(IDC_BN_START)->En

60、ableWindow(FALSE);</p><p>  GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE);</p><p><b>  }</b></p><p>  void CServerDlg::OnBnClose() </p><p><b>  {<

61、;/b></p><p>  CloseServer();</p><p>  GetDlgItem(IDC_BN_START)->EnableWindow(TRUE);</p><p>  GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p><b>  }

62、</b></p><p>  void CServerDlg::OnAccept()</p><p><b>  {</b></p><p><b>  // 創(chuàng)建新客戶</b></p><p>  CMySocket *pNewClient = new CMySocket;</p

63、><p>  pNewClient->Initialize(this);</p><p>  m_Server.Accept(*pNewClient);</p><p><b>  // 放入鏈表中</b></p><p>  m_lsClient.AddTail(pNewClient);</p><

64、;p><b>  }</b></p><p>  void CServerDlg::OnClientClose(WPARAM wParam, LPARAM lParam)</p><p><b>  {</b></p><p>  CMySocket *p_delClient = (CMySocket*)wParam

65、;</p><p><b>  // 關(guān)閉該用戶</b></p><p>  p_delClient->ShutDown();</p><p>  char buffer[BUFFERSIZE];</p><p>  while(p_delClient->Receive(buffer, BUFFERSIZE)

66、>0);</p><p>  p_delClient->Close();</p><p>  // 在用戶鏈表中刪除該用戶</p><p>  POSITION psCur, psList = m_lsClient.GetHeadPosition();</p><p>  CMySocket *p_curClient;</p

67、><p>  while(psList!=NULL)</p><p><b>  {</b></p><p>  psCur = psList;</p><p>  p_curClient = (CMySocket *)m_lsClient.GetNext(psList);</p><p>  if(

68、p_delClient==p_curClient)</p><p><b>  {</b></p><p>  m_lsClient.RemoveAt(psCur);</p><p><b>  break;</b></p><p><b>  }</b></p>

69、<p><b>  }</b></p><p>  // 發(fā)送信息告訴其他用戶該客戶退出</p><p>  CString strMsg;</p><p>  strMsg.LoadString(IDS_CLIENT_CLOSE);</p><p>  NETMESSAGE netMessage(PTC_C

70、LIENT_QUIT, p_delClient->GetName(), _T(""), p_delClient->GetName() + strMsg);</p><p>  SendToAllClient(netMessage);</p><p>  // 界面上清理該用戶信息</p><p>  m_lbUser.DeleteSt

71、ring(m_lbUser.FindString(-1, p_delClient->GetName()));</p><p>  ShowInDisplay(p_delClient->GetName() + strMsg);</p><p><b>  // 刪除該用戶</b></p><p>  delete p_delClien

72、t;</p><p><b>  }</b></p><p>  void CServerDlg::OnReceive(WPARAM wParam, LPARAM lParam)</p><p><b>  {</b></p><p>  CMySocket *p_curClient = (CMyS

73、ocket*)wParam;</p><p>  NETMESSAGE netMessage;</p><p>  p_curClient->Receive((char *)&netMessage, sizeof(netMessage));</p><p>  switch(netMessage.type)</p><p>&l

74、t;b>  {</b></p><p>  case PTC_NEW:// 新客戶加入</p><p>  NewClientAdd(p_curClient, &netMessage);</p><p><b>  break;</b></p><p>  case PTC_SAY:

75、// 普通聊天</p><p>  ShowMessage(netMessage);</p><p><b>  break;</b></p><p><b>  }</b></p><p>  // 把加工過的信息發(fā)送給其他用戶</p><p>  SendToAllCli

76、ent(netMessage);</p><p><b>  }</b></p><p>  void CServerDlg::CloseServer()</p><p><b>  {</b></p><p>  if(!m_bServer) return;</p><p>

77、;  // 向所有客戶發(fā)送服務(wù)端關(guān)閉的信息</p><p>  CString strInfo;</p><p>  strInfo.LoadString(IDS_CLOSESERVER);</p><p>  NETMESSAGE netMessage(PTC_SYSTEM, _T(""), _T(""), strInfo)

78、;</p><p>  SendToAllClient(netMessage);</p><p>  // 服務(wù)端界面顯示關(guān)閉信息</p><p>  ShowInDisplay(strInfo);</p><p><b>  // 關(guān)閉服務(wù)端</b></p><p>  m_Server.Clo

79、se();</p><p><b>  // 關(guān)閉客戶端</b></p><p>  char buffer[BUFFERSIZE];</p><p>  CMySocket *m_pClient;</p><p>  POSITION psList = m_lsClient.GetHeadPosition();<

80、/p><p>  while(psList!=NULL)</p><p><b>  {</b></p><p>  m_pClient = (CMySocket *)m_lsClient.GetNext(psList);</p><p>  m_pClient->ShutDown();</p><

81、p>  while(m_pClient->Receive(buffer, BUFFERSIZE)>0);</p><p>  m_pClient->Close();</p><p>  delete m_pClient;</p><p><b>  }</b></p><p>  m_lsClie

82、nt.RemoveAll();</p><p>  m_bServer = FALSE;</p><p><b>  }</b></p><p>  // 向所有戶發(fā)出信息</p><p>  void CServerDlg::SendToAllClient(const NETMESSAGE &netMessag

83、e)</p><p><b>  {</b></p><p>  CMySocket *m_pClient;</p><p>  POSITION psList = m_lsClient.GetHeadPosition();</p><p>  while(psList!=NULL)</p><p&g

84、t;<b>  {</b></p><p>  m_pClient = (CMySocket *)m_lsClient.GetNext(psList);</p><p>  m_pClient->SendMsg(netMessage);</p><p><b>  }</b></p><p>

85、<b>  }</b></p><p>  void CServerDlg::ShowInDisplay(CString str)</p><p><b>  {</b></p><p>  m_strDisplay += str + "\r\n";</p><p>  Upda

86、teData(false);</p><p><b>  }</b></p><p>  void CServerDlg::OnDestroy() </p><p><b>  {</b></p><p>  CDialog::OnDestroy();</p><p>  /

87、/ TODO: Add your message handler code here</p><p><b>  }</b></p><p><b>  // 新用戶加入 </b></p><p>  void CServerDlg::NewClientAdd(CMySocket *p_client, NETMESSAGE

88、 *netMessage)</p><p><b>  {</b></p><p><b>  // 存入用戶名字</b></p><p>  p_client->SetName(netMessage->form);</p><p>  // 在列表框中顯示該用戶</p>

89、<p>  m_lbUser.AddString(p_client->GetName());</p><p>  // 發(fā)送用戶列表給該客戶</p><p>  NETMESSAGE netMsg(PTC_USER_LIST, _T(""), _T(""), _T(""));</p><p>

90、;  int iListLen = m_lbUser.GetCount();</p><p>  CString strMsg;</p><p>  for(int index=m_lbUser.GetTopIndex(); index<iListLen; index++)</p><p><b>  {</b></p>&

91、lt;p>  m_lbUser.GetText(index, strMsg);</p><p>  strcpy(netMsg.data, (LPCTSTR)strMsg);</p><p>  p_client->SendMsg(netMsg);</p><p><b>  }</b></p><p>&l

92、t;b>  // 加工信息</b></p><p>  strMsg.LoadString(IDS_NEW_CLIENT);</p><p>  strMsg = p_client->GetName() + strMsg;</p><p>  strcpy(netMessage->data, (LPCTSTR)strMsg);</

93、p><p>  // 顯示該用戶進(jìn)入</p><p>  ShowInDisplay(strMsg);</p><p><b>  }</b></p><p><b>  // 顯示普通消息</b></p><p>  void CServerDlg::ShowMessage(N

94、ETMESSAGE netMessage)</p><p><b>  {</b></p><p>  CString strTo = netMessage.to;</p><p>  if(strTo==_T(""))</p><p><b>  {</b></p>

95、<p>  strTo = "所有人";</p><p><b>  }</b></p><p>  CString strForm = netMessage.form;</p><p>  CString strMsg = netMessage.data;</p><p>  CStr

96、ing strOut = strForm + "對" + strTo + "說:" + strMsg;</p><p>  ShowInDisplay(strOut);</p><p><b>  }</b></p><p><b>  客戶端:</b></p><

97、;p>  // ClientDlg.cpp : implementation file</p><p>  #include "stdafx.h"</p><p>  #include "Client.h"</p><p>  #include "ClientDlg.h"</p><

98、;p>  #ifdef _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>

99、;<p>  /////////////////////////////////////////////////////////////////////////////</p><p>  // CAboutDlg dialog used for App About</p><p>  class CAboutDlg : public CDialog</p>&

100、lt;p><b>  {</b></p><p><b>  public:</b></p><p>  CAboutDlg();</p><p>  enum { IDD = IDD_ABOUTBOX };</p><p>  protected:</p><p> 

101、 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support</p><p>  protected:</p><p>  DECLARE_MESSAGE_MAP()</p><p><b>  };</b></p><p>  CAbou

102、tDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)</p><p><b>  {</b></p><p><b>  }</b></p><p>  void CAboutDlg::DoDataExchange(CDataExchange* pDX)</p><p&

103、gt;<b>  {</b></p><p>  CDialog::DoDataExchange(pDX);</p><p><b>  }</b></p><p>  BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)</p><p>  END_MESSAGE_MAP()

104、</p><p>  // CClientDlg dialog</p><p>  CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/)</p><p>  : CDialog(CClientDlg::IDD, pParent)</p><p><b>  {</b></p

105、><p>  m_strDisplay = _T("");</p><p>  m_strSend = _T("");</p><p>  m_bWhispering = FALSE;</p><p>  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);&

106、lt;/p><p><b>  }</b></p><p>  void CClientDlg::DoDataExchange(CDataExchange* pDX)</p><p><b>  {</b></p><p>  CDialog::DoDataExchange(pDX);</p>

107、;<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);</p><p>  DDX_Check

108、(pDX, IDC_CHECK_WHISPERING, m_bWhispering);</p><p><b>  }</b></p><p>  BEGIN_MESSAGE_MAP(CClientDlg, CDialog)</p><p>  ON_WM_SYSCOMMAND()</p><p>  ON_WM_PAI

109、NT()</p><p>  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_SE

110、ND, OnBnSend)</p><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_

111、CONNCET, OnConnect)</p><p>  ON_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser)</p><p>  END_MESSAGE_MAP()</p><p>  // CClientDlg message handlers</p><p>  BOOL CClientDlg:

112、:OnInitDialog()</p><p><b>  {</b></p><p>  CDialog::OnInitDialog();</p><p>  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);</p><p>  ASSERT(IDM_ABOUTB

113、OX < 0xF000);</p><p>  CMenu* pSysMenu = GetSystemMenu(FALSE);</p><p>  if (pSysMenu != NULL)</p><p><b>  {</b></p><p>  CString strAboutMenu;</p>

114、<p>  strAboutMenu.LoadString(IDS_ABOUTBOX);</p><p>  if (!strAboutMenu.IsEmpty())</p><p><b>  {</b></p><p>  pSysMenu->AppendMenu(MF_SEPARATOR);</p><

115、;p>  pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);</p><p><b>  }</b></p><p><b>  }</b></p><p>  SetIcon(m_hIcon, TRUE);// Set big ico

116、n</p><p>  SetIcon(m_hIcon, FALSE);// Set small icon</p><p><b>  // 參數(shù)初始化</b></p><p>  m_Socket.Initialize(this);</p><p>  m_strNetIP = _T("127.0.0.1

117、");</p><p>  m_iNetPort = 3127;</p><p>  m_bConnect = FALSE;</p><p>  GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE);</p><p>  GetDlgItem(IDC_BN_SEND)->Enable

118、Window(FALSE);</p><p>  return TRUE; // return TRUE unless you set the focus to a control</p><p><b>  }</b></p><p>  void CClientDlg::OnSysCommand(UINT nID, LPARAM lPa

119、ram)</p><p><b>  {</b></p><p>  if ((nID & 0xFFF0) == IDM_ABOUTBOX)</p><p><b>  {</b></p><p>  CAboutDlg dlgAbout;</p><p>  dlg

120、About.DoModal();</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  CDialog::OnSysCommand(nID, lParam);</p>&l

121、t;p><b>  }</b></p><p><b>  }</b></p><p>  void CClientDlg::OnPaint() </p><p><b>  {</b></p><p>  if (IsIconic())</p><p

122、><b>  {</b></p><p>  CPaintDC dc(this); // device context for painting</p><p>  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);</p><p>  int cxIcon = Get

123、SystemMetrics(SM_CXICON);</p><p>  int cyIcon = GetSystemMetrics(SM_CYICON);</p><p>  CRect rect;</p><p>  GetClientRect(&rect);</p><p>  int x = (rect.Width() - cx

124、Icon + 1) / 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><

125、;/p><p><b>  {</b></p><p>  CDialog::OnPaint();</p><p><b>  }</b></p><p><b>  }</b></p><p>  HCURSOR CClientDlg::OnQueryDr

126、agIcon()</p><p><b>  {</b></p><p>  return (HCURSOR) m_hIcon;</p><p><b>  }</b></p><p>  void CClientDlg::OnBnConnect() </p><p><

127、;b>  {</b></p><p>  CString strConnectError;</p><p><b>  // 獲取用戶名字</b></p><p>  CInputDlg inputDlg;</p><p>  int iResult = inputDlg.DoModal();</

128、p><p>  if(iResult==IDCANCEL){return;}</p><p>  m_strName = inputDlg.m_strName;</p><p><b>  // 創(chuàng)建套接字</b></p><p>  if(!m_Socket.Create())</p><p>&l

129、t;b>  {</b></p><p>  strConnectError.LoadString(IDS_FAIL_CREATE_SOCKET);</p><p>  ShowInDisplay(strConnectError);</p><p><b>  return;</b></p><p>&l

130、t;b>  }</b></p><p>  CString strInfo;</p><p>  strInfo.LoadString(IDS_CONNECTING);</p><p>  ShowInDisplay(strInfo);</p><p><b>  // 連接服務(wù)器</b></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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論