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

正文內(nèi)容

畢業(yè)設(shè)計(jì)論文--基于vc的局域網(wǎng)聊天室(編輯修改稿)

2025-01-08 17:57 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文) 10 系統(tǒng) 工作流程 圖 4 系統(tǒng)總工作流程圖 首先 啟動(dòng)聊天室的服務(wù)端,設(shè)置端口,打開(kāi)監(jiān)聽(tīng)。然后啟動(dòng)客戶端(可啟動(dòng)多個(gè)),設(shè)置用戶昵稱和連接端口等信息,連接服務(wù)器。進(jìn)入聊天室后用戶之間可以進(jìn)行簡(jiǎn)單的文字聊天。當(dāng)用戶發(fā)送信息后,服務(wù)器會(huì)收到用戶發(fā)送的信息,然后服務(wù)器把收到的信息發(fā)送給所有在線用戶。這樣登入服務(wù)器的用戶們之間就可以進(jìn)行簡(jiǎn)單的文字聊天了。當(dāng)用戶進(jìn)入聊天室后,服務(wù)器會(huì)發(fā)送相應(yīng)的消息通知該用戶進(jìn)入了聊天室。當(dāng)用戶斷開(kāi)連接后,服務(wù)器也會(huì)通知該用戶 下線。整個(gè)聊天室基于 CSocket 的流式連接放大。基于 TCP 傳送控結(jié)束 啟動(dòng)服務(wù)器 判斷啟動(dòng) 啟動(dòng)客戶端 判斷連接 登入聊天室 退出聊天室 退出服務(wù)器 開(kāi)始 否 否 是 是 武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文) 11 制協(xié)議。該協(xié)議所要求用戶必須先確定連接成功后才能發(fā)送消息,如果是 UDP 協(xié)議那可以不進(jìn)行連接過(guò)程,這樣實(shí)時(shí)性比較好 [11]。 界面設(shè)計(jì) 圖 5 界面 資源圖 在設(shè)計(jì)的過(guò)程中,當(dāng)掌握了核心思想內(nèi)容,成功完成功能實(shí)現(xiàn)后,界面設(shè)計(jì)永遠(yuǎn)是重要的部分。一個(gè)好的界面會(huì)讓使用者方便操控,會(huì)讓功能直觀的實(shí)現(xiàn),也會(huì)給人們良好的視覺(jué)沖擊。 上圖為該局域網(wǎng)聊天室的服務(wù)器界面資源圖。對(duì)于基本內(nèi)容發(fā)送及接受消息,設(shè)計(jì)都以比較突出的方式顯示,并且占據(jù)大部分界面。上 半部為服務(wù)器名稱設(shè)置,監(jiān)聽(tīng)端口的設(shè)置。右邊部分為一些其它內(nèi)容設(shè)置 [12]。 武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文) 12 5 局域網(wǎng)聊天室的 實(shí)現(xiàn) 準(zhǔn)備工作 圖 6 設(shè)置 MFC 向?qū)D 該聊天室是基于 MFC 的 CSocket 編程,首先建立正確的 MFC AppWizard(exe)程序后,進(jìn)行 MFC 程序向?qū)У脑O(shè)置中要記得勾選 Windows Socket 這項(xiàng)。這樣編譯器會(huì)自動(dòng)的加載有關(guān) Socket的相關(guān)動(dòng)態(tài)連接庫(kù)和靜態(tài)庫(kù)及相應(yīng)的頭文件到程序中。如果沒(méi)有勾選也沒(méi)關(guān)系,只要在編程過(guò)程中正確加入相應(yīng)內(nèi)容即可!正確的向?qū)гO(shè)置會(huì)給你省去很多工作 [13]! 在開(kāi) 始程序之前先得創(chuàng)建一個(gè)派生于 CAsyncSocket 的類,當(dāng)然也可以直接派生于CSocket。 CAsyncSocket 類中封裝了一些有關(guān)套接字之間消息傳遞的函數(shù)。當(dāng)有相關(guān)消息到來(lái)時(shí),應(yīng)用框架會(huì)自動(dòng)調(diào)用這些函數(shù),從而可以比較方便的實(shí)現(xiàn)套接字之間的信息傳輸。代碼如下: class csocket:public CSocket { public: 注意勾選這項(xiàng)了! 武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文) 13 void OnReceive(int i){ dlgonrev(mynum)。 }。 void OnAccept(int i){ dlgonac()。 }。 void OnClose(int i){ dlgoncl()。 }。 void setp(CTcpseverDlg * severdlg,int num){ mynum=num。 dlg=severdlg。 }。 private: CTcpseverDlg *dlg。 int mynum。 }。 在上面的代碼中,只解釋一個(gè)封裝于 CAsyncSocket 中的函數(shù)。 OnReceive()函數(shù)在 MSDN中的聲明是這樣的: virtual void OnReceive( int nErrorCode )。 該函數(shù)定義為虛函數(shù),這樣才可以在派生的新類 csocket 中重新定義,根據(jù)多態(tài)性原理可以當(dāng)應(yīng)用程序框架收到消息后會(huì)調(diào)用定義的這個(gè) OnReceive 函數(shù)。在函數(shù)的實(shí)現(xiàn)中 加入了自己的代碼: dlgonrev(mynum)。該代碼意為用對(duì)象 dlg 調(diào)用函數(shù) onrev(), onrev()在類 CTcpseverDlg 中做了聲明和定義, 后續(xù)會(huì) 去分析這個(gè)函數(shù)。在類 csocket 中直接用到了CTcpseverDlg 類的對(duì)象。這樣在派生 csocket 類之前一定要對(duì) CTcpseverDlg 類做一個(gè)申明?;蛘甙杨?csocket 類的聲明放在類 CTcpseverDlg 之后。 當(dāng)服務(wù)器收到網(wǎng)絡(luò)發(fā)送的消息后,框架自動(dòng)調(diào)用函數(shù) OnReceive(),這樣就執(zhí)行了代碼dlgonrev(mynum)?,F(xiàn)在來(lái) 分析 onrev()在類 CTcpseverDlg 中的定義。 void CTcpseverDlg::onrev(int mynum) { CString str,str1。int i。 char ss[100]。 武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文) 14 for(int j=0。j100。j++) ss[j]=39。\039。 csrev[mynum].Receive(ss,100)。 (%s,ss)。 for(i=1。i=csnum。i++) if(csrev[i]) csrev[i].Send(str,100)。 GetDlgItemText(IDC_EDIT1,str1)。 str=str1+\r\n+str。 SetDlgItemText(IDC_EDIT1,str)。 CEdit *ce=((CEdit*)GetDlgItem(IDC_EDIT1))。 ceLineScroll(ceGetLineCount()1)。 } 從定義中可以看出,函數(shù)實(shí)現(xiàn)的功能是把收到的信息(某客戶端發(fā)送的)發(fā)送到連接到這個(gè)聊天室的所有用戶。并且在發(fā) 送完成后把信息打印到自己的屏幕上。并設(shè)置正確的滾動(dòng)條信息。這樣 就完成了接收并轉(zhuǎn)發(fā)消息的功能。 下面的 OnAccept 和 OnClose 函數(shù)都是框架自動(dòng)調(diào)用的,分別在建立連接和斷開(kāi)連接后觸發(fā)調(diào)用。在這些消息調(diào)用中只要正確的加入自己的信息就可以處理好各種事件。 函數(shù) setp()起到了一個(gè)指針保護(hù)作用。 在類 CTcpseverApp 的初始化函數(shù)中對(duì)套接字做了一個(gè)初始化工作,使工程正確的得到 WinSock 的信息。 部分代碼如下: if (!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED)。 return FALSE。 } AfxSocketInit()函數(shù)如果初始化成功則返回非零,否者返回零。這樣可知如果初始化失敗則會(huì)調(diào)用函數(shù) AfxMessageBox 彈出錯(cuò)誤信息。 在類 CTcpseverDlg 的初始化函數(shù)中 也做了一些事情,看代碼: BOOL CTcpseverDlg::OnInitDialog() { CWnd* wnd。 CString str。 wnd=GetDlgItem(IDC_MARKST)。 wndGetWindowText(str)。 wnd=GetDlgItem(IDC_MARK)。 武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文) 15 wndSetWindowText(str)。 wndShowWindow(SW_HIDE)。 SetDlgItemText(IDC_EDIT3,亡羊哺狼 )。 SetDlgItemText(IDC_EDIT4,1025)。 CBitmap bitmap。 (IDB_BITMAP1)。 (0,SS_BITMAP)。 ((HBITMAP)())。 return TRUE。 // return TRUE unless you set the focus to a control } 代碼中又涉及到了虛函數(shù)多態(tài)性,實(shí)現(xiàn)了動(dòng)態(tài)聯(lián)編。先定義了個(gè) CWnd 的指針。 CWnd封裝了函數(shù) GetDlgItem(),這樣對(duì)于其派生的比如編輯框類,靜態(tài)文本類,按鈕類等都繼承了此函數(shù)。這樣只需 在最前面定義一個(gè) CWnd 的指針就可以動(dòng)態(tài)的獲取相應(yīng)消息。 這些代碼首先對(duì)窗口進(jìn)行了一些文本設(shè)置和某些窗口的隱藏。還設(shè)置了服務(wù)器的昵稱為 亡羊哺狼 ,默認(rèn)監(jiān)聽(tīng)端口號(hào) 。 功能 實(shí)現(xiàn) 圖 7 服務(wù)器啟動(dòng)界面圖 運(yùn)行 VC,打開(kāi)服務(wù)端時(shí)啟動(dòng)界面如上。首先服務(wù)器有一個(gè)默認(rèn)設(shè)置,服務(wù)器名稱默武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文) 16 認(rèn)值為“亡羊哺狼”,默認(rèn)端口號(hào)是 ,在 32 位機(jī)器上端口號(hào)有 65536 個(gè)。但是 01023 被系統(tǒng)占用了, 只能設(shè)置從 102465535 中的號(hào)碼。當(dāng)點(diǎn)擊開(kāi)始監(jiān)聽(tīng)后,服務(wù)器設(shè)置 中的按鈕都會(huì)變成灰色,不可點(diǎn)擊了,這樣在整個(gè)監(jiān)聽(tīng)過(guò)程中維護(hù)了信息的安全性。 聊天區(qū)右上角有個(gè)“清空”按鈕,初始狀態(tài)是灰色的,不可點(diǎn)擊。當(dāng)聊天區(qū)有信息記錄后會(huì)變成可點(diǎn)擊按鈕。當(dāng)點(diǎn)擊清空后會(huì)清空聊天區(qū)的信息記錄。監(jiān)聽(tīng)成功,用戶登入,聊天內(nèi)容,用戶退出等信息都會(huì)記錄在聊天區(qū)中,方便閱讀。 在監(jiān)聽(tīng)端口過(guò)程中可能發(fā)生端口被占用的錯(cuò)誤信息,這樣就得重新設(shè)置端口了。當(dāng)然從 102565535 之間的端口不可能被全部占用。下面貼出部分實(shí)現(xiàn)代碼: void CTcpseverDlg::Onsend() { CString str,history。 GetDlgItemText(IDC_EDIT1,history)。 GetDlgItemText(IDC_EDIT2,str)。 str=severname+:+str。 int len=()。 for(int i=1。i=csnum。i++) { if(csrev[i]) { if( sended=csrev[i].Send(str,len)) { SetDlgItemText(IDC_EDIT2,)。 SetDlgItemText(IDC_EDIT1,history+\r\n+str)。 CEdit *ce=((CEdit*)GetDlgItem(IDC_EDIT1))。 ceLineScroll(ceGetLineCount()1)。 } } } } 這是點(diǎn)擊控件“發(fā)送”的消息響應(yīng)函數(shù)。函數(shù)先把以前聊天區(qū)的內(nèi)容存儲(chǔ)下來(lái),再把其要發(fā)送的內(nèi)和以前的內(nèi)容都打印到屏幕上。做完這些工作向各個(gè)登入用戶發(fā)送信息。 武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文) 17 圖 8 用戶登入后聊天圖 void CTcpseverDlg::Onlisten() { CString ipstr,portstr。 int port。 GetDlgItemText(IDC_EDIT3,ipstr)。 severname=ipstr。 GetDlgItemText(IDC_EDIT4,portstr)。 ()。 ()。 port=atoi(portstr)。 if(port1024amp。amp。port65536){ SetDlgItemText(IDC_listen,正在監(jiān)聽(tīng) ……)。 if((port)){ ()。 (this,csnum)。 ()。 CWnd *cw=GetDlgItem(IDC_EDIT3)。 cwEnableWindow(false)。 發(fā)送的聊天記錄 灰色了 可清空了 武漢理工大學(xué)畢業(yè)設(shè)計(jì)(論文) 18 cw=GetDlgItem(IDC_EDIT4)。 cwEnableWindow(false)。 cw=GetDlgItem(IDC_listen)。 cwEnableWindow(false)。 cw=GetDlgItem(IDC_EDIT1)。 cwSetWindowText(本服務(wù)器名稱為 : +severname+\r\n 正在后臺(tái)等待用戶連接 ,監(jiān)聽(tīng)端口 :+portstr+……) 。 } else{ MessageBox(綁定監(jiān)聽(tīng)端口失敗 ,請(qǐng)確認(rèn)該端口沒(méi)有被其它程序占用 )。 ()。 } CString strServ,strPort。 CWnd* wnd。 wnd=GetDlgItem(IDC_EDIT3)。 wndGetWindowText(strServ)。 wnd=GetDlgItem(IDC_EDIT4)。 wndGetWindowText(strPort)。 wnd=GetDlgItem(IDC_SERVINFORM)。 wndSetWindowText(\n****************服務(wù)器名稱: \n+strServ+\n\n 端口號(hào) : +strPort+\n\n 協(xié)議類型: TCP\n 傳輸控制協(xié)議 \n****************)。 } else{ MessageBox(端口輸入有誤 ,請(qǐng)重新輸入 )。 } } 前面一部分代碼捕捉了端口號(hào),但是端口號(hào)是以字符串的形式處理的,而不是數(shù)字。函數(shù) TrimLeft 和 TrimRight 分別意為裁掉該端口字符串的左 邊空格和右邊空格。這樣防止了用戶某些習(xí)慣性輸入
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1