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

正文內(nèi)容

vc++網(wǎng)絡(luò)聊天軟件_課程設(shè)計(jì)-文庫吧

2025-06-16 08:22 本頁面


【正文】 是服務(wù) 端 套接字,則調(diào)用 CAsyncSocket∷ Listen()開始監(jiān)聽來自客戶 端 的連接請(qǐng)求,收到連接請(qǐng)求后,調(diào)用 CAsyncSocket∷ Accept()函數(shù)接受請(qǐng)求,建立連接。請(qǐng)注意 Accept()成員函數(shù)需要一個(gè)新的并且為空 9 的 CSocket 對(duì)象作為它的參數(shù) 。 ④ 重載 CSocket 類的部分函數(shù) 。 客戶端需要重載 OnReceive(int i) 和 OnClose(int i);服務(wù)器端需要重載 OnAccept(int i) 、 OnClose(int i) 和 OnReceive(int i); ⑤ 調(diào)用 Send()的方法來發(fā)送數(shù)據(jù),調(diào)用 Receive()的方法來接受數(shù)據(jù)。 ⑥ 調(diào)用 Close()方法來關(guān)閉套接字以終止通信。 ⑦ 通訊完畢后,銷毀 CSocket 對(duì)象。 方案比較與選擇 系統(tǒng)分析與設(shè)計(jì) 系統(tǒng)構(gòu)架方式如下圖所示: 設(shè)計(jì)出一個(gè)完整的網(wǎng)絡(luò)聊天程序,使之實(shí)現(xiàn)以上基本要求。 服務(wù)端需要完成的三件事 1) 在特定端口等待連接請(qǐng)求,并需要維護(hù)一個(gè)客戶連接表,已記錄所有成功連接。 2) 及時(shí)接受消息,然后轉(zhuǎn)發(fā)到客 戶連接。 10 3) 監(jiān)控連接狀態(tài),客戶離開或故障時(shí)從列表中刪除相應(yīng)表項(xiàng),并及時(shí)更新連接表。 客戶端需要完成的三件事 1) 建立與維護(hù)服務(wù)器的連接,并隨時(shí)監(jiān)測連接狀態(tài)。 2) 把用戶輸入的信息及時(shí)發(fā)送到服務(wù)端,同時(shí)準(zhǔn)備好接受,并顯示信息。 3) 在用戶退出時(shí)關(guān)閉連接。 程序方案比較: 方案一:基于 TCP的 socket編程 TCP( Transmission Control Protocol,傳輸控制協(xié)議)是基于連接的協(xié)議,也就是說,在正式收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的連接。 服務(wù)器端程序流程如下: 1) 創(chuàng)建套接字( socket); 2) 將套接 字綁定到一個(gè)本地地址和端口上( bind); 3) 將套接字設(shè)為監(jiān)聽模式,準(zhǔn)備接受客戶請(qǐng)求( listen); 4) 等待客戶請(qǐng)求到來;當(dāng)請(qǐng)求到來后,接受連接請(qǐng)求,返回一個(gè)新的對(duì)應(yīng)于此次連接的套接字( accept); 5) 用返回的套接字和客戶端進(jìn)行通信( send/recv); 6) 返回,等待另一客戶請(qǐng)求; 7) 關(guān)閉套接字; 客戶端程序流程如下: 1) 創(chuàng)建套接字( socket); 2) 向服務(wù)器發(fā)出連接請(qǐng)求( connect); 3) 和服務(wù)器端進(jìn)行通信( send/recv); 4) 關(guān)閉套接字。 在服務(wù)器端,當(dāng)調(diào)用 accept 函數(shù)時(shí),程序就會(huì)等待,等待客戶調(diào) 用 connect函數(shù)發(fā)出連接請(qǐng)求,然后服務(wù)器端接受該請(qǐng)求,于是雙方就建立了連接。之后, 11 服務(wù)器端和客戶端就可以利用 send 和 recv 函數(shù)進(jìn)行通信了。因?yàn)榉?wù)器需要接受客戶端的請(qǐng)求,所以必須告訴本地主機(jī)它打算在哪個(gè) IP 地址和哪個(gè)端口上等待客戶要求,因此必須調(diào)用 bind 函數(shù)來實(shí)現(xiàn)這一功能。而對(duì)客戶端來說,當(dāng)它發(fā)起連接請(qǐng)求,服務(wù)器端接受請(qǐng)求后,在服務(wù)端就保存了改客戶端的 IP 地址和端口的信息。這樣,對(duì)服務(wù)器端來說,一旦建立連接之后,實(shí)際上它已經(jīng)保存了客戶端的 IP 地址和端口號(hào)的信息,就可以利用所返回的套接字調(diào)用 send/recv函數(shù)與客戶端進(jìn)行通信。 程序流程圖如下: 方案二:基于 UDP(面向無連接)的 socket程序 UDP( User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與 TCP 相對(duì)應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去 。 UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境 服務(wù)器端也叫接收端,對(duì)于基于 UDP(面向無連接)的套接字編程來說,它的服務(wù)器端和客戶端這種概念不是很強(qiáng)化,我們也可以把服務(wù)器端,即先啟動(dòng)的 12 一端稱為接收端,發(fā)送數(shù)據(jù)的一端稱為發(fā)送端,也稱為 客戶端。 服務(wù)端程序編寫流程如下: 1) 創(chuàng)建套接字( socket); 2) 將套接字綁定到一個(gè)本地地址和端口上( bind); 3) 等待接受數(shù)據(jù)( recvfrom); 4) 關(guān)閉套接字。 雖然面向無連接的 socket 編程無須建立連接,但是為了完成這次通信,對(duì)于接受端來說,它必須先啟動(dòng)以接受客戶端發(fā)送的數(shù)據(jù),因此接收端必須告訴主機(jī)它是在哪個(gè)地址和端口上等待數(shù)據(jù)的到來,接收端(服務(wù)器端)必須調(diào)用 bind函數(shù)將套接字綁定到一個(gè)本地地址和端口上。 客戶端程序編寫流程如下: 1) 創(chuàng)建套接字( socket); 2) 向服務(wù)器發(fā)送數(shù)據(jù)( sengto); 3) 關(guān)閉套接字。 在 UDP 的套接字編程時(shí),利用的是 sendto 和 recvfrom 這兩個(gè)函數(shù)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收,而基于 TCP 的套接字編程時(shí),發(fā)送數(shù)據(jù)是調(diào)用 send 函數(shù),接受數(shù)據(jù)調(diào)用 recv 函數(shù)。 程序流程圖如下: 13 方案比較結(jié)果 TCP 與 UDP 最基本的區(qū)別在于基于連接與無連接,相比之下,第一種方案對(duì)系統(tǒng)的要求以及數(shù)據(jù)量都比較大,但是保證數(shù)據(jù)的正確性與數(shù)據(jù)順序,在傳輸大量數(shù)據(jù)的時(shí)候具有更高的可靠性。至于第二種方案的優(yōu)點(diǎn)在于傳輸?shù)乃俣瓤欤绦蚪Y(jié)構(gòu)精簡。 總的來說,我認(rèn)為 TCP 協(xié)議更能滿足目前各行業(yè)對(duì)遠(yuǎn)程數(shù)據(jù)傳 輸?shù)囊?,它提供更穩(wěn)定更便利的傳輸通道, 滿足了對(duì)安全性的要求以及 遠(yuǎn)程數(shù)據(jù)傳輸?shù)囊蟆? 所以我們小組選擇方案一。 14 我們利用 MFC 提供的 CSocket 類來編程實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)聊天室。那么就需要一個(gè)聊天的服務(wù)器(即是服務(wù)端),它可以和很多客戶端進(jìn)行通信,從而把來自不同的客戶的聊天信息轉(zhuǎn)交到所有其他的客戶端。當(dāng)然也需要用戶界面(客戶端)。這樣就形成了一個(gè)采用Client/Server 結(jié)構(gòu)的并可以多人同時(shí)在線的聊天室。同時(shí),服務(wù)器端應(yīng)該有一定的管理功能 ,如手動(dòng) /自動(dòng)響應(yīng)申請(qǐng)、設(shè)置服務(wù)器名稱和服務(wù)器端口、在線名單統(tǒng)計(jì)、單獨(dú)斷開某人連接以及保持聊天記錄等功能。對(duì)于客戶端,因?yàn)槭敲嫦蛴脩簦酝庥^和功能都應(yīng)有更高的要求。實(shí)現(xiàn)諸如:手動(dòng)輸入 IP 和用戶名、頭像切換、心情書寫、表情輸入、軟件皮膚切換、注銷登錄、保存聊天記錄以及伸縮界面等功能。下面詳細(xì)介紹各項(xiàng)功能是如何實(shí)現(xiàn)的。 聊天程序的實(shí)現(xiàn) 15 ( 1)首先啟動(dòng) Visual C++ ,利用 MFC AppWizard[EXE]建立一個(gè)新的 MFC工程 ,工程名為 chat,在 MFC AppWizard Step1 的時(shí)候選擇 Dialog based 即基于對(duì)話框,在 Step4 時(shí)勾選 Windows Sockets 選項(xiàng)(如 圖表 02),其他默認(rèn)值下一步。 圖表 01 16 圖表 02 ( 2)客戶端的界面如圖 圖表 03所示。其中包含文檔編輯框、按鍵控件、靜態(tài)文本控件組成。左半邊由上自下分別是:頭像、昵稱、當(dāng)天聊天信息顯示、 12個(gè)表情按鈕、消息輸入框和發(fā)送按鈕。右半邊有歷史記錄顯示框、歷史記錄顯示按鈕。 圖表 03 軟件界面 17 圖表 04 控件類型及各自 ID 標(biāo)題 控件類型 控件 ID 昵稱 : Static IDC_STATIC 服務(wù)器 IP: Static IDC_STATIC 端口號(hào)(默認(rèn) 5000): Static IDC_STATIC 頭像 Button IDC_TouXiang 表情 1 Button IDC_BQ1 表情 2 Button IDC_BQ2 表情 3 Button IDC_BQ3 表情 4 Button IDC_BQ4 表情 5 Button IDC_BQ5 表情 6 Button IDC_BQ6 表情 7 Button IDC_BQ7 表情 8 Button IDC_BQ8 表情 9 Button IDC_BQ9 表情 10 Button IDC_BQ10 表情 11 Button IDC_BQ11 表情 12 Button IDC_BQ12 發(fā)送 Button IDC_SEND 連接 Button IDC_CONNECT 建立 Button IDC_SETSERVER 聊天紀(jì)錄 Button IDC_LiaoTianJiLu 聊天信息顯示 Edit IDC_SHOWTEXT 信息輸入 Edit IDC_INPUTTEXT 昵稱輸入 Edit IDC_NAME 服務(wù)器 IP 輸入 Edit IDC_SERVERIP 端口輸入 Edit IDC_PORT 聊天記錄顯示 Edit IDC_ShowHistory 18 聊天程序總共有 6 個(gè)類。其中, CChatApp 和 CAboutDlg 由 AppWizard 實(shí)現(xiàn);另外, CServerSocket 和 CClientSocket 分別負(fù)責(zé)服務(wù)端和客戶端的網(wǎng)絡(luò)通信功能; CChatDlg 為程序的主控類,主界面、通信方式及程序邏輯均由該類實(shí)現(xiàn),它繼承自 CDialog 類; CMessgage 是對(duì)消息的封裝。 CClientSocket 通過相應(yīng)的 OnReceive消息來接收數(shù)據(jù),響應(yīng) OnClose消息來斷開對(duì)話的處理,實(shí)現(xiàn)以 CArchive 對(duì)數(shù)據(jù)進(jìn)行的串行化。 類定義代碼如下: include //命令目標(biāo) class CChatDlg。 class CClientSocket:public CSocket { public: CArchive *m_aSessionIn。 CArchive *m_aSessionOut。 CSocketFile *m_sfSocketFile。 CChatDlg *m_dlg。 bool m_bInit。 //是否進(jìn)行了初始化 bool m_bClose。 //連接是否關(guān)閉 public: void Init(CChatDlg *dlg)。 BOOL SendMessage(CMessg *msg)。 void CloseSocket()。 public: static int GetLocalHostName(CString amp。sHostName)。 //獲得本地計(jì) 19 算機(jī)名稱 static int GetIpAddress(const CString amp。sHostName, CString amp。sIpAddress)。 //獲得本 地 IP static int GetIpAddress(const CString amp。sHostName,BYTE amp。f0, BYTE amp。f1,BYTE amp。f2,BYTE amp。f3)。 //獲得本地 IP static CString ErrorReason(int tag)。 public: virtual void OnReceive(int nErrorCode)。 virtual void OnClose(int nErrorCode)。 public: CClientSocket()。 virtual ~CClientSocket()。 protected: }。 中的代碼: include include include include // CClientSocket CClientSocket::CClientSocket() { m_aSessionIn=NULL。 m_aSessionOut=NULL。 m_sfSocketFile=NULL。 m_bInit=false。 20 m_bClose=false。 } CClientSocket::~CClientSocket() { if(m_aSessionIn) delete m_aSessionIn。 if(m_aSessionOut) delete m_aSessionOut。 if(m_sfSocketFile) delete m_sfSocketFile。 } //ClientSocket 成員函數(shù) void CClientSocket::OnReceive(int nErrorCode) { CSocket::OnReceive(nErrorCode)。 //OnReceive()函數(shù)的實(shí)現(xiàn) do {
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1