版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件課程設(shè)計報告---簡易網(wǎng)絡(luò)聊天室
- mfc聊天軟件課程設(shè)計---網(wǎng)絡(luò)聊天程序設(shè)計
- mfc聊天軟件課程設(shè)計---網(wǎng)絡(luò)聊天程序設(shè)計
- vc++網(wǎng)絡(luò)聊天軟件課程設(shè)計
- 軟件工程-課程設(shè)計-socket聊天系統(tǒng)
- 軟件工程課程設(shè)計socket聊天系統(tǒng)
- tcpip網(wǎng)絡(luò)聊天課程設(shè)計
- 軟件工程課程設(shè)計-簡易辦公系統(tǒng)
- 軟件工程課程設(shè)計簡易辦公系統(tǒng)
- 基于java的簡易網(wǎng)絡(luò)聊天程序-計算機(jī)網(wǎng)絡(luò)課程設(shè)計
- 網(wǎng)絡(luò)課程設(shè)計---簡單聊天系統(tǒng)的設(shè)計與實(shí)現(xiàn)
- 網(wǎng)絡(luò)編程課程設(shè)計---網(wǎng)絡(luò)聊天室
- 軟件課程設(shè)計---局域網(wǎng)聊天程序
- java網(wǎng)絡(luò)聊天室課程設(shè)計
- tcp課程設(shè)計--網(wǎng)絡(luò)聊天室
- java課程設(shè)計---即時聊天系統(tǒng)
- 軟件課程設(shè)計報告--局域網(wǎng)聊天程序
- java課程設(shè)計--簡單的網(wǎng)絡(luò)聊天程序
- 網(wǎng)絡(luò)編程課程設(shè)計-java聊天室
- 軟件工程課程設(shè)計--- 文本聊天室
評論
0/150
提交評論