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

正文內容

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

2025-01-08 17:57 本頁面
 

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