用VC++簡單的多線程聊天室程序完整課程設(shè)計(jì)分析(共27頁)_第1頁
用VC++簡單的多線程聊天室程序完整課程設(shè)計(jì)分析(共27頁)_第2頁
用VC++簡單的多線程聊天室程序完整課程設(shè)計(jì)分析(共27頁)_第3頁
用VC++簡單的多線程聊天室程序完整課程設(shè)計(jì)分析(共27頁)_第4頁
用VC++簡單的多線程聊天室程序完整課程設(shè)計(jì)分析(共27頁)_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上課 程 設(shè) 計(jì) 書學(xué)院 計(jì)算機(jī)學(xué)院 專業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 班級 題目 局域網(wǎng)聊天室程序 教師 學(xué)生 課程設(shè)計(jì)任務(wù)書 課程名稱VC+課程設(shè)計(jì)時(shí)間題 目局域網(wǎng)聊天室程序主要內(nèi)容:該系統(tǒng)要求完成聊天室的全過程,包括客戶端和服務(wù)器兩大部分的編程及其連接。服務(wù)器端聊天程序負(fù)責(zé)接收和發(fā)送來自客戶端的聊天信息,客戶端聊天程序負(fù)責(zé)建立和維護(hù)與服務(wù)器端的連接,想服務(wù)器發(fā)送本客戶的聊天內(nèi)容。系統(tǒng)采用VISUAL C+語言程序設(shè)計(jì)編程實(shí)現(xiàn)。要求:(1)通過實(shí)際軟件項(xiàng)目的分析、設(shè)計(jì)、編碼、測試等工作,掌握用軟件工程的方法來開發(fā)和維護(hù)軟件。(2)按要求編寫課程設(shè)計(jì)報(bào)告書,能正確編寫分析、設(shè)計(jì)

2、、編碼、測試等技術(shù)文檔和用戶使用手冊。 (3)進(jìn)行系統(tǒng)的聯(lián)合調(diào)試,編寫系統(tǒng)使用說明。(4)完成系統(tǒng)的文檔、設(shè)計(jì)說明工作任務(wù)分配:計(jì)科098班:XX主要負(fù)責(zé)程序框架設(shè)計(jì)和服務(wù)端代碼編寫計(jì)科098班:XX主要負(fù)責(zé)客服端代碼編寫計(jì)科096班:XX主要負(fù)責(zé)軟件測試及調(diào)試目錄 專心-專注-專業(yè)局域網(wǎng)聊天室程序摘 要計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)發(fā)展至今已經(jīng)大大超越了人們當(dāng)初的預(yù)想,無論是人們?nèi)粘5墓ぷ鬟€是學(xué)習(xí),我們都越來越多的依靠到互聯(lián)網(wǎng)。各種實(shí)時(shí)性的聊天娛樂軟件也同時(shí)誕生,而且為我們的即時(shí)通訊帶來了眾多的方便,比如說大家所熟知的騰訊QQ、微軟的MSN、移動的Fetion等,都是做的比較成功的實(shí)時(shí)聊天工具。隨著網(wǎng)絡(luò)的日

3、益普及,各種聊天工具也層出不窮,但當(dāng)我們學(xué)習(xí)了windows程序設(shè)計(jì)這門課程之后,我們決定設(shè)計(jì)一個(gè)簡單的聊天系統(tǒng)來鞏固我們的學(xué)習(xí)。接下來的課程設(shè)計(jì)就是針對一個(gè)簡單的網(wǎng)絡(luò)聊天程序,利用MFC為開發(fā)工具,實(shí)現(xiàn)基本的通訊功能。在課程設(shè)計(jì)中,系統(tǒng)開發(fā)平臺為Windows XP,程序設(shè)計(jì)設(shè)計(jì)語言采用Visual C+,數(shù)據(jù)庫采用Access,程序運(yùn)行平臺為Windows 98/2000/XP。關(guān)鍵詞 聊天軟件;局域網(wǎng);MFC; Visual C+;多線程1 引 言1.1課題背景及意義當(dāng)今世界正處于信息時(shí)代,計(jì)算機(jī)和通信網(wǎng)絡(luò)是這一時(shí)代所謂“信息基礎(chǔ)設(shè)施”。在互聯(lián)網(wǎng)相當(dāng)普及的今天,在互聯(lián)網(wǎng)上聊天對很多“網(wǎng)蟲

