




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、編號: 計算機網(wǎng)絡課程設計說明書 題 目: 基于TCP協(xié)議網(wǎng)上 聊天程序 系 別: 專 業(yè): 學生姓名: 學 號: 指導教師: 2013 年 3 月 27 日 目 錄1 設計任務21.1 系統(tǒng)設計目標21.2 聊天程序的功能22 系統(tǒng)分析22.1系統(tǒng)理論基礎22.2 客戶機/服務器模式32.3 Sokect介紹42.4 系統(tǒng)開發(fā)環(huán)境52.5 系統(tǒng)結構設計53 總體設計53.1 體系結構設計53.2 網(wǎng)絡通信設計63.3 模塊設計8 3.31服務器8 3.32客戶端94 詳細設計104.1 設計服務器和客戶端的界面104.2 實現(xiàn)服務器和客戶端通過網(wǎng)絡通信114.3 實現(xiàn)多個客戶端之間的實時聊天
2、功能115 總結166 使用說明16參考文獻201 設計任務1.1 系統(tǒng)設計目標 深入理解計算機網(wǎng)絡基本原理,將書本上抽象的概念與具體的實現(xiàn)技術相結合,體會網(wǎng)絡協(xié)議的設計與實現(xiàn)過程,以及專業(yè)技術人員所使用的基本方法和技巧?;赥CP協(xié)議網(wǎng)上聊天程序實現(xiàn)一簡單的聊天程序,實現(xiàn)網(wǎng)上聊天,包括服務器和客戶端。要求: (1)支持多人聊天。(2)客戶端具有圖形化用戶界面。1.2 聊天程序的功能客戶端使用簡便,服務器端運行穩(wěn)定??蛻舳伺c服務器端可運行在多種系統(tǒng)平臺,具有良好的兼容性能??蛻舳伺c服務器端功能獨立,可獨立運行在不同的計算機上或運行在同一臺計算機上,具有最大的靈活性。 根據(jù)任課教師的要求及我自己
3、的編程能力,寫出以下的功能: 1、 登錄時只需要提供用戶名即可,無需輸入密碼。 2、 允許多人在線聊天。 3、 聊天發(fā)送的消息包括:用戶名稱、發(fā)送時間及正文。 4、 某用戶剛登錄服務器時,服務器需對其發(fā)送實時在線用戶列表。 5、 某用戶登錄或退出程序時都需要給服務器發(fā)送一個消息以通知其他用戶。 6、 能夠查看聊天記錄。 2 系統(tǒng)分析2.1 系統(tǒng)理論基礎TCP/IP的特點 TCP/IP協(xié)議的核心部分是傳輸層協(xié)議(TCP、UDP),網(wǎng)絡層協(xié)議(IP)和物理接口層,這三層通常是在操作系統(tǒng)內(nèi)核中設計。因此用戶一般不涉及。TCP是面向連接的,通信雙方保持一條通路,好比目前的電話線,使用telnet登陸B(tài)
4、BS,用的就是TCP協(xié)議;UDP是無連接的,通信雙方都不保持對方的狀態(tài),瀏覽器訪問Internet時使用的HTTP協(xié)議就是基于UDP協(xié)議的。編程時,編程界面有兩種形式:一、是由內(nèi)核心直接提供的系統(tǒng)調(diào)用;二、使用以庫函數(shù)方式提供的各種函數(shù)。前者為核內(nèi)設計,后者為核外設計。用戶服務要通過核外的應用程序才能設計,所以要使用套接字(socket)來設計。2.2 客戶機/服務器模式 C/S結構(Client/Server結構)是大家熟知的客戶機和服務器結構。它是軟件系統(tǒng)體系結構,通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務合理分配到Client端和Server端來實現(xiàn),降低了系統(tǒng)的通訊開銷。目前大多數(shù)應
5、用軟件系統(tǒng)都是Client/Server形式的兩層結構,由于現(xiàn)在的軟件應用系統(tǒng)正在向分布式的Web應用發(fā)展,Web和Client/Server 應用都可以進行同樣的業(yè)務處理,應用不同的模塊共享邏輯組件;因此,內(nèi)部的和外部的用戶都可以訪問新的和現(xiàn)有的應用系統(tǒng),通過現(xiàn)有應用系統(tǒng)中的邏輯可以擴展出新的應用系統(tǒng)。這也就是目前應用系統(tǒng)的發(fā)展方向。 首先服務器方要啟動,并根據(jù)請求提供相應服務: (1)打開一通信通道并告知本地主機,它在某一公認地址端口上(如http為80)接受客戶請求。 (2)等待客戶請求到達該端口。 (3)接收到重復服務請求,處理該請求并發(fā)送應答信號。接收并發(fā)服務請求,要激活一新進程來處
6、理這個客戶請求。新進程處理此客戶請求,并不需要對其他請求做出應答。服務完成后,關閉此新進程與客戶的通信鏈路,并終止。 (4)返回第二步,等待另外的客戶請求 (5)關閉服務器。 客戶方: (1)打開一通信通道,并連接到服務器所在主機的特定端口。 (2)向服務器發(fā)出服務請求報文,等待并接收應答;繼續(xù)提出請求。 (3)請求結束后關閉通信通道并終止。 從上面的描述過程可知: (1)客戶與服務器進程的作用是非對稱的。因此編碼不同。 (2)服務進程一般是先于客戶請求啟動的。只要系統(tǒng)運行,該進程一直存在,直到正常終止或者強迫終止。 在TCP/IP網(wǎng)絡中兩個進程間的相互作用的主機模式是客戶機/服務器模式(Cl
7、ient/Server model)。該模式的建立基于以下兩點:1、非對等作用;2、通信完全是異步的??蛻魴C/服務器模式在操作過程中采取的是主動請求服務響應的方式。2.3 Socket介紹Socket是建立在傳輸層協(xié)議(主要是TCP和UDP)上的一種套接字規(guī)范,最初是由美國加州Berkley大學提出,它定義兩臺計算機間進行通信的規(guī)范(也是一種編程規(guī)范),如果說兩臺計算機是利用一個“通道”進行通信,那么這個“通道”的兩端就是兩個套接字。套接字屏蔽了底層通信軟件和具體操作系統(tǒng)的差異,使得任何兩臺安裝了TCP協(xié)議軟件和實現(xiàn)了套接字規(guī)范的計算機之間的通信成為可能。微軟的Windows Socket規(guī)范
8、(簡稱Winsock)對Berkley的套接字規(guī)范進行了擴展,利用標準的Socket的方法,可以同任何平臺上的Socket進行通信;利用其擴展,可以更有效地實現(xiàn)在Windows平臺上計算機間的通信。Socket減輕了編寫計算機間通信軟件的難度;標準的Socket的應用程序框架如下:Server方:Socket() 新建一個SocketBind() 同服務器地址綁定 Listen() Accept()block waitread()接受消息,在windows平臺中,方法為send(TCP),或者是send to(UDP)處理服務請求Write()發(fā)送消息,
9、在windows平臺中,方法為send(TCP), 或者為send to(UDP)。Client方相對簡單:Socket()Connect()通過一定的port連接特定的服務器,這是與服務器建立連接Write()Read()。Socket可以是基于TCP的,也可以是基于UDP,同時Socket甚至建立在其他的協(xié)議,比如IPX/SPX,DECNet等。在新建一個Socket時,可以指定新建何類Socket。Bind()用來同服務器的地址綁定,如果一個主機只有一個IP地址,實際上綁定的作用就相對多余了。Listen()開始監(jiān)聽網(wǎng)絡,Accept()用于接受連接,其返回值是保持同客戶機聯(lián)系
10、的Socket。在VC+ 2008中,其底層的Socket也應該是Windows的Socket。Inprise在VC+2008中對Windows Socket進行了有效的封裝,使得用戶可以很方便地編寫網(wǎng)絡通信程序。Socket系統(tǒng)調(diào)用包括創(chuàng)建Socket、將創(chuàng)建的Socket與本地端口綁定、建立Socket連接服務器、監(jiān)聽是否有連接、請求數(shù)據(jù)的可控緩沖發(fā)送和可控緩沖接收,到最后關閉Socket。首先在服務器方,利用socket()函數(shù)建立流式套接字,返回套接字號s,接著利用bind()函數(shù)將套接字s與本地地址綁定,緊接著利用listen()函數(shù)通知TCP,監(jiān)聽客戶方,服務器準備接收連接,沒有連
11、接的話,服務器方通過closesocket()關閉套接字s,服務結束。有連接的話,在客戶方,通過socket()函數(shù)建立流式套接字s,此時在服務器方,建立連接,通過accept()返回,得到新的套接字ns,客戶方通過connect()將套接字s與遠程地址連接,此時服務器方/客戶方在ns/s上讀/寫數(shù)據(jù),直到交換完成。交換完成后,服務器方/客戶方關閉套接字ns/s,最后服務器方通過closesocket()關閉最初套接字s,服務結束。2.4系統(tǒng)開發(fā)環(huán)境本系統(tǒng)開發(fā)環(huán)境采用Visual Studio 2008。編譯語言采用C+。2.5系統(tǒng)結構設計本系統(tǒng)采用C/S結構,最重要的特點是非對等相互作用,即
12、客戶與服務器處于不平等的地位,服務器擁有客戶所不具備的硬軟件資源,客戶和服務器分別是服務的請求者和提供者。網(wǎng)絡中各個機器的資源是不平等的,網(wǎng)絡的真正目的就是共享這些不均等資源源,非對等相互作用特點也正好體現(xiàn)和適應了客觀現(xiàn)實中資源的不均等現(xiàn)象。局域網(wǎng)上不同主機進程間通信完全是異步的,通信時機具有隨機性,所以必須用這種為通信雙方的數(shù)據(jù)交換提供同步的機制。3 總體設計3.1體系結構設計通常的通信工具,都采用客戶機/服務器(C/S)體系結構,C/S結構是這樣的一種結構:它包括一個客戶機(或前端),一個服務器(或稱后端),客戶機的作用是訪問和處理遠程服務器上的數(shù)據(jù),服務器的作用是接收和處理客戶機的數(shù)據(jù)請
13、求。有時,可能有多個客戶向同一個服務器同時請求服務,這就需要服務器決定怎樣處理這些請求。Client/Server結構是當前數(shù)據(jù)庫應用程序中極為流行的一種方式。尤其是網(wǎng)絡技術的發(fā)展,使得當前很多系統(tǒng)都采用這種方式進行構造,其最大的優(yōu)點是將計算機工作任務分別由客戶端和服務器端來共同完成,這樣有利于充分合理的利用系統(tǒng)資源。另外它的服務器端還可以將信息集中起來,任何客戶機都可以通過訪問服務器而獲得所需的信息。Client/Server模型最終可歸結為一種“請求/應答”關系。一個請求總是首先被客戶發(fā)出,然后服務器總是被動地接收請求,返回客戶需要的結果。在客戶發(fā)出一個請求之前,服務進程一直處于休眠狀態(tài)。
14、一個客戶提出請求后,服務進程被“喚醒”并且為客戶提供服務,對客戶的請求做出所需要的應答。如下圖所示: 圖3.1客戶機服務器通信結構示圖在客戶端啟動后,客戶端計算得到本地網(wǎng)絡的廣播地址,進行廣播查找服務器端,服務器接收到客戶端的廣播信息后返回服務器地址,則客戶端接收、驗證信息并記錄服務器端地址,然后客戶端啟動定時期,定時發(fā)送信息到服務器,以告知服務器自己在線,然后服務器返回在線用戶列表,服務器依靠客戶端發(fā)送的信息來更新維護在線用戶列表。在客戶端與服務器盡心數(shù)據(jù)交換,擁有了在線用戶列表后,就可以選擇IP進行客戶端之間的點對點信息交流了。如果服務器不在線,則客戶端會提示用戶退出,在一定的時間后自動退
15、出。3.2網(wǎng)絡通信設計在調(diào)用了Windows sockets 的啟動函數(shù)WSACleanup()之后才能進行其他的Socket系統(tǒng)調(diào)用,但啟動函數(shù)WSAStartup()是為了建立與Windows Sockets DLL的連接,因此在Visual Studio 2008所建立工程的工程設置中的連接的庫模塊必須進行設置,在其中的link欄內(nèi)的對象/庫模塊中加入“Ws2_32.lib”,才能真正建立建立與Windows Sockets DLL的連接。其他的Socket系統(tǒng)調(diào)用包括創(chuàng)建Socket、將創(chuàng)建的Socket與本地端口綁定、建立Socket連接服務器、監(jiān)聽是否有連接、請求數(shù)據(jù)的可控緩沖發(fā)送
16、和可控緩沖接收,到最后關閉Socket。具體流程圖如1所示。首先在服務器方,利用socket()函數(shù)建立流式套接字,返回套接字號s,接著利用bind()函數(shù)將套接字s與本地地址綁定,緊接著利用listen(0函數(shù)通知TCP,監(jiān)聽客戶方,服務器準備接收連接,沒有連接的話,服務器方通過closesocket()關閉套接字s,服務結束。有連接的話,在客戶方,通過socket()函數(shù)建立流式套接字s,此時在服務器方,建立連接,通過accept()返回,得到新的套接字ns,客戶方通過connect()將套接字s與遠程地址連接,此時服務器方/客戶方在ns/s上讀/寫數(shù)據(jù),直到交換完成。交換完成后,服務器方
17、/客戶方關閉套接字ns/s,最后服務器方通過closesocket()關閉最初套接字s,服務結束。具體設計過程如圖3.2所示。服務器方Socket()建立流式接字,返回套接字號s客戶方bind()套接字s與本地地址綁定listen()通知TCP服務器準備接收連接accept()接收連接,等待客戶端的連接建立連接,accept()返回,得到新套接nsRecv()/send()在ns上讀/寫數(shù)據(jù),直到完成交換closesocket(),關閉套接字nsclosesocket()關閉最初套接字s,服務結束Socket()建立流式套接字號sconnect()將套接字s與遠程地址連接Recv()/send
18、()在s上讀/寫數(shù)據(jù),直到完成交換closesocket()關閉套接字s,結束TCP 圖3.2 面向連接的套接字的系統(tǒng)調(diào)用流程圖3.3 模塊設計 3.31 服務器 首先運行服務器,服務器偵聽端口消息,等待客戶端向其建立連接的申請,一旦接收到客戶端的連接請求,服務器將返回一個新的套接字描述符,通過該描述符調(diào)用數(shù)據(jù)傳輸函數(shù)即可與客戶端進行數(shù)據(jù)的收發(fā)。服務器若接收的是登陸信息,向該用戶發(fā)送在線用戶列表,并更新服務器的在線用戶列表;若收到的是發(fā)送信息,服務器解析信息,然后通過廣播消息,向其所有線用戶列表發(fā)送消息。服務器端流程圖如下。 向該用戶發(fā)送在線用戶列表 開始偵聽端口消息 解析消息向其所有在線用戶
19、發(fā)送消息首次登陸更新服務器在線用戶列表收到消息 運行服務器 是 否 是 廣播消息 圖3.31 服務器流程圖 3.32 客戶端 在運行服務器之后,運行客戶端??蛻舳耸紫认蚍掌魈岢鼋⑦B接請求,然后建立一個套接字描述符,通過該描述符調(diào)用數(shù)據(jù)傳輸函數(shù)即可與服務端進行數(shù)據(jù)的收發(fā)。用戶登錄成功后,向服務器發(fā)送登陸消息,并更新本地在線用戶列表,然后通過服務器實現(xiàn)與其他客戶聊天;當客戶退出,向服務器發(fā)送下線消息。客戶端流程圖如下。 開始 開始 開始 運行客戶端 運行客戶端 運行客戶端 用戶登陸 用戶登陸 用戶登陸給服務器發(fā)送登陸消息登陸成功登陸成功向該用戶發(fā)送在線用戶列表登陸成功向該用戶發(fā)送在線用戶列表
20、否 是 顯示主頁面 顯示主頁面 顯示主頁面 是給服務器發(fā)送下線消息向其所有在線用戶發(fā)送消息向其所有在線用戶發(fā)送消息 是更新本地在線用戶列表更新本地在線用戶列表更新本地在線用戶列表與其他用戶進行聊天與其他用戶進行聊天與其他用戶進行聊天 退出 退出 退出 圖3.32 客戶端流程圖 4 詳細設計4.1 設計服務器和客戶端的界面分別為客戶端和服務器創(chuàng)建基于對話框的MFC工程。分別為其添加顯示信息和輸入信息的文本控件和按鈕,并為其指定適當?shù)膶傩?。服務器和客戶端的運行界面分別如圖4.14.3所示。 圖4.1 服務器運行界面設計 圖4.2 客戶端登陸界面設計 圖4.3 客戶端運行界面設計4.2實現(xiàn)服務器和客
21、戶端通過網(wǎng)絡通信服務器和客戶端通過定義CSocket 類的子類來重載CSocket 類中的成員函數(shù)完成服務器與客戶端之間的網(wǎng)絡通信。服務器和客戶端的交互包括客戶端登錄服務器,服務器將客戶名添加至客戶列表中,以及客戶下線后,服務器和在線客戶將下線客戶從客戶列表中刪除等。4.3實現(xiàn)多個客戶端之間的實時聊天功能 由于客戶端/服務器模式,客戶在進行聊天時,需要把待發(fā)送的消息發(fā)送至服務器;服務器接收到消息后,經(jīng)過查詢客戶列表,尋找接受的客戶名后,將消息轉發(fā)至在線客戶處。由于服務器與客戶端交互時,還需接收客戶端的登錄信息,故將接收客戶端的登錄信息和接收消息發(fā)在同一個接收函數(shù)中。 根據(jù)以上步驟,對實現(xiàn)聊天工
22、具的服務器和客戶端的關鍵代碼解說如下。 (1)服務器初始化,開始監(jiān)聽客戶端的連接請求,具體代碼如下:BOOL CChatServerApp:InitInstance()if (!AfxSocketInit() /套接字初始化失敗AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;AfxEnableControlContainer();CServerSocket *m_pSocket; /自定義的CSocket類的子類 m_pSocket = new CServerSocket;if(!m_pSocket->Create(9999) /創(chuàng)
23、建套接字AfxMessageBox(_T("創(chuàng)建Socket失??!");return FALSE;if(!m_pSocket->Listen() /監(jiān)聽客戶端的連接請求AfxMessageBox(_T("創(chuàng)建偵聽發(fā)生錯誤!");return FALSE;(2)客戶端登陸至服務器,具體代碼如下: void CLoginDlg:OnOK() UpdateData(); /獲取文本框中數(shù)據(jù)if(!m_pSocket->Create() /創(chuàng)建套接字AfxMessageBox(_T("網(wǎng)絡創(chuàng)建錯誤!");m_pSocket->
24、;Close();return;if(!m_pSocket->Connect(m_strServer,9999) /連接至服務器AfxMessageBox(_T("連接服務器失敗!");m_pSocket->Close();return;Header head;head.type = LOGIN_IO;head.len = m_strName.GetLength();m_pSocket->Send(char *)&head,sizeof(Header); /發(fā)送客戶信息至服務器m_pSocket->Send(m_strName,m_strNa
25、me.GetLength();theApp.m_strName = m_strName;CDialog:OnOK(); (3)服務器接收新登錄客戶的信息,具體代碼如下:void CClientSocket:OnReceive(int nErrorCode) char buff1sizeof(Header);memset(buff1, 0, sizeof(buff1);Receive(buff1,sizeof(buff1);Header *header = (Header*)buff1;int length = header->len;char type = header->type
26、;if(type = LOGIN_IO) /如果收到的是登錄信息char buff1000; memset(buff,0,sizeof(buff); Receive(buff,length); /接受客戶登錄信息CTime time = CTime:GetCurrentTime(); /獲取當前系統(tǒng)時間 CString t = time.Format("%Y-%m-%d %H:%M:%S"); /時間格式CEdit *p_Edit = (CEdit *):AfxGetMainWnd()->GetDlgItem(IDC_EDIT_INFO);CString strTem
27、p = t + ": " + CString(buff) + " 進入rn" /顯示登錄信息p_Edit->ReplaceSel(strTemp); /更新在線客戶列表 m_strName = buff; m_dlgServer->UpdateUser(this);if(type = SEND_MESSAGE) /如果接受的是客戶發(fā)送信息char buff1000; memset(buff,0,sizeof(buff); Receive(buff,sizeof(buff); /接收消息內(nèi)容CClientSocket *curr = NULL;
28、POSITION pos = clist->GetHeadPosition();while (pos != NULL) /將消息發(fā)至在線客戶curr = (CClientSocket *)clist->GetNext(pos);curr->Send(char *)header,sizeof(Header);curr->Send(buff, sizeof(buff);CSocket:OnReceive(nErrorCode); (4)客戶發(fā)送消息,先將消息發(fā)至服務器,具體代碼如下:void CMyChatDlg:OnSend() UpdateData();if(m_str
29、Message = "")AfxMessageBox(_T("不能發(fā)送空消息!");CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);pEdit->SetFocus();return;Header head;head.type = SEND_MESSAGE;head.len = m_strMessage.GetLength();CTime time = CTime:GetCurrentTime();CString t = time.Format("%H:%M:%S");CSt
30、ring nikeName = theApp.m_strName;CString str = nikeName + " " + t + "rn" + " " +m_strMessage;m_pSocket->Send(char *)&head,sizeof(Header); /將發(fā)送時間和收信客戶信息發(fā)至服務器if(m_pSocket->Send(LPCTSTR)str, str.GetLength() /發(fā)送信息內(nèi)容m_strMessage = ""UpdateData(FALSE);CEdi
31、t *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_MESSAGE);pEdit->SetFocus();elseAfxMessageBox(_T("網(wǎng)絡傳輸錯誤!"); (5)服務器接收消息并轉發(fā),具體代碼如下:void CClientSocket:OnReceive(int nErrorCode) char buff1sizeof(Header);memset(buff1, 0, sizeof(buff1);Receive(buff1,sizeof(buff1);Header *header = (Header*)buff1;int le
32、ngth = header->len;char type = header->type;if(type = LOGIN_IO) /如果收到的是登錄信息char buff1000; memset(buff,0,sizeof(buff); Receive(buff,length); /接受客戶登錄信息CTime time = CTime:GetCurrentTime(); /獲取當前系統(tǒng)時間 CString t = time.Format("%Y-%m-%d %H:%M:%S"); /時間格式CEdit *p_Edit = (CEdit *):AfxGetMainW
33、nd()->GetDlgItem(IDC_EDIT_INFO);CString strTemp = t + ": " + CString(buff) + " 進入rn" /顯示登錄信息p_Edit->ReplaceSel(strTemp); /更新在線客戶列表 m_strName = buff; m_dlgServer->UpdateUser(this);if(type = SEND_MESSAGE) /如果接受的是客戶發(fā)送信息char buff1000; memset(buff,0,sizeof(buff); Receive(buff
34、,sizeof(buff); /接收消息內(nèi)容CClientSocket *curr = NULL;POSITION pos = clist->GetHeadPosition();while (pos != NULL) /將消息發(fā)至在線客戶curr = (CClientSocket *)clist->GetNext(pos);curr->Send(char *)header,sizeof(Header);curr->Send(buff, sizeof(buff);CSocket:OnReceive(nErrorCode); (6)客戶端接收服務器轉發(fā)的消息,具體代碼如下:
35、 BOOL CMyChatDlg:GetMessage() /接受服務器轉發(fā)的信息char buff1000;memset(buff,0,sizeof(buff);m_pSocket->Receive(buff, sizeof(buff),0);CString strTemp = buff;strTemp += _T("rn");m_MessageList.ReplaceSel(strTemp); /顯示接受到的信息return TRUE; (7)客戶下線后,服務器將下線的客戶從客戶列表中刪除,具體代碼如下: void CClientSocket:OnClose(in
36、t nErrorCode) /服務器通過失去連接錯誤碼獲知下線的客戶POSITION pos = clist->Find(this);if(pos != NULL)clist->RemoveAt(pos); /將下線客戶信息從列表中刪除CTime time = CTime:GetCurrentTime();CString t = time.Format("%Y-%m-%d %H:%M:%S");CEdit *p_Edit = (CEdit *)m_dlgServer->GetDlgItem(IDC_EDIT_INFO);CString strTemp =
37、t + ": " + this->m_strName + " 離開rn"p_Edit->ReplaceSel(strTemp); /顯示客戶下線信息m_dlgServer->UpdateUser(this);this->Close(); /關閉與下線客戶連接的套接字delete this;CSocket:OnClose(nErrorCode); (8)其他客戶下線后,客戶端更新在線用戶列表,具體代碼如下:void CMyChatDlg:UpdateUser()char buff1000;memset(buff,0,sizeof(b
38、uff);m_pSocket->Receive(buff, sizeof(buff),0); /接收用戶下線信息CString user_info = buff;CString array100;int b = 0;for( int i=0; i<user_info.GetLength(); i+ ) /查找當前在線用戶if(i != (user_info.GetLength() - 1)if ( user_infoi='&' )b +;elsearrayb = arrayb + user_infoi;m_UserList.ResetContent();for(int j=0; j<b+1; j+) /更新在線用戶列表m_UserList.AddString(arrayj);5總結 經(jīng)過了整整3個星期的忙碌,終于完成了課程設計。在這段時間里體驗了無數(shù)的酸甜苦辣,從解決不了細小問題的苦惱到問題最終解決的喜悅。一直伴隨著整個設計過程。整個設計過程是不斷學習,不斷發(fā)現(xiàn)問題、分析問題、解決問題的過程。使我受益良多。設計期間有許多的感觸、想法、經(jīng)驗、教訓,對以后的學習、工作有很大的益處。 這次的課程設計是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 挖掘機平整地面施工方案
- 錨固樁施工方案
- 惠州市潤根電器有限公司 AC 電源線及插頭的生產(chǎn)建設項目環(huán)評報告表
- 初中半期考答案數(shù)學試卷
- 仿玉石樓梯扶手施工方案
- 小學校園內(nèi)管網(wǎng)施工方案
- 房建地下連續(xù)梁施工方案
- 別墅的專項施工方案
- 農(nóng)田排水降水施工方案
- 黃桃高產(chǎn)栽培技術的高效應用及科學推廣措施分析
- DB3502-Z 5010-2018海綿城市建設工程施工與質(zhì)量驗收標準
- 2024年內(nèi)蒙古巴彥淖爾市交通投資集團有限公司招聘筆試參考題庫含答案解析
- 春季行車安全行駛安全知識培訓
- 產(chǎn)品制造工藝總方案
- 2024年云南呈貢區(qū)城市投資集團有限公司招聘筆試參考題庫含答案解析
- T-ZJASE 024-2023 呼吸閥定期校驗規(guī)則
- 新生兒藥物過敏
- 工作場所有害因素職業(yè)接觸限值-第2部分-物理因素
- 2024年度醫(yī)院醫(yī)學檢驗學專業(yè)進修回顧課件
- 《手腕上的菩提子》課件
- 營銷管理學菲利普科特勒
評論
0/150
提交評論