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

正文內(nèi)容

基于socket的聊天程序設(shè)計(jì)(編輯修改稿)

2024-12-13 21:40 本頁面
 

【文章內(nèi)容簡介】 Header 函數(shù)開設(shè)錄音緩沖區(qū)。 9 waveInAddBuffer 函數(shù)實(shí)現(xiàn)錄音。(音頻的捕捉和播放相反) 遠(yuǎn)程控制模塊分析 圖 332 遠(yuǎn)控模塊方案 遠(yuǎn)控端的分析: 遠(yuǎn)程監(jiān)控的程序設(shè)計(jì)通過 Socket 和應(yīng)用消息機(jī)制來監(jiān)控客戶端與被監(jiān)控端得數(shù)據(jù)交換,從而達(dá)到監(jiān)控與被監(jiān)控的目的。 這樣我們就需要 2 個(gè)獨(dú)立的 程序:客戶端 Client 和服務(wù)端 Server。 服務(wù)端的模塊設(shè)計(jì): 網(wǎng)絡(luò)模塊 負(fù)責(zé)監(jiān)聽客 戶端的 connect,接收客戶端發(fā)來的消息,包括鍵盤、鼠標(biāo)等動(dòng)作,本 PC對(duì)這些消息進(jìn)行處理,做出動(dòng)作后發(fā)送到客戶端。 編碼、解碼:如果要對(duì)得到的圖像進(jìn)行處理,則需要對(duì)數(shù)據(jù)進(jìn)行編碼解碼處理,本程序采用霍夫曼壓縮 。 主框架:負(fù)責(zé)對(duì) Server 端得消息窗口處理和映射。 客戶端的設(shè)計(jì): 網(wǎng)絡(luò)部分:負(fù)責(zé)監(jiān)聽服務(wù)端的 Socket,對(duì)向服務(wù)端發(fā)來的數(shù)據(jù)進(jìn)行處理 ,對(duì)發(fā)來的數(shù)據(jù)進(jìn)行解壓 。 編碼、解碼:對(duì)數(shù)據(jù)進(jìn)行解壓,多數(shù)采用霍夫曼來對(duì)數(shù)據(jù)進(jìn)行解壓 。 主框架:負(fù)責(zé)客戶端窗口的消息機(jī)制處理 。 10 第四章 關(guān)鍵技術(shù)與算法 服務(wù) 端主體類 主體服務(wù)端的函數(shù) CServerDlg:創(chuàng)建服務(wù)器主窗口,管理用戶信息,用戶在線狀態(tài)等 CListenSocket:用于監(jiān)聽客戶端端口 CChatPacket:數(shù)據(jù)包類 CCuserInfo:用戶信息類 CServerApp:應(yīng)用程序?qū)嵗? CArchive 和 CSocketFile 為 MFC 類,與 CClientSocket 類一起實(shí)現(xiàn)數(shù)據(jù)的發(fā)送與接受。 這些 類 都是為啟動(dòng) 服務(wù)端 服務(wù)而創(chuàng)建的,其中啟動(dòng)服務(wù) 中的InitInstance()函數(shù)定義了啟動(dòng)方式,用 Creat 方式創(chuàng)建了套接字和綁定了套接字,最后在 Listen 函數(shù)中監(jiān)聽。如果在異步中創(chuàng)建套接字,則使用 CAsyncSocket類。當(dāng)一切準(zhǔn)備工作建立完成后,數(shù)據(jù)就應(yīng)該被傳送和接收,其中用到了OnReceive, OnSend,OnAccept,OnConnect,OnClose。這樣就完成了服務(wù)端的建立,并啟動(dòng)了監(jiān)聽。 具體算法 在創(chuàng)建一個(gè) socket 時(shí),可以把他設(shè)置為阻塞,也可以設(shè)置為異步。在缺省情況下,都創(chuàng)建為阻塞模式。 要使程序變成非阻塞,則可以使用 WSAAsynSelect函數(shù),這個(gè)函數(shù)的原型為: int WSAAsyncSelect(SOCKET s,HWND hWnd,u_int wMsg,long IEvent)。其中參數(shù) 1 指定了要操作的 socket 句柄;參數(shù) 2 使用了窗口句柄,則最重要的是指定一個(gè)網(wǎng)絡(luò)事件。 IEvent 下的主要參數(shù)類型 FD_READ 期望在套接字上收到數(shù)據(jù)(即讀準(zhǔn)備好)時(shí)接到通知 FD_WRITE 期望在套接字上可發(fā)送數(shù)據(jù)(即寫準(zhǔn)備好)時(shí)接到通知 FD_OOB 期望在套接字上有帶外數(shù)據(jù)到達(dá)時(shí)接到通知 FD_ACCEPT 期望在套接字上有外來連接時(shí)接到通知 FD_CONNECT 期望在套接字連接建立完成時(shí)接到通知 FD_CLOSE 期望在套接字關(guān)閉時(shí)接到通知 rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE)。一般這樣建立,就可以完成異步模式了。如果想注銷次次對(duì)話,則把事件置 0就行了。 服務(wù)端創(chuàng)建完套接字后,剩下的就是綁定,監(jiān)聽,連接,關(guān)閉連接,關(guān)閉套接字。 如果采用了 CREATE 算法建立套接字,則采用另一種異步方式,也是建立套接字的主流方式,因?yàn)檫@種方式是面向流的套接字,使傳輸更加圓滑。 Create的函數(shù)原型為: Create( UINT nSocketPort=0, Int nSocketType=SOCK_STREAM, Long Ievent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE, LPCTSTR lpszSocketAddress = NULL)。 這時(shí) Ievent 已經(jīng)有了整個(gè)通信的過程: ? FD_ACCEPT 通知偵聽套接字當(dāng)前有連接請(qǐng)求可以接受 OnAccept(int 11 nErrorCode)。 ? FD_CONNECT 通知請(qǐng)求連接的套接字,連 接要求已被處理 OnConnect(int nErrorCode)。 ? FD_CLOSE 通知套接字與其連接的套接字已關(guān)閉 OnClose(int nErrorCode)。 ? FD_READ 通知有數(shù)據(jù)到達(dá) OnReceive(int nErrorCode)。 ? FD_WRITE 通知可以發(fā)送數(shù)據(jù) OnSend(int nErrorCode)。 ? FD_OOB 通知將有外帶數(shù)據(jù) 到達(dá) OnOutOfBandData(int ErrorCode)。 在 MFC 里建立套接字,其中有個(gè)著名的異步套接字類: CAsyncSocket 與 Winsock 不同, CAsyncSocket 服務(wù)端不用綁定 (Bind),不用連接 (Connect)。 正常情況下,服務(wù)器端必須首先創(chuàng)建一個(gè) CAsyncSocket 套接字對(duì)象,并調(diào)用它的 Create 成員函數(shù)創(chuàng)建底層套接字句柄。這個(gè)套接字對(duì)象專門用來偵聽來自客戶機(jī)的連接請(qǐng)求,所以稱它為偵聽套接字對(duì)象。再調(diào)用偵聽套接字對(duì)象的 。 Listen 函數(shù),使偵聽套接字對(duì)象開始偵聽來自客戶端的連接請(qǐng)求。 (1) 當(dāng) Listen 函數(shù)確認(rèn)并接納了一個(gè)客戶端連接請(qǐng)求后,觸發(fā) FD_ACCEPT 事件,偵聽套接字收到通知, MFC 框架自動(dòng)調(diào)用偵聽套接字的 OnAccept 事件處理函數(shù)。一般需要重載 OnAccept 函數(shù),再在其中調(diào)用偵聽套接字對(duì)象的 Accept 函數(shù)。 (2) 創(chuàng)建一個(gè)新的空套接字對(duì)象,專門用來與客戶端連接并進(jìn)行數(shù)據(jù)的傳輸,一般稱為連接套接字,并作為參數(shù)傳遞給下一步的 Accept 成員函數(shù)。(m_sConnectSocket)。 在 本次 擴(kuò)展端 C/S 模式中 均采用這種方式來建立算法。 圖 41 服務(wù)端算法 12 客戶端類 主體客戶端類 CClientDlg:創(chuàng)建客戶端主窗口,接收和發(fā)送消息 CLientLoginDlg:登陸服務(wù)器窗口類 CChatPacket:數(shù)據(jù)包類 CClientApp:應(yīng)用程序?qū)嵗? 關(guān)于客戶端 ,也需要 Init 來實(shí)現(xiàn)客戶端的建立,只不過,這里使用了異步的方式,用到了 TCP 面向連接的監(jiān)聽方式,使用 Connect 進(jìn)行連接。在接收和發(fā)送數(shù)據(jù)上附加了更多的處理, 為了讓消息顯示出來,使用了共有成員函數(shù)ProcessPendingRead(),設(shè)置緩沖區(qū),并定義為 200,然后對(duì)格式進(jìn)行 format,最后在列表框中顯示出來,發(fā)送消息時(shí)用 OnSend()就可以了,這個(gè)之需要一個(gè)響應(yīng)。這樣客戶端就建立起來了,至于擴(kuò)展方式,下面會(huì)有詳細(xì)分析。 具體算法: 創(chuàng)建客戶端套接字算法和服務(wù)端大體相似,不同之處在于 Create 的函數(shù),這里所指定的地址為服務(wù)端的地址: BOOL Create( UINT nSocketPort = 端口號(hào), Int nSocketPort = SOCK_STREAM | SOCK_DGRAM, LPCTSTR lpszSocketAddress = 套接字所用的網(wǎng)絡(luò)地址 ); 客戶端請(qǐng)求連接到服務(wù)器端,在服務(wù)器端套接字對(duì)象已經(jīng)進(jìn)入偵聽狀態(tài)之后,客戶應(yīng)用程序可以調(diào)用 CAsyncSocket 類的 Connect 成員函數(shù),向服務(wù)器發(fā)出一個(gè)連接請(qǐng)求。調(diào)用結(jié)束返回時(shí)發(fā)生 FD_CONNECT 事件, MFC 框架會(huì)自動(dòng)調(diào)用客戶端套接字的 OnConnect 事件處理函數(shù)。 CSocket 類是 CAsyncSocket 的派生類。創(chuàng)建 CSocket 對(duì)象時(shí),首先要調(diào)用 CSocket 類的構(gòu)造函數(shù)創(chuàng)建一個(gè)空的 CSocket 對(duì)象,再調(diào)用其 Create 成員函數(shù),創(chuàng)建對(duì)象的底層套接字。 這里必須對(duì) CSocket 的算法進(jìn)行了解: CSocket 類使用基類 CAsyncSocket 的同名成員函數(shù) Connect、 Listen、 Accept 來建立服務(wù)器和客戶機(jī)套接字之間的連接,使用方法基本相同。在創(chuàng)建 CSocket 類對(duì)象后,對(duì)于流式套接字,首先在服務(wù)器和客戶機(jī)之間建立連 接,然后使用 Send 函數(shù)、 Receive 函數(shù)來發(fā)送和接收數(shù)據(jù)。 需要注意的是, CSocket 對(duì)象從不調(diào)用 OnConnect 和 OnSend 事件處理函數(shù)。CSocket 類繼承了 CAsyncSocket 類的許多成員函數(shù),用法基本一致。 CSocket類的高級(jí)性主要表現(xiàn)在 3個(gè)方面。 (1) CSocket 結(jié)合 CArchive 類來使用套接字。 (2) CSocket 管理了通信的許多方面,比如字節(jié)順序問題和字符串轉(zhuǎn)換問題。 (3) CSocket 類為 Windows 消息的后臺(tái)處理提供了阻塞的工作模式 。有關(guān)阻塞的概念讀者可參閱相關(guān)文獻(xiàn)資料,此處不再贅述。 因此,一般將 CSocket 與 CArchive、 CSocketFile 類相結(jié)合,來發(fā)送和接收數(shù)據(jù),這將使編程更為簡單。 13 圖 42 客戶端算法 14 第五章 程序的實(shí)現(xiàn)及測(cè)試 客戶端 實(shí)現(xiàn) 圖 511 聊天窗口登錄窗口 對(duì)話框類 Login 基于 CDialog 封裝中有 3 個(gè) 觸 發(fā) 函 數(shù) :OnBnClickedOk()。OnBnClickedButton1()。OnEnChangeEdit1()。OnBnClickedOk() 觸發(fā)了登陸按鈕控 件,這個(gè)事件是為了檢查服務(wù)器 IP 是否設(shè)置正確,用戶賬戶是否為空,空則返回 MessageBox 錯(cuò)誤提示。 OnBnClickedButton1() 觸發(fā)了幫助按鈕,此處使用 CreateProcess()函數(shù) 調(diào)用了成都理工大學(xué)主頁,當(dāng)然也可以改成你所需要的幫助頁面。 OnEnChangeEdit1() 觸發(fā)了輸入編輯框,輸入 IP和用戶賬戶。 如果成功登陸則顯示 : 圖 512 聊天系統(tǒng)客戶端主窗口 15 圖 513 雙方進(jìn)行通信的客戶端 1窗口 ? OnInitDialog()函數(shù)進(jìn)行初始化 :主要對(duì)套接字進(jìn) 行綁定,監(jiān)聽,接收和 發(fā)送數(shù)據(jù)的處理。 1) 指定端口,綁定: 指定需要綁定的地址類型: SOCKADDR_IN sin; 字符型服務(wù)器地址 ulAddress=i_addr(); m_name=; 綁定套接字 sockServer=socket(PF_INET,SOCK_STREAM,0); 地址家族 =AF_INET; 把 IP地址保存為一個(gè) 4字節(jié)的數(shù)值 =ulAddress; 指定端口 =htons(9000); 2) 進(jìn)行連接服務(wù)器 Int nConnect=connect(sockServer,(LPSOCKADDR)amp。sin,sizeof(struct sockaddr)); 3) 采用第一種方式建立套接字WSAAsyncSelect(sockServer,m_hWnd,WM_SOCKET_READ,FD_READ); 4) 發(fā)送用戶信息nCharSend=send(sockServer,(char*)amp。myinfo,sizeof
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1