4、”來說已經(jīng)是家常便飯了。聊天室程序可以說是網(wǎng)上最簡單的多點(diǎn)通信程序。一個(gè)簡單的聊天室, 從程序員的觀點(diǎn)來看就是在多個(gè)I/O端點(diǎn)之間實(shí)現(xiàn)多對多的通信?;赟OCKET的局域網(wǎng)通信是一種靈活的、易于實(shí)現(xiàn)的、低成本的方法。它可以運(yùn)行在各種使用TCP/IP協(xié)議作為通訊協(xié)議的網(wǎng)絡(luò)上。而在SOCKET API的幫助下,開發(fā)基于SOCKET的局域網(wǎng)通信軟件也是易于實(shí)現(xiàn)的。1.2 實(shí)驗(yàn)平臺介紹Visual C+(簡稱VC)是Microsoft公司推出的目前使用極為廣泛的基于Windows平臺的C+可視化開發(fā)環(huán)境。VC基于C,C+語言,主要由是MFC組成,是與系統(tǒng)聯(lián)系非常緊密的編程工具,它兼有高級,和低級語言的

5、雙重性,功能強(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)勢。1.3 可行性分析本課程設(shè)計(jì)主要解決在客戶端于客戶端的信息交換和客戶端于服務(wù)器的信息交換及服務(wù)器的信息處理上的管理的課程設(shè)計(jì)。此程序主要分為兩部分:服務(wù)器端和客戶端。服務(wù)器端用于提供一個(gè)網(wǎng)絡(luò)端口,等待客戶端發(fā)出請求,登錄到此服務(wù)端,然后進(jìn)行網(wǎng)絡(luò)通訊和消息的轉(zhuǎn)發(fā);客戶端可通過服務(wù)器端

6、的IP地址發(fā)送連接請求,然后登陸聊天室。在服務(wù)器端的成員列表欄中會顯示在線的所有人名單,有人退出聊天室,成員列表會自動除名。服務(wù)器端同時(shí)也提供了成員之間的私聊功能,此時(shí)服務(wù)器端作為一個(gè)轉(zhuǎn)發(fā)站,進(jìn)行消息的轉(zhuǎn)發(fā)。整個(gè)程序的主體使用了CSocket類的方法,實(shí)現(xiàn)了網(wǎng)絡(luò)通訊聊天。 先啟動服務(wù)器端聊天程序,這是聊天服務(wù)器需要指定一個(gè)端口號,客戶端則根據(jù)這個(gè)端口號以及服務(wù)器的網(wǎng)絡(luò)地址與服務(wù)器進(jìn)行通信。在這里,把端口號成為“聊天頻道” 。在后面的程序代碼分析中將看到,端口號并不等同于聊天頻道,而是在聊天頻道上增加一個(gè)固定的偏移值,使得這個(gè)聊天頻道不會和系統(tǒng)保留的端口發(fā)生沖突。 服務(wù)器啟動后將在這個(gè)指定的端口

7、號中等待客戶的連接。對于公共聊天室,服務(wù)器對客戶的數(shù)目不做任何限制。而對于私人聊天室,每個(gè)聊天頻道則只能允許兩個(gè)客戶互相連接,使得一方發(fā)送的信息只能到達(dá)對方的主機(jī)中。這里的服務(wù)器提供的是公共聊天服務(wù)。 通過分析發(fā)現(xiàn),該程序完全可以通過Visual C+中MFC完成。2需求分析2.1 設(shè)計(jì)目的綜合運(yùn)用本課程及計(jì)算機(jī)網(wǎng)絡(luò)的相關(guān)知識設(shè)計(jì)并實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)應(yīng)用程序,以Visual C+作為開發(fā)平臺,通過實(shí)踐復(fù)習(xí)鞏固課堂所學(xué)的理論知識,提高對所學(xué)知識的綜合應(yīng)用能力。2.2 設(shè)計(jì)要求 采用客戶/服務(wù)器模式,分為客戶端程序和服務(wù)器端程序。服務(wù)器采用WINSOCK I/O模型中的任一種,支持多個(gè)客戶同時(shí)在線聊天。

