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

正文內(nèi)容

基于vcsocket的多線(xiàn)程網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與設(shè)計(jì)-資料下載頁(yè)

2024-11-10 03:24本頁(yè)面

【導(dǎo)讀】互交流的一種方式,與E-mail、電話(huà)相比,聊天服務(wù)更具有實(shí)時(shí)性和有效性。用了Socket網(wǎng)絡(luò)編程思想和多線(xiàn)程技術(shù)。該聊天軟件包括服務(wù)器端和客戶(hù)端兩。服務(wù)器端模塊主要實(shí)現(xiàn)了服務(wù)器的配置。該軟件采用多線(xiàn)程技術(shù)支持多用戶(hù)操作,并采用相關(guān)技術(shù)進(jìn)行了優(yōu)化,加??炝宋淖趾臀募膫鬟f速度。

  

【正文】 的設(shè)計(jì)階段將會(huì)告一段落。 系統(tǒng)的通信過(guò)程與方式 在基于 Socket 的聊天系統(tǒng)中,主要有兩種角色:服務(wù)器和客戶(hù)端,不同的客戶(hù)端登陸集中式的服務(wù)器,通過(guò)服務(wù)器將一個(gè)客戶(hù)端發(fā)出的信息推送 到其他所有客戶(hù)端。 聊天系統(tǒng)在客戶(hù)端和服務(wù)器之間主要傳送的是文字信息,服務(wù)器端只需要把最近的文字信息推送到客戶(hù)端,這樣減少了網(wǎng)絡(luò)傳輸內(nèi)容,節(jié)省了網(wǎng)絡(luò)傳輸?shù)臅r(shí)間,無(wú)疑提高了聊天速度。這種“推”技術(shù)是目前基于 Socket 聊天系統(tǒng)的主要實(shí)現(xiàn)技術(shù) [12]。 在 基于 Socket 的聊天系統(tǒng) 中, 客戶(hù)端和服務(wù)器必須保持隨時(shí)隨地的連接。這有別于普通 Web 瀏覽的連接方式。在使用瀏覽器訪(fǎng)問(wèn)服務(wù)器時(shí),先由客戶(hù)端發(fā)出 HTTP 協(xié)議 ,然后服務(wù)器響應(yīng)處理這個(gè)客戶(hù)端的響應(yīng),再返回處理結(jié)果;請(qǐng)求( Request)和響應(yīng)( Response)是一種一對(duì)一的前后因果關(guān)系 。 而在基于 Socket的聊天系統(tǒng)中,客戶(hù)端發(fā)出聊天信息的同時(shí),客戶(hù)端也在接受服務(wù)器發(fā)送過(guò)來(lái)的其他人的聊天信息,因此,請(qǐng)求和響應(yīng)不存在那種前后對(duì)應(yīng)關(guān)系,是兩種分別獨(dú)立進(jìn)行的進(jìn)程。因?yàn)榉?wù)器任何時(shí)候都可能發(fā)送信息到客戶(hù)端,因此,客戶(hù)端和服務(wù)器一旦建立連接,必須能讓服務(wù)器在以后發(fā)送中尋找定位到這個(gè)連接 ,這是整個(gè)系統(tǒng)實(shí)現(xiàn)過(guò)程中非常重要的一個(gè)環(huán)節(jié) 在本系統(tǒng)中,信息的交流主要出現(xiàn)在客戶(hù)端與服務(wù) 器端、客戶(hù)端和客戶(hù)端,本系統(tǒng)具體的通信流圖如圖 所示: 基于 VC++ Socket 的多線(xiàn)程網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與設(shè)計(jì) 20 圖 通過(guò)注冊(cè)來(lái)獲得用戶(hù)號(hào)碼。發(fā)送兩條命令:“ REGT\t\n”,再發(fā)送一個(gè)用戶(hù)資料的數(shù)據(jù)結(jié)構(gòu)。注冊(cè)成功服務(wù)器返回一個(gè) id 號(hào)給用戶(hù),否則返回一個(gè)錯(cuò)誤代碼。開(kāi)啟第一個(gè)線(xiàn)程登陸服務(wù)器,端口是 4000。以下 1000 表示 id(即 ) 號(hào),發(fā)送 “ USER 1000” 和 ” PASS password” 命令要求登陸服務(wù)器。如果登陸成功,就發(fā)送 “ LIST \t\n” 命令到服務(wù)器端,取得在線(xiàn)用 戶(hù)的列表,并顯示在列表框內(nèi)。在線(xiàn)列表以結(jié)構(gòu)數(shù)組的形勢(shì)傳送。然后開(kāi)啟第二個(gè)線(xiàn)程創(chuàng)建消息服務(wù)器端,接受各個(gè)客戶(hù)端的連接請(qǐng)求,端口是 4001。如果接收到連接就開(kāi)啟第三個(gè)線(xiàn)程接受對(duì)方的信息。假如我是 1000 這個(gè)用戶(hù),接受到 “ chat 1001\t\n” 指令,說(shuō)明是 1001 這個(gè)用戶(hù)想和我聊天,如果接受他的請(qǐng)求,就發(fā)送確認(rèn)信息,接下來(lái)就可以通信了。如果雙方還要求傳送文件,就開(kāi)啟第 4 個(gè)線(xiàn)程,端口是 4002,只是點(diǎn)對(duì)點(diǎn)的通信,如果 1000 想法送文件給 1001,文件發(fā)送方建立文件服務(wù)器端,然后由消息通訊線(xiàn)路(即上面的 acceptSocket)發(fā)送 “ File \t\n” 命令到對(duì)方消息通訊線(xiàn)路上,讓 1001 連接 1000 的 file 文件服務(wù)器。 1001 連接到1000 的 file 服務(wù)器上后,發(fā)送確認(rèn)命令決定是不是接收文件,如果接收就可以開(kāi)始傳送文件。假定我是 1000 這個(gè)用戶(hù), 1001 已經(jīng)連接到我的機(jī)器,并和我聊天,這時(shí)如果我還想和 1002 聊天,就開(kāi)啟第 5 個(gè)線(xiàn)程發(fā)送 “ chat 1000\t\n” 到 1002的信息服務(wù)器端(端口 4001,每個(gè) msg 客戶(hù)端都有信息服務(wù)器端),如果還想和 1003 聊天,就開(kāi)啟第 6 個(gè)線(xiàn)程發(fā)送命令 “ chat 1000\t\n” 到 1003 的信息服務(wù)器端請(qǐng)求連接,這樣每個(gè)客戶(hù)端都可以實(shí)現(xiàn)多點(diǎn)通訊。 客戶(hù)端與服務(wù)器端 在客戶(hù)端啟動(dòng)后,客戶(hù)端計(jì)算 機(jī)手動(dòng)配置查找服務(wù)器 ,服務(wù)器接收到客戶(hù)端的 請(qǐng)求 信息后返回服務(wù)器地址,則客戶(hù)端接收、驗(yàn)證信息并記錄服務(wù)器端地址,服務(wù)器端 客戶(hù)端 1 客戶(hù)端 2 客戶(hù)端 N ACCESS 數(shù)據(jù)庫(kù) 查詢(xún)、修改特定用戶(hù)基本信息 客戶(hù)端 3 。 4001 端口處理與各個(gè)客戶(hù)端的通話(huà) 4002 端口處理與對(duì)方的點(diǎn)對(duì)點(diǎn)的文件傳送 4000 端口與服務(wù)器連接,注冊(cè)、登陸、下線(xiàn)、請(qǐng)求在線(xiàn)用戶(hù)列表、察看修改用戶(hù)資料。 基于 VC++ Socket 的多線(xiàn)程網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與設(shè)計(jì) 21 然后客戶(hù)端啟動(dòng)定時(shí) 器 ,定時(shí)發(fā)送信息到服務(wù)器,以告知服務(wù)器自己在線(xiàn),然后服務(wù)器返回在線(xiàn)用戶(hù)列表,服務(wù)器依靠客戶(hù)端發(fā)送的信息來(lái)更新維護(hù)在線(xiàn)用戶(hù)列表。在客戶(hù)端與服務(wù)器 進(jìn)行 數(shù)據(jù)交換,擁有了在線(xiàn)用戶(hù)列表后, 所有的連接到該服務(wù)器上的用戶(hù)都會(huì)出現(xiàn)在各個(gè)客戶(hù)端的好友列表 上,這 就可以選擇 要進(jìn)行信息交換的好友 進(jìn)行客戶(hù)端之間的點(diǎn)對(duì)點(diǎn)信息交流了。 客戶(hù)可以同時(shí)和多個(gè)好友進(jìn)行信息交流。 如果服務(wù)器不在線(xiàn),則客戶(hù)端會(huì)提示用戶(hù)退出,在一定的時(shí)間后自動(dòng)退出。 啟動(dòng)客戶(hù)端后與服務(wù)器端的信息交換流程圖 如圖 所示 [13]: 客 戶(hù) 端 服 務(wù) 器 端請(qǐng) 求 連 接 服 務(wù) 器 等 待 客 戶(hù) 端 的 連 接接 受 并 驗(yàn) 證 信 息 返 回 驗(yàn) 證 信 息定 時(shí) 發(fā) 送 信 息 以確 認(rèn) 自 己 在 線(xiàn)等 待 接 收 客 戶(hù) 端 在線(xiàn) 信 息 , 維 護(hù) 在 線(xiàn)用 戶(hù) 列 表接 收 在 線(xiàn) 用 戶(hù) 列表 并 更 新發(fā) 送 在 線(xiàn) 用 戶(hù) 列 表等 待 客 戶(hù) 端 信 息或 向 目 的 地 i p 發(fā)送 信 息i n i t i a l i z eS e v i pC h e c k在線(xiàn)用戶(hù)列表 圖 客戶(hù)端與服務(wù)器端的信息交換流程圖 在本系統(tǒng)中,整個(gè)系統(tǒng)主要分為服務(wù)器端和客戶(hù)端,服務(wù)器端最重要的作用就是相當(dāng)于一個(gè)橋梁,既與系統(tǒng)數(shù)據(jù)庫(kù)相連接,又與各個(gè)客戶(hù)端相連接;而客戶(hù)端則具有雙重身份,其不但具有客戶(hù)端 本身的作用,而且還可以作為服務(wù)器端,以實(shí)現(xiàn)多點(diǎn)通信的作用。歸根結(jié)底整個(gè)系統(tǒng)通信的核心部分始終是客戶(hù)端和服務(wù)器端的通信,為了解決客戶(hù)端和服務(wù)器端的某些通信錯(cuò)誤,我對(duì)客戶(hù)端和服務(wù)器端采用了一套比較簡(jiǎn)單的自定義協(xié)議,具體如表 所示: 表 名 稱(chēng) 發(fā)送 數(shù)值 備 注 DATA_BUFSIZE 1024 數(shù)據(jù)緩沖區(qū)大小。 MAX_NAME_LEN 128 最大數(shù)據(jù)長(zhǎng)度。 基于 VC++ Socket 的多線(xiàn)程網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與設(shè)計(jì) 22 表 (續(xù) ) MAX_ONLINE_NUM 50 最多在線(xiàn)人數(shù)。 LOGGED_IN 230 登陸成功,服務(wù)器端向客戶(hù)端發(fā)送數(shù)值 230,客戶(hù)端接收到數(shù)據(jù)后彈出登陸成功的窗口。 LOGIN_FAILED_AT_PWD 231 因密碼錯(cuò)誤而導(dǎo)致登陸失敗,服務(wù)器向客戶(hù)端發(fā)送數(shù)值 231,客戶(hù)端接收到數(shù)據(jù)后彈出密碼錯(cuò)誤的提示。 LOGIN_FAILED_AT_ID 232 因 id號(hào)出錯(cuò)而導(dǎo)致登陸失敗,服務(wù)器向客戶(hù)端發(fā)送數(shù)值 232,客戶(hù)端接收到數(shù)據(jù)后彈出 號(hào)錯(cuò)誤的提示。 LOGIN_FAILED_TOONLINEUSER 233 因在線(xiàn)人數(shù)太多出錯(cuò)而導(dǎo)致登陸失敗,服務(wù)器向客戶(hù)端發(fā)送數(shù)值 233,客戶(hù)端 接收到數(shù)據(jù)后彈出不能登陸的提示。 LOGIN_FAILED_BECAUSE_LOGAGAIN 234 因該 ID號(hào)已經(jīng)在線(xiàn)而導(dǎo)致登陸失敗,服務(wù)器向客戶(hù)端發(fā)送數(shù)值 234,客戶(hù)端接收到數(shù)據(jù)后彈出不能登陸的提示。 LOGIN_FAILED_BECAUSE_DB 235 連接數(shù)據(jù)庫(kù)出錯(cuò)。 LOGIN_FAILED_ BECAUSE_ID 236 因該 ID號(hào)沒(méi)有注冊(cè)而導(dǎo)致登陸失敗。 UPDATE_SUCCESS 240 修改個(gè)人信息成功。 UPDATE_FAIL 241 修改個(gè)人信息失敗。 NETMSG_QUIT 221 服務(wù)器已經(jīng)斷開(kāi)。 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) (1) 在線(xiàn)用戶(hù)信息結(jié)構(gòu)體: struct USERINFO { long id。 //用戶(hù) id char nickname[20]。用戶(hù)昵稱(chēng) char ip[16]。 //用戶(hù)的 IP 地址 LPSOCKET_INF pSI。 }。 在登陸的過(guò)程中,客戶(hù)端將客戶(hù)的所有信息封裝在一個(gè)結(jié)構(gòu)體中一齊發(fā)送到服務(wù)器,服務(wù)器再與后臺(tái)的數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)匹配,進(jìn)而判斷客戶(hù)端發(fā)送過(guò)來(lái)的所有信息是否正確從而判斷是否成功登陸。 (2) 從服務(wù)器端發(fā)送到客戶(hù)端 的在線(xiàn)用戶(hù)列表信息結(jié)構(gòu) 如圖 所示 : 基于 VC++ Socket 的多線(xiàn)程網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與設(shè)計(jì) 23 I P 地 址\ t… … … . . .I P 地 址 \ t 圖 (3) 傳輸?shù)骄€(xiàn)程的信息結(jié)構(gòu)體: 客戶(hù)端: struct RECVPARAM { SOCKET sock。 //存儲(chǔ)接口套接字 HWND hwnd。 //存儲(chǔ)窗口句柄 }。 服務(wù)器端: struct RECVPARAM { SOCKET sock。 //存儲(chǔ)接口套接字 HWND hwnd。 //存儲(chǔ)窗口句柄 BOOL endtread。 //存儲(chǔ)用于判斷是否退出線(xiàn)程循環(huán) USERINFO *userhead。 //存儲(chǔ)在線(xiàn)用戶(hù)單向鏈表的頭指針 }。//線(xiàn)程函數(shù)為靜態(tài)函數(shù),無(wú)法調(diào)用成員變量和成員函數(shù),所以必須將需要的數(shù)據(jù)傳送進(jìn)去。 服務(wù)器端設(shè)計(jì)實(shí)現(xiàn) 服務(wù)器端以及服務(wù)器端的設(shè)計(jì)實(shí)現(xiàn)是本系統(tǒng)的一個(gè)關(guān)鍵技術(shù),本章詳細(xì)的介紹了本系統(tǒng)服務(wù)器端的設(shè)計(jì)與實(shí)現(xiàn)。包括服務(wù)器端的工作流程,實(shí)現(xiàn)方法,以及消息映射機(jī)制等。 服務(wù)器端工作原理 服務(wù)器端采用兩個(gè)線(xiàn)程,其中一個(gè)線(xiàn)程處理各 客戶(hù)端的連接請(qǐng)求 ( accept) ,另一個(gè)在客戶(hù)端請(qǐng)求連接成功后處 理接收到的命令并返回信息,包括用戶(hù)注冊(cè)、登陸、下線(xiàn)、生成在線(xiàn)用戶(hù)列表、查詢(xún)修改某個(gè)在線(xiàn)用戶(hù)的信息等。 啟動(dòng)服務(wù)后服務(wù)器端開(kāi)始接收客戶(hù)端發(fā)送過(guò)來(lái)的初始化信息或確認(rèn)在線(xiàn)信息 ,進(jìn)行判斷后作出相應(yīng)的處理,在最后向客戶(hù)端返回在線(xiàn)用戶(hù)列表信息 , 服務(wù)器端使用一個(gè)定時(shí)器對(duì)在線(xiàn)用戶(hù)列表進(jìn)行維護(hù)。 基于 VC++ Socket 的多線(xiàn)程網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與設(shè)計(jì) 24 初始化對(duì)話(huà)框 在功能函數(shù) BOOL CServerDlg::OnInitDialog()下設(shè)置對(duì)話(huà)框顯示 “ 未啟動(dòng)服務(wù) ” 。 SetDlgItemText(IDC_showip,未啟動(dòng)服務(wù)! )。 啟動(dòng)服務(wù) 創(chuàng)建 套接字 socketsev, 并綁定到本地 IP、 4000 端口。 //定義并初始化在線(xiàn)用戶(hù)鏈表的頭 userhead。 userhead=new USERINFO。 userheadip=。 userheadon_line=TRUE。 userheadnext=NULL。 //創(chuàng)建 RECVPARAM 結(jié)構(gòu)體,用于存 socktsev 和本窗口句柄 m_hWnd pRecvParam=new RECVPARAM。 pRecvParamsock=socktsev。 pRecvParamhwnd=m_hWnd。 pRecvParamuserhead=userhead。 pRecvParamendtread=TRUE。 //創(chuàng)建線(xiàn)程,并關(guān)閉返回的線(xiàn)程句柄 HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL)。 CloseHandle(hThread)。 //設(shè)計(jì)定時(shí)器 SetTimer(1,2020,NULL)。 //將顯示在線(xiàn) IP 區(qū)域清空 SetDlgItemText(IDC_showip,)。 //將開(kāi)始服務(wù)控件設(shè)為不可用,停止服務(wù)控件設(shè)為可用 GetDlgItem(IDC_stop)EnableWindow(TRUE)。 GetDlgItem(IDC_start)EnableWindow(FALSE)。 停止服務(wù) //將 pRecvParam 變量中的 endtread 設(shè)為 FALSE,以便關(guān)閉線(xiàn)程 pRecvParamendtread=FALSE。 //關(guān)閉套接字,并釋放資源 closesocket(socktsev)。 基于 VC++ Socket 的多線(xiàn)程網(wǎng)絡(luò)聊天系統(tǒng)開(kāi)發(fā)與設(shè)計(jì) 25 WSACleanup()。 //關(guān)閉定時(shí)器 KillTimer(1)。 //設(shè)置顯示 IP 區(qū)域文字為 “服務(wù)停止 ”,將開(kāi)始服務(wù)控件設(shè)為可用,停止服務(wù)控件設(shè)為不可用 SetDlgItemText(IDC_showip,服務(wù)停止! )。 GetDlgItem(IDC_stop)EnableWindow(FALSE)。 GetDlgItem(IDC_start)EnableWindow(TRUE)。 創(chuàng)建線(xiàn)程時(shí)調(diào)用的功能函數(shù) 循環(huán)接收客戶(hù)端發(fā)來(lái)的確認(rèn)在線(xiàn)消息,并判斷是什么樣的信息,做出相應(yīng)的處理。 if(test==initialize) { //如果接收到的信息為初始化信息 “initialize”,則執(zhí)行下面代碼 CString sendmsgip=。 //返回 “服務(wù)器 ip+sevip”信息 =i_addr(tempipaddr)。 sendmsgip+=sevip。 sendto(sock
點(diǎn)擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1