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

正文內(nèi)容

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

2025-06-27 18:49本頁面
  

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