8、客戶端程序和服務(wù)器程序通過網(wǎng)絡(luò)交換聊天字符串內(nèi)容,服務(wù)器窗口的列表框中顯示當(dāng)前在線用戶,支持客戶端之間的私聊(可以通過服務(wù)器中轉(zhuǎn),或考慮UDP打洞直接建立端端連接)。課程設(shè)計(jì)要求設(shè)計(jì)并編程完成兩個(gè)方面的內(nèi)容:首先建立一個(gè)使用TCP協(xié)議的聊天室服務(wù)器,這個(gè)服務(wù)器可以同時(shí)支持多個(gè)用戶的在線聊天;其次設(shè)計(jì)一個(gè)可以和服務(wù)器通信的聊天室客戶端。2.3 功能要求² 支持多個(gè)客戶端的連接,在服務(wù)器和多個(gè)客戶端之間進(jìn)行數(shù)據(jù)傳輸;² 接收客戶端發(fā)送的消息,并顯示在一個(gè)列表框中;² 在用戶連接上后有提示,顯示出連接的用戶名字;² 發(fā)送信息時(shí)可以顯示聊天的所有記錄;2.4 系

9、統(tǒng)主要功能和主要功能描述服務(wù)器端聊天程序必須能夠做3件事情:(1) 服務(wù)器聊天程序要在待定的端口上等待來自聊天客戶的連接請求,并且需要維護(hù)一個(gè)客戶連接表,以記錄所有成功的連接。(2) 服務(wù)器聊天程序要及時(shí)接受從各個(gè)聊天客戶發(fā)送過來的信息,然后把這些信息轉(zhuǎn)發(fā)到一個(gè)或多個(gè)客戶連接。對于公共聊天室,服務(wù)器將把接受到的信息向除源端外的所有客戶發(fā)送過去。(3) 服務(wù)器還要監(jiān)控這些連接的狀態(tài),在客戶主動離開或發(fā)生故障時(shí)從列表中刪除相應(yīng)的表項(xiàng),并及時(shí)更新連接表。客戶端聊天程序需要完成以下幾個(gè)功能:(1) 客戶端聊天程序要負(fù)責(zé)建立和維護(hù)與服務(wù)器的連接,通過獲取用戶的設(shè)置嘗試與服務(wù)器的連接,并且隨時(shí)檢測連接的狀

10、態(tài)。(2) 客戶端聊天程序要把用戶輸入的信息及時(shí)發(fā)送到聊天服務(wù)器。一般情況下,當(dāng)用戶輸入一行信息并且按下回車鍵后聊天程序就要把這一行信息發(fā)送出去,才能及時(shí)地滿足用戶的交互需求。(3) 要隨時(shí)準(zhǔn)備好接受來自服務(wù)器的信息,隨時(shí)把接受到的信息顯示出來,讓用戶及時(shí)看到對方的響應(yīng)。(4) 在用戶退出聊天過程是要關(guān)閉與服務(wù)器的連接。比較好的做法是提前通知服務(wù)器或者直接給服務(wù)器發(fā)送一條退出通知,使得服務(wù)器能夠及時(shí)掌握客戶端的連接狀態(tài),把對方客戶的退出信息及時(shí)發(fā)送到對等實(shí)體上。3設(shè)計(jì)流程圖根據(jù)對用戶的要求及功能設(shè)置可以得到以下的流程圖3.1,用戶首先啟動客戶端,登陸服務(wù)器并向服務(wù)器發(fā)送信息,啟動服務(wù)器,服務(wù)器

11、等待客戶要求并向客戶反饋在線用戶信息,用戶向服務(wù)器發(fā)送信息,服務(wù)器處理用戶的數(shù)據(jù),然后用戶開始聊天。客戶端的聊天分為對所有人的信息和私聊的信息,該信息應(yīng)通過程序控制分別進(jìn)行處理。圖3.1 設(shè)計(jì)流程圖4 調(diào)試分析過程描述n 在聊天客服端啟動的時(shí)候?qū)Χ丝谶M(jìn)行監(jiān)聽,會出現(xiàn)圖4.1的界面。圖4.1登陸服務(wù)器界面n 在客戶端啟動的時(shí)候,會出現(xiàn)圖4.2的界面,該界面為客戶端的連接界面。圖4.2 登陸客戶端界面(客服端1)圖4.2 登陸客戶端界面(客服端2)n 圖4.3為用戶張三和李四連接服務(wù)器時(shí)的界面圖4.3 張三登陸服務(wù)器圖4.3李四登陸服務(wù)器n 圖4.4為用戶李四發(fā)送消息的服務(wù)器界面圖4.4 李四發(fā)送

