freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于vc的企業(yè)內(nèi)部通信軟件的設(shè)計(jì)與實(shí)現(xiàn)計(jì)算機(jī)優(yōu)秀畢業(yè)論文-資料下載頁(yè)

2025-06-27 18:49本頁(yè)面
  

【正文】 聊天對(duì)話框,如圖45所示。圖45 聊天對(duì)話框聊天對(duì)話框用的Socket是主對(duì)話框的m_pLisSocket,當(dāng)要發(fā)送消息時(shí),調(diào)用主對(duì)話框的SendPreChatMessage()函數(shù),主對(duì)話框接收到聊天消息時(shí)調(diào)用聊天對(duì)話框的ReceiveMessage()函數(shù)。聊天對(duì)話框中定的發(fā)送和接收富文本框變量為:CRichText m_rtReceived。CRichText m_rtSend。發(fā)送消息的主要代碼如下:void CChatDlg::OnSend() { CTime time = CTime::GetCurrentTime()。 CString strTime = ( %H:%M:%S )。 … CString strSend = ()。 /// 發(fā)送聊天消息 m_pMainDlgSendPreChatMessage( m_userChat, strTime, strSend )。}單擊“發(fā)送”按鈕或CTRL+ENTER鍵,程序會(huì)調(diào)用OnSend()函數(shù),首先得到發(fā)送的時(shí)間和發(fā)送的內(nèi)容,得到的是RTF格式的內(nèi)容,因此strSend中還包括了文字的格式和圖片信息。然后調(diào)用主對(duì)話框的SendPreChatMessage()函數(shù)向m_userChat好友發(fā)送聊天消息。接收到的消息主要代碼如下:void CChatDlg::ReceiveMessage( LPCSTR szTime, LPCSTR szMessage ){ CString strText。 ( %s(%s) %s\r\n , , , szTime )。 /// 設(shè)置接收框 ( ().GetLength() )。 ( strText )。 ( szMessage )。 …}因?yàn)榱奶煊玫腟ocket是主對(duì)話框的m_pLisSocket,因此是主對(duì)話框接收到的聊天消息。主對(duì)話框接收到聊天消息后,根據(jù)消息發(fā)送的來(lái)源IP來(lái)處理消息。如果與此IP的聊天窗口打開(kāi)的,就直接調(diào)用ReceiveMessage()把消息放入接收文本框中,如果聊天窗口沒(méi)有打開(kāi),則把消息追加到CMapStringToOb類型的變量m_mapIPToChat中,并在托盤(pán)區(qū)動(dòng)態(tài)顯示用戶的頭像。聊天消息包括文字格式和圖像信息,因此發(fā)送的數(shù)據(jù)可能很大,會(huì)超過(guò)Socket發(fā)送的最大數(shù)據(jù)長(zhǎng)度,這樣如果直接發(fā)送,會(huì)因?yàn)閿?shù)據(jù)長(zhǎng)度過(guò)大,而導(dǎo)致發(fā)送失敗。所以在發(fā)送這種大數(shù)據(jù)量的消息時(shí),本程序采用的分包發(fā)送的方式。上面提到了發(fā)送的最大數(shù)據(jù)長(zhǎng)度,m_pLisSocket是創(chuàng)建的UDP套接字,不像TCP一樣可以發(fā)送隨意大小的數(shù)據(jù),UDP套接字只能發(fā)送小于一定大小的數(shù)據(jù)。UDP可以發(fā)送的最大數(shù)據(jù)量可以由下面的代碼得到:WSADATA wsaData。if (!AfxSocketInit( amp。wsaData )){ AfxMessageBox(IDP_SOCKETS_INIT_FAILED)。 return FALSE。}初始化WinSocket后,WSADATA結(jié)構(gòu)中就有我們需要的信息。主對(duì)話框定義了一變量,在用UDP發(fā)送數(shù)據(jù)的時(shí)候,就可以根據(jù)這個(gè)值的大小來(lái)確定分包的大小。聊天對(duì)話框發(fā)送消息時(shí)調(diào)用主對(duì)話框的SendPreChatMessage()函數(shù),這個(gè)函數(shù)并不是一下子將消息發(fā)送出去,而是將消息保存起來(lái),只發(fā)送一個(gè)通知消息告訴對(duì)方有數(shù)據(jù)需要發(fā)送,這個(gè)通知消息中帶有消息的時(shí)間的消息的長(zhǎng)度。對(duì)方接收到這個(gè)通知消息時(shí),會(huì)根據(jù)接收到的消息長(zhǎng)度分配一個(gè)接收消息的臨時(shí)空間,并把接收到的消息時(shí)間也保存。然后向消息發(fā)送者發(fā)送請(qǐng)求接收第一個(gè)數(shù)據(jù)包的請(qǐng)求。消息發(fā)送者收到請(qǐng)求發(fā)送消息的消息后,會(huì)把相應(yīng)的數(shù)據(jù)包發(fā)送給聊天對(duì)方。對(duì)方接收到消息數(shù)據(jù)包后,把消息放入到接收消息的臨時(shí)空間,并判斷數(shù)據(jù)是否接收完畢。如果沒(méi)有接收完畢,繼續(xù)請(qǐng)求發(fā)送下一個(gè)消息數(shù)據(jù)包。如果接收完畢,播放聲音,并判斷與此IP對(duì)應(yīng)的聊天窗口是否打開(kāi),是則調(diào)用ReceiveMessage()把消息放入到接收消息文本框,否則把消息保存起來(lái),并動(dòng)態(tài)顯示托盤(pán)的圖標(biāo),等待用戶打開(kāi)聊天窗口時(shí)再把消息放到接收文本框。聊天對(duì)話框還有記錄和打開(kāi)聊天記錄的功能。勾選上“關(guān)閉時(shí)保存聊天記錄”,關(guān)閉聊天對(duì)話框會(huì)聊天記錄會(huì)自動(dòng)保存在形如“()”的文件中,文件名由聊天開(kāi)始時(shí)間、IP、昵稱組成。打開(kāi)“聊天記錄”按鈕,可以選擇保存的聊天記錄,在接收文本框內(nèi)會(huì)顯示打開(kāi)選擇的聊天記錄?!×奶焓夷K聊天室模塊設(shè)計(jì)目的是為多人共同聊天提供一個(gè)便捷的環(huán)境,由一人創(chuàng)建聊天室之后,可以將多個(gè)好友加進(jìn)聊天室,使得多個(gè)用戶實(shí)現(xiàn)簡(jiǎn)單的通信需求。聊天室分為服務(wù)器和客戶端,每個(gè)用戶只能創(chuàng)建一個(gè)聊天室,也只能加入一個(gè)聊天室。聊天室也只能發(fā)送普通文本消息,所以聊天室的開(kāi)發(fā)相比聊天來(lái)說(shuō),相對(duì)簡(jiǎn)單,但是設(shè)計(jì)目的與聊天也有所不同。聊天室服務(wù)器如圖46所示。圖46 聊天室服務(wù)器界面服務(wù)器右邊兩個(gè)列表框分別表示在聊天室里的好友、不在聊天室里的好友;客戶端右邊的列表框表示在聊天室中的好友。用戶創(chuàng)建聊天室可以把自己的所有好友都加入到聊天室,這些好友發(fā)的消息可以被所有在聊天室中的好友共享,即使這些好友之間可能并不能互相訪問(wèn)。這也是聊天室的一個(gè)好處。聊天室服務(wù)器和客戶端各使用一個(gè)SOCKET,創(chuàng)建的是UDP套接字,有自己的端口號(hào)。用戶創(chuàng)建聊天室時(shí),創(chuàng)建端口為CHATROOM_SERVER_PORT的UDP套接定,把自己加入到聊天室好友列表里,同時(shí)也把自己添加的所有好友加入到未進(jìn)入聊天室好友列表中。在未進(jìn)入聊天室好友列表中選定要添加進(jìn)入聊天室的好友,單擊向上的按鈕,會(huì)向這些選定好的好友發(fā)送加入聊天室的請(qǐng)求。SendUserCommandToIP( CHATROOM_ADDREQUEST, , DEFAULT_PORT, amp。userSelf )。以上代碼就是向好友user發(fā)送加入聊天室請(qǐng)求,因?yàn)樵诩尤肓奶焓抑?,這些好友并沒(méi)有創(chuàng)建聊天室客戶端SOCKET,所以必須向主對(duì)話框的m_pLisSocket套接字發(fā)送消息,這從DEFAULT_PORT端口號(hào)就可以看出來(lái)。如果好友接受了請(qǐng)求,接受請(qǐng)求的好友就會(huì)從未進(jìn)入聊天室聊表框移到聊天室好友列表框。單擊向下的按鈕,會(huì)刪除聊天室好友列表框中選定的好友,并向他們發(fā)送被踢出聊天室的消息:SendUserCommandToIP( CHATROOM_CLIENT_KICKED, , CHATRO OM_CLIENT_PORT, NULL )。這兒是發(fā)往CHATROOM_CLIENT_PORT端口的消息,因?yàn)閷⒁獎(jiǎng)h除的好友已經(jīng)打開(kāi)了聊天室,而且創(chuàng)建了聊天室客戶端的SOCKET,可以接收發(fā)往這個(gè)端口的消息。當(dāng)聊天室服務(wù)器關(guān)閉時(shí),會(huì)向所有聊天室好友發(fā)送關(guān)閉聊天室的消息:for( int nIndex = 1。 nIndex ()。 nIndex++ ){ USER user = ( nIndex )。 SendUserCommandToIP( CHATROOM_SERVER_CLOSED, , CHATROOM_CLIENT_PORT, NULL )。 }聊天室好友列表里第一個(gè)是自己,不必要給自己發(fā)送消息,因此nIndex是從1開(kāi)始的。當(dāng)創(chuàng)建聊天室的用戶發(fā)送聊天消息時(shí),服務(wù)器將文本消息發(fā)給所有聊天室好友。在服務(wù)器創(chuàng)建的時(shí)候,限制過(guò)發(fā)送文本框的字?jǐn)?shù):( MAXDATAPACKETLENGTH sizeof( DATAPACKET ) sizeof( CHATROOMMESSAGEINFO ) )。因此,發(fā)送的消息長(zhǎng)度不會(huì)超過(guò)UDP可以發(fā)送的數(shù)據(jù)最大值,發(fā)送消息時(shí)直接一次發(fā)送就行:for( int nIndex = 1。 nIndex ()。 nIndex++ ){ USER user = ( nIndex )。SendTextToIP( , CHATROOM_CLIENT_PORT, strSend, )。}聊天室服務(wù)器接收到消息時(shí),會(huì)將接收到的消息加入到聊天室接收文本框,并將消息發(fā)給所有在聊天室中的好友,除了向服務(wù)器發(fā)送消息的好友外:for( int nIndex1 = 1。 nIndex1 ()。 nIndex1++ ){ USER userSend = ( nIndex1 )。 if( 0 == strcmp( , ) ) { continue。 } SendTextToIP( , CHATROOM_CLIENT_PORT, strSend, )。}以上就是服務(wù)器的主要功能??蛻舳说奶幚肀确?wù)器要簡(jiǎn)單一些,客戶端只有在聊天室列表中的好友,客戶端也只向服務(wù)器發(fā)送消息,不用向其他聊天室好友發(fā)送消息。聊天室客戶端如圖47所示。圖47 聊天室客戶界面首先,主對(duì)話框接受到CHATROOM_ADDREQUEST消息,彈出對(duì)話框詢問(wèn)用戶是否進(jìn)入好友創(chuàng)建的聊天室,如果用戶拒絕加入則不用處理此消息,如果用戶同意加入聊天室,那么就彈出聊天室客戶端。在客戶端打開(kāi)的同時(shí),限制發(fā)送文本框的最大字?jǐn)?shù),創(chuàng)建客戶端SOCKET,端口號(hào)為CHATROOM_CLIENT_PORT的UDP。當(dāng)服務(wù)器踢出客戶端,或服務(wù)器關(guān)閉時(shí),彈出對(duì)話框提示用戶,并清空聊天室好友,設(shè)置發(fā)送文本框不可用。客戶端關(guān)閉時(shí),會(huì)向服務(wù)器發(fā)送客戶端關(guān)閉的消息??蛻舳税l(fā)送消息時(shí),先將發(fā)送的消息加入到接收消息文本框,然后將消息發(fā)往服務(wù)器,由服務(wù)器將消息發(fā)到各個(gè)聊天室好友??蛻舳私拥椒?wù)器發(fā)來(lái)的聊天消息時(shí),處理也很簡(jiǎn)單,直接將聊天消息加入到接收消息文本框。以上就是聊天室的設(shè)計(jì)方法。服務(wù)器在當(dāng)中起到了中轉(zhuǎn)的作用,所有消息都經(jīng)過(guò)服務(wù),服務(wù)器向所有好友發(fā)送消息,就算聊天室中的好友不能互相連接,只要能連接到服務(wù)器,他們就可以一起聊天?!魉臀募K傳送文件模塊的設(shè)計(jì)目的是為了方便用戶之間的文件傳送。文件傳送支持?jǐn)帱c(diǎn)續(xù)傳,這是本程序的一個(gè)亮點(diǎn)。文件傳送模塊用到了多線程,可以實(shí)現(xiàn)多個(gè)文件、多個(gè)用戶之間的傳輸。一個(gè)線程負(fù)責(zé)將一個(gè)文件傳送給一個(gè)好友。傳送文件服務(wù)器界面如圖48所示。圖48 傳輸文件界面單擊添加按鈕會(huì)打開(kāi)選擇文件對(duì)話框,選擇好要發(fā)送的文件后,會(huì)彈出一個(gè)好友列表框,要求選擇需要發(fā)送的好友,選擇了好友后,程序會(huì)把發(fā)送文件信息添加到傳輸入文件對(duì)話框中,并向接收者發(fā)起傳送文件的請(qǐng)求,如果接收者拒絕接收文件,在傳輸文件對(duì)話框的相應(yīng)項(xiàng)的速度列就會(huì)顯示“拒絕”,如果接收者接受文件,文件傳送正式開(kāi)始。下面詳細(xì)介紹服務(wù)器端的工作過(guò)程:傳送文件用到的是TCP連接,因?yàn)閭魉臀募仨毐WC傳輸?shù)臄?shù)據(jù)不能丟失也不能有誤。用戶打開(kāi)文件傳輸功能,彈出傳輸文件對(duì)話框,在初始對(duì)話框的時(shí)候,除了初始化傳輸文件列表框,還會(huì)創(chuàng)建一個(gè)端口號(hào)為SENDFILESSERVER_PORT的TCP套按字m_pSFServerSocket,并設(shè)置此套接字為監(jiān)聽(tīng)狀態(tài)。當(dāng)用戶選擇好傳送的文件和傳送的好友后,傳送信息會(huì)加入到列表框,并調(diào)用主對(duì)話框的SendFilesNotify()函數(shù)向這些好友發(fā)送傳送文件的消息,此消息中還包括文件名和文件長(zhǎng)度。如果接收者拒絕接收文件,列表框的相應(yīng)項(xiàng)的速度列會(huì)被設(shè)置為“拒絕”。如果接收者接收文件,接收者會(huì)先向pSFServerSocket發(fā)起連接,程序重載pSFServerSocket的OnAccept()函數(shù),在此函數(shù)中調(diào)用傳輸文件服務(wù)器對(duì)話框的OnAccept()函數(shù):void CSendFilesServerDlg::OnAccept(){ CSendFilesSocket sfSocket。 m_pSFServerSocketAccept( sfSocket )。 CSendFilesServerThread *pSFSThread = ( CSendFilesServerThread * )AfxBeginThread( RUNTIME_CLASS( CSendFilesServerThread ), 0, 0, CREATE_SUSPENDED, NULL )。 pSFSThreadSetSendFilesServerDlg( this )。 pSFSThreadAttachSocket( () )。 pSFSThreadResumeThread()。 ( pSFSThread )。}在此函數(shù)中先定義一個(gè)CSendFilesSocket類型的變量sfSocket,m_pSFServerSocket接收此WinSocket,就與接收都連接起來(lái)了。然后此函數(shù)再創(chuàng)建了一個(gè)線程,并把此線程加入到線程列表中。在線程中也有一個(gè)CSendFilesSocket類型的成員變量,將這兒的sfSocket分離掉套接字句柄,附加到線程中的相同類型的成員變量上。發(fā)送數(shù)據(jù)的功能就由這個(gè)線程來(lái)處理了。在傳輸入文件對(duì)話框中選中某些傳輸信息,單擊“刪除”按鈕,會(huì)彈出刪除提示框詢問(wèn)用戶是否刪除這些傳輸信息,如果用戶確定刪除這些傳輸信息,傳略文件對(duì)話框會(huì)刪除這些傳輸信息,如果文件正在傳輸入,會(huì)關(guān)閉線程,停止傳輸文件。在傳輸文件對(duì)話框中設(shè)置了一個(gè)定時(shí)器,用于刷新列表框。每當(dāng)定時(shí)器時(shí)間到時(shí),程序調(diào)用RefreshListBox()函數(shù)刷新列表框,更新文件傳輸?shù)倪M(jìn)度和速度。如果接受者停止了接收文件或者文件傳輸完成,相應(yīng)的線程也會(huì)調(diào)用RefreshListBox()函數(shù)及時(shí)的刷新列表框。CSendFilesServerThread類用于發(fā)送文件數(shù)據(jù),接收者連接到m_pSFServerSocket后,接收者就可以與CSendFilesServerThread類中的CSendFilesSocket成員變量m_sendFilesSocket通信了。因?yàn)槌绦蛑С謹(jǐn)帱c(diǎn)續(xù)傳,因此接收者首先會(huì)通知CSendFilesServerThread線程要發(fā)送的文件、大小、已經(jīng)發(fā)送的大小,之后線程會(huì)打開(kāi)需傳送的文件,并定位到已
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1