12、消息服務(wù)端界面n 圖4.5為用戶張三發(fā)送消息的服務(wù)器界面圖4.4 張三發(fā)送消息服務(wù)端界面n 圖4.6為用戶李四發(fā)送消息的客服端界面圖4.6李四發(fā)送消息的客服端界面n 圖4.7為用戶張三發(fā)送消息的客服端界面圖4.7張三發(fā)送消息的客服端界面5核心代碼5.1服務(wù)端(1).啟動監(jiān)聽UpdateData(TRUE);/更新數(shù)據(jù)到類成員GetDlgItem(IDC_BTNSTART)->EnableWindow(FALSE);GetDlgItem(IDC_BTNSEND)->EnableWindow(TRUE);g_ServerSocket=socket(AF_INET,SOCK_STREAM

13、,0); /創(chuàng)建套接字if( INVALID_SOCKET = g_ServerSocket)MessageBox("創(chuàng)建套接字失?。?quot;);return ;SOCKADDR_IN svraddrsock;svraddrsock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);svraddrsock.sin_family=AF_INET;svraddrsock.sin_port=htons(m_port);if ( SOCKET_ERROR = bind(g_ServerSocket,(SOCKADDR*)&svraddrsock,siz

14、eof(SOCKADDR)MessageBox("套接字綁定失敗!");return ;listen(g_ServerSocket,10);/監(jiān)聽套接字/創(chuàng)建接收線程m_hAcceptthread=CreateThread(NULL,0,AcceptThread,NULL,0,NULL);if (m_hAcceptthread =NULL)MessageBox("創(chuàng)建接收連接線程失??!");return ;g_hmutex=CreateMutex(NULL,FALSE,NULL); /創(chuàng)建互斥量(2).監(jiān)聽請求連接線程/接收連接DWORD WINAPI

15、AcceptThread( LPVOID lpParameter)SOCKADDR_IN serveraddr;int addrlen=sizeof(SOCKADDR);SOCKET RecvSocket;/recv后返回的套接字RecvSocket=accept(g_ServerSocket,(SOCKADDR *)&serveraddr,&addrlen);g_ClientSocket = RecvSocket;if ( INVALID_SOCKET=RecvSocket)AfxMessageBox("接受連接失?。?quot;);return FALSE;BOO

16、L ContinueFlag=TRUE;while (ContinueFlag&&TRUE)g_Mutex.Lock();BYTE recvBuffRECV_DATA_SIZE + 2=0;int recvlength=sizeof(recvBuff);int recvedSize = 0;recvedSize = recv(RecvSocket,(char*)recvBuff,recvlength,0);if(SOCKET_ERROR = recvedSize)int x=WSAGetLastError();CString str;/WSANOTINITIALISEDstr.

17、Format("錯(cuò)誤代碼:%d", x);AfxMessageBox(str);break ;CStringArray RecvData;UINT CmdFlag;CChatRoomServerDlg:Split(char*)recvBuff,'|',RecvData); /將收到的數(shù)據(jù)進(jìn)行分離if (RecvData.GetSize()<=0)continue ;CmdFlag=atoi(RecvData.GetAt(0).GetBuffer(RecvData.GetAt(0).GetLength();int i=0; /記錄循環(huán)次數(shù)的變量BOOL

18、comeFlag=TRUE ;/是否加入用戶列表的標(biāo)記CTime iotime;CString StrRecord="" /聊天內(nèi)容CString strTemp=""CString strTemp1=""char sendBuff1024=0;int j=0;CChatRoomServerDlg *ServerDlg=(CChatRoomServerDlg *)AfxGetApp()->GetMainWnd();/解析客服端發(fā)來的消息以便確定消息的類型switch(CmdFlag)case CONNECT: /用戶發(fā)來的連接請

19、求/對用戶發(fā)來的用戶名和密碼進(jìn)行判斷strTemp = CString(RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();ZeroMemory(sendBuff,1024);/將JOIN命令和用戶名填入緩沖區(qū) sprintf(sendBuff,"5|%s|",RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();for( i=0;i<count;i+) /向除自己以外的所有在線用戶發(fā)送一條加入消息/SOCKET tempsocket = (U

20、serInfo *)UserList.GetAt(j)->UserSocket;if (RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength() != Useri.UserName)if(SOCKET_ERROR = send(Useri.UserSocket,sendBuff,strlen(sendBuff),0)AfxMessageBox("connect 中向各用戶發(fā)送消息失??!");break;/向該用戶發(fā)送一條LIST消息使其將所有在線用戶加入用戶列表ZeroMemory(sendBuff,1024)

21、;strTemp="3|"for(i=0;i<count;i+)if (RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength() != Useri.UserName)strTemp+=Useri.UserName;strTemp+="|"sprintf(sendBuff,"%s",strTemp);if(count>0)if(SOCKET_ERROR =send(RecvSocket,sendBuff,strlen(sendBuff),0)AfxMessageBox

22、("connect中發(fā)送List數(shù)據(jù)失??!");break ;/將該用戶加入用戶列表for(i=0;i<count;i+)if (RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength() = Useri.UserName)comeFlag=FALSE;if (comeFlag)Usercount.UserName=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();Usercount.UserSocket=RecvSocket;count+;/將用

23、戶登陸成功發(fā)送給用戶ZeroMemory(sendBuff,1024);sprintf(sendBuff,"1|%s|",RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();if( SOCKET_ERROR =send(RecvSocket,sendBuff,strlen(sendBuff),0)AfxMessageBox("CONNECT中向客戶端發(fā)送登陸成功消息失?。?quot;);break ;/在服務(wù)器上加入用戶信息ServerDlg->AddToUserList(RecvData.Ge

24、tAt(1).GetBuffer(RecvData.GetAt(1).GetLength();/將用戶加入用戶列表strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();iotime=CTime:GetCurrentTime();strTemp1=iotime.Format(" 于:%Y年%m月%d日 %H:%M:%S登錄");strTemp+=strTemp1;strTemp1="服務(wù)器"ServerDlg->SetChatRecord(strTemp1,strTemp)

25、;break;case CHAT: /群聊ZeroMemory(sendBuff,1024);/向所有其他在線的用戶轉(zhuǎn)發(fā)收到的消息sprintf(sendBuff,"2|%s|%s|",RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength(),RecvData.GetAt(2).GetBuffer(RecvData.GetAt(2).GetLength();for( i=0;i<count;i+)if (RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLengt

26、h() != Useri.UserName)send(Useri.UserSocket,sendBuff,strlen(sendBuff),0);/ 將收到的消息顯示在服務(wù)器消息記錄框中ServerDlg->SetChatRecord(RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength(), RecvData.GetAt(2).GetBuffer(RecvData.GetAt(2).GetLength();break;case EXIT:for(i=0;i<count;i+) /刪除用戶在UserList中的信息if(Re

27、cvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()=Useri.UserName)/UserList.RemoveAt(i);for(j=i;j<count;j+)Userj.UserName=Userj+1.UserName;Userj.UserSocket=Userj+1.UserSocket;/把退出的用戶從服務(wù)器用戶列表中刪除,同時(shí)向聊天記錄中更新一條退出的消息strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();ServerDlg->D

28、eleteFromUserList(strTemp);/將用戶從服務(wù)器“用戶列表”中刪除iotime=CTime:GetCurrentTime();strTemp1=iotime.Format(" 于:%Y年%m月%d日 %H:%M:%S下線");strTemp+=strTemp1;strTemp1="服務(wù)器"ServerDlg->SetChatRecord(strTemp1,strTemp);/向其他用戶發(fā)送QUit消息ZeroMemory(sendBuff,1024)sprintf(sendBuff,"6|%s|",Recv

29、Data.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();for( i=0;i<count;i+)if (RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength() != Useri.UserName)send(Useri.UserSocket,sendBuff,strlen(sendBuff),0);ContinueFlag=FALSE;break;default :strTemp="無法識別的指令!"strTemp1="服務(wù)器"Server

30、Dlg->SetChatRecord(strTemp1,strTemp);break;RecvData.RemoveAll();g_Mutex.Unlock();Sleep(10);return TRUE;5.2客服端(1).建立連接UpdateData(TRUE);if (m_username.IsEmpty()|m_pwd.IsEmpty()MessageBox("用戶名或密碼不能為空!");return ;g_ClientSocket=socket(AF_INET,SOCK_STREAM,0); /創(chuàng)建套接字if( INVALID_SOCKET = g_Clie

31、ntSocket)MessageBox("創(chuàng)建套接字失敗!");return ;DWORD dwIP;(CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS1)->GetAddress(dwIP);SOCKADDR_IN clientaddr;clientaddr.sin_family=AF_INET;clientaddr.sin_port=htons(m_port);clientaddr.sin_addr.S_un.S_addr=htonl(dwIP);if ( SOCKET_ERROR =connect(g_ClientSocket,

32、(SOCKADDR *)&clientaddr,sizeof(SOCKADDR)MessageBox("連接服務(wù)器失敗!");return ;char sendBuff1024=0;sprintf(sendBuff,"1|%s|%s|",m_username.GetBuffer(m_username.GetLength(),m_pwd.GetBuffer(m_pwd.GetLength();int sendlength=strlen(sendBuff); if ( SOCKET_ERROR = send(g_ClientSocket,sendBu

33、ff,sendlength,0) /連接成功后將用戶名和密碼發(fā)給服務(wù)器MessageBox("發(fā)送連接請求數(shù)據(jù)失??!");return ;hRecvThread=CreateThread(NULL,0,RecvThread,NULL,0,NULL); /創(chuàng)建客戶端接收數(shù)據(jù)線程GetDlgItem(IDC_BTNSEND)->EnableWindow(TRUE);GetDlgItem(IDC_USERLOAD)->EnableWindow(FALSE);(2).接受數(shù)據(jù)線程DWORD WINAPI RecvThread(LPVOID lpParameter) wh

34、ile (TRUE) g_Mutex.Lock();BYTE recvBuffRECV_DATA_SIZE + 2=0;int bufflength=sizeof(recvBuff);int recvedSize = 0;/Sleep(100);recvedSize = recv(g_ClientSocket,(char*)recvBuff,bufflength,0);if ( SOCKET_ERROR = recvedSize)AfxMessageBox("接收數(shù)據(jù)失??!");break ;CStringArray RecvData;CChatRoomClientDlg:

35、Split(char*)recvBuff,'|',RecvData); /此函數(shù)不會分解AUDIO命令,直接交個(gè)case處理if (RecvData.GetSize()<=0) continue ;UINT CmdFlag=atoi(RecvData.GetAt(0).GetBuffer(RecvData.GetAt(0).GetLength();int i=0; /循環(huán)時(shí)使用的增加量CString strRecord=""CString strTemp=""CChatRoomClientDlg *ClientDlg=(CChatR

36、oomClientDlg *)AfxGetApp()->GetMainWnd();switch( CmdFlag)case OK:strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();strRecord="登陸成功"ClientDlg->SetChatRecord(strTemp,strRecord);break;case CHAT: /群聊strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();strReco

37、rd=RecvData.GetAt(2).GetBuffer(RecvData.GetAt(2).GetLength();ClientDlg->SetChatRecord(strTemp,strRecord);breakcase LIST: for(i=1;i<RecvData.GetSize();i+)strTemp=RecvData.GetAt(i).GetBuffer(RecvData.GetAt(i).GetLength();ClientDlg->AddToUserList(strTemp);break;case PRIVATE:strTemp=RecvData.Ge

38、tAt(1).GetBuffer(RecvData.GetAt(1).GetLength();strTemp+="悄悄地對你"strRecord=RecvData.GetAt(2).GetBuffer(RecvData.GetAt(2).GetLength();ClientDlg->SetChatRecord(strTemp,strRecord);break;case JOIN :strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();ClientDlg->AddToUserList(strTemp);break;case QUIT:strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength();ClientDl

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論