基于 C+++TCP+Websocket的即時通信系統(tǒng)設(shè)計與實現(xiàn)(畢業(yè)論文+程序源碼)
大家好,今天給大家介紹基于 C+++TCP+Websocket的即時通信系統(tǒng)設(shè)計與實現(xiàn),文章末尾附有本畢業(yè)設(shè)計的論文和源碼下載地址哦。需要下載開題報告PPT模板及論文答辯PPT模板等的小伙伴,可以進(jìn)入我的博客主頁查看左側(cè)最下面欄目中的自助下載方法哦
文章目錄:
1、項目簡介
- 隨著網(wǎng)絡(luò)通信和計算機(jī)技術(shù)的發(fā)展,人們越來越希望能夠即時發(fā)送和接收互聯(lián)網(wǎng)消息。與此同時隨著互聯(lián)網(wǎng)的發(fā)展在HTML5中提出了websocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬并且服務(wù)器和瀏覽器能夠雙向?qū)崟r通訊。為了能讓用戶體驗傳統(tǒng)客戶端和web帶來的即時通信結(jié)合的超爽體驗,本次畢業(yè)設(shè)計將完成web端和客戶端之間的即時通信系統(tǒng),并利用在大學(xué)所學(xué)的知識打造高性能,高并發(fā),高可拓展性服務(wù)器。同時更是為了方便人們之間的信息交流,讓用戶隨時的接入即時通信,提升人們生活的效率。
- 該按照軟件工程思想采用面向?qū)ο蠛湍K化設(shè)計方法設(shè)計。其中采用了網(wǎng)絡(luò)通信技術(shù)、數(shù)據(jù)庫技術(shù),多線程技術(shù)和信息安全技術(shù)的基礎(chǔ)上設(shè)計并實現(xiàn)新型即時通信系統(tǒng)。該系統(tǒng)為用戶提供點對點私聊,群聊,離線消息,消息提示于一體的即時通信平臺。
2、資源詳情
項目難度:中等難度
適用場景:相關(guān)題目的畢業(yè)設(shè)計
配套論文字?jǐn)?shù):11698個字45頁
包含內(nèi)容:全套源碼+配整論文
開題報告、論文答辯、課題報告等ppt模板推薦下載方式:
3、關(guān)鍵詞
即時通信;高性能;高并發(fā);TCP/IP;Websocket4、畢設(shè)簡介
提示:以下為畢業(yè)論文的簡略介紹,項目完整源碼及完整畢業(yè)論文下載地址見文末。
第一章 引言
1.1 即時通信系統(tǒng)基本概念
即時通信(Instant Messaging,縮寫為 IM),是以互聯(lián)網(wǎng)為基礎(chǔ),實現(xiàn)交互雙方文字、圖片、視頻、語言等信息實時傳輸。即時通信系統(tǒng)的最大特點就是能在網(wǎng)絡(luò)上進(jìn)行信息之間的實時交流。與之間交流、電話交流等通信方式相比,即時通信具有迅速、方便、隱蔽性強(qiáng)等特點,在網(wǎng)絡(luò)上可以超越身份、年齡、行業(yè)、地域等限制,達(dá)到人與人之間的交流零距離,實時通信成為互聯(lián)網(wǎng)時代人與人溝通的重要方式[1]。
1.2 即時通信系統(tǒng)的發(fā)展歷程
隨著互聯(lián)網(wǎng)發(fā)展,即時通信系統(tǒng)在中國發(fā)展是非常迅速的。從1999年2月第一次推即時通信軟件OICQ,即時通信在中國的發(fā)展已有16年左右歷史。經(jīng)歷萌芽階段后,即時通信在我國已經(jīng)進(jìn)入了迅速發(fā)展階段。目前主要的即時通信產(chǎn)品主要有騰訊QQ、淘寶旺旺、飛秋、微軟MSN、網(wǎng)易泡泡、百度Hi等。隨著科技的發(fā)展,即時通信系統(tǒng)的功能日益豐富,即時通信不再只是即時交流簡單文本內(nèi)容,它已經(jīng)發(fā)展成集娛樂、交流、電子商務(wù)、辦公合作和知識共享等為一體的綜合信息平臺。它以迅速、低成本和方便等特點被越來越被人們所接受,即時通信成為互聯(lián)網(wǎng)發(fā)展的趨勢[1]。
1.3 系統(tǒng)研究目的和意義
隨著網(wǎng)絡(luò)通信技術(shù)和計算機(jī)技術(shù)的發(fā)展,人們越來越希望能夠快速得發(fā)送和接收互聯(lián)網(wǎng)消息,服務(wù)器管理員也希望減輕服務(wù)器的負(fù)擔(dān)。與此同時隨著互聯(lián)網(wǎng)的發(fā)展在HTML5中提出了websocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬并且服務(wù)器和瀏覽器能夠雙向?qū)崟r通訊。同時也是學(xué)習(xí)和實踐網(wǎng)絡(luò)編程、操作系統(tǒng)、軟件工程、數(shù)據(jù)庫概論、算法等相關(guān)知識。
為了能讓用戶體驗傳統(tǒng)客戶端和web帶來的即時通信結(jié)合的超爽體驗,并利用在大學(xué)所學(xué)的知識打造高性能,高并發(fā),高可拓展性服務(wù)器。同時更是為了方便人們之間的信息交流,讓用戶隨時的接入即時通信,提升人們生活的效率。
1.4 系統(tǒng)可行性分析
省略
第二章 相關(guān)技術(shù)介紹
2.1 TCP/UDP協(xié)議
TCP—傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務(wù)。在傳輸數(shù)據(jù)之前必須建立連接,數(shù)據(jù)傳輸結(jié)束后要釋放連接。TCP提供超時重發(fā),讀取數(shù)據(jù)的次序一致,丟棄重復(fù)數(shù)據(jù),檢驗數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)的可靠傳輸。
UDP—用戶數(shù)據(jù)報協(xié)議,主要特點:無連接、盡最大努力交付、面向報文、沒有擁塞控制、支持一對一、一對多、多對一、多對多的交互通信、頭部開銷較小。在傳輸數(shù)據(jù)之前不需要建立連接。原地主機(jī)的運輸層在收到UDP數(shù)據(jù)報后,不需要給出任何確認(rèn)。雖然UDP不提供可靠傳輸,但在某些情況下確實一種最有效的工作方式。
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計模式中,Socket其實就是一個門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議[3]。
2.2 WebSocket協(xié)議
WebSocket是HTML5開始提供的一種在單個 TCP 連接上進(jìn)行全雙工通訊的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,WebSocketAPI被W3C組織定為標(biāo)準(zhǔn),能更好的節(jié)省服務(wù)器資源和帶寬并且服務(wù)器和瀏覽器之間能夠?qū)崟r雙向通信。
使用websocket的話,瀏覽器只需一個TCP連接即可完成雙向通行,在服務(wù)器和瀏覽器頻繁通信時,TCP連接可以得到高效應(yīng)用,編程模型也十分簡潔。Websocket協(xié)議主要分為兩個部分:握手和數(shù)據(jù)傳輸。瀏覽器建立連接時,通過HTTP發(fā)起請求報文,與普通HTTP請求協(xié)議略有區(qū)別在于協(xié)議頭upgrade:websocket;connection:upgrade;表示請求服務(wù)器升級協(xié)議為websocket。一旦websocket握手成功,當(dāng)前連接將不在進(jìn)行HTTP的交互,而是開始websocket的數(shù)據(jù)幀協(xié)議,實現(xiàn)瀏覽器和服務(wù)器的數(shù)據(jù)交互[4]。
圖2.1 websocket 協(xié)議升級示意圖
2.3 服務(wù)器模型
省略
2.4 TLS/SSL協(xié)議
SSL(Secure Sockets Layer,安全套接層),是Netscape開發(fā)出來的,用來保障網(wǎng)絡(luò)傳輸數(shù)據(jù)時的安全性。TLS與SSL先在握手階段采用RSA非對稱,之后的數(shù)據(jù)傳輸在傳輸層對網(wǎng)絡(luò)連接進(jìn)行加密。TLS/SSL是個公鑰/私鑰的結(jié)構(gòu),它是一個非對稱的結(jié)構(gòu),每個服務(wù)器和客戶端都有自己的公私鑰。它建立在可靠的TCP傳輸協(xié)議之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持,用于在真正的數(shù)據(jù)傳輸開始前,連接的雙方進(jìn)行身份認(rèn)證、協(xié)商加密采用的算法、交換加密采用的密鑰等[3]。
2.5編程語言
2.5.1 C++
C++起源與C語言,最初的名字為C with Class,意為帶類的C語言。在《Effective C++》一書中的條款一中將C++視為一個語言聯(lián)邦[6]。C++可以看成由四個部分組成:
1, C。C++以C為基礎(chǔ)。預(yù)處理器(preprocessor)、數(shù)組(arrays)、指針(pointers)、自己分配內(nèi)存、自己管理內(nèi)存等都來自C。
2, 面向?qū)ο?。?class)、繼承(inheritance)、封裝(encapsulation)、多態(tài)(polymorphism)、虛函數(shù)(virtual function)等都是面向?qū)ο笤O(shè)計在C++上的最直接的體現(xiàn)。
3, 模板。C++的范型編程(generic programming)部分。他們帶來新的編程范型(programming paradigm),也就是所謂的template meta programming(TMP,模板元編程)。
4, STL。即template程序庫,對容器、迭代器、算法以及函數(shù)對象的規(guī)約有極佳的緊密配合與協(xié)調(diào)。
C++11標(biāo)準(zhǔn)包括大量的新特性:包括右值引用、lambda表達(dá)式、常量表達(dá)式、類型推導(dǎo)關(guān)鍵字auto、decltype,函數(shù)因子、定則表達(dá)式,哈希表、多線程、隨機(jī)數(shù)引擎等[7]。
2.5.2 Nodejs
Node.js是一個基于V8引擎的JavaScript運行時建立的平臺,用于高效率地搭建快速響應(yīng)、高性能、高并發(fā)的網(wǎng)絡(luò)應(yīng)用。Node.js 使用事件驅(qū)動,非阻塞異步的I/O 模型而得以輕量和高效,非常適合在分布式設(shè)備上運行的數(shù)據(jù)流動密集型的實時應(yīng)用。Node.js采用C++語言編寫而成,它不是Javascript應(yīng)用,而是一個服務(wù)器端的Javascript的運行環(huán)境。[4]。
圖2.2 瀏覽器與Node.js以及CommonJS組織、W3C組織、ECMAScript之間的關(guān)系
2.6 開源庫
2.6.1 Boost C++ Libraries
Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一。 Boost庫由C++標(biāo)準(zhǔn)委員會庫工作組成員發(fā)起,其中有些內(nèi)容有望成為下一代C++標(biāo)準(zhǔn)庫內(nèi)容。在C++社區(qū)中影響甚大,是不折不扣的“準(zhǔn)”標(biāo)準(zhǔn)庫。Boost由于其對跨平臺的強(qiáng)調(diào),對標(biāo)準(zhǔn)C++的強(qiáng)調(diào),與編寫平臺無關(guān)[8]。
2.6.2 Openssl
OpenSSL 是一個強(qiáng)大的開源SSL\TLS安全套接字層密碼庫,包括主要的密碼算法(如:RSA,AES,DES)、生成數(shù)字證書封裝管理功能及SSL協(xié)議的實現(xiàn),并提供豐富的測試程序和示例程序。[10][11]。
2.6.3 Protobuf
Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式庫,可以用于結(jié)構(gòu)化數(shù)據(jù)序列化,可以根據(jù)預(yù)定義的消息類型生成高效的程序文件,很適合做性能要求很高的數(shù)據(jù)存儲或數(shù)據(jù)交換格式。它廣泛于自定義通訊協(xié)議、數(shù)據(jù)存儲等領(lǐng)域的平臺無關(guān)、語言無關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)傳輸格式。目前提供了 C++、Python 、Nodejs、Java幾種語言的接口[9]。
2.6.4 Hiredis
hiredis是redis數(shù)據(jù)庫的C接口,原開源庫只支持Linux。在通過宏判定修改hiredis的網(wǎng)絡(luò)接口后能夠支持windows[12]。異步連接通過adapter使用libevent。
2.6.5 Socket.io
Socket.io是一個開源的高效WebSocket庫,它通過Node.js實現(xiàn)WebSocket服務(wù)端庫,同時也提供客戶端javascript庫。Socket.io庫支持以事件驅(qū)動為基礎(chǔ)的雙向?qū)崟r通信,它兼容各種瀏覽器或移動設(shè)備。
Socket.io支持4種協(xié)議:Websocket、jsonp-polling 、xhr-polling、htmlfile,它會自動根據(jù)瀏覽器選擇適合的連接方式,從而讓開發(fā)者可以著重于功能邏輯而不是平臺的兼容性問題 [13]。安裝方式: npm install socket.io –g。
2.7 開發(fā)相關(guān)工具
2.7.1 Redis
Redis是一個key-value高速緩存數(shù)據(jù)庫,它每秒操作次數(shù)能高達(dá)十萬次。和Memcached緩存數(shù)據(jù)庫類似,它支持存儲的value數(shù)據(jù)類型非常豐富,包括list(鏈表)、string(二進(jìn)制字符串)、set(集合)、zset(有序集合)和hash(哈希表類型),存儲的數(shù)據(jù)可以以二進(jìn)制數(shù)據(jù)存儲。這些數(shù)據(jù)類型都支持push/pop、lrange、Sadd及取交集并集和差集及更豐富的數(shù)據(jù)操作,而且這些操作都是原子操作,也支持多操作的原子性操作。支持發(fā)布及訂閱功能,為系統(tǒng)提供低耦合的交互模式。與memcached一樣,為了保證高性能,數(shù)據(jù)庫數(shù)據(jù)都是緩存在運行內(nèi)存中。區(qū)別的是redis會周期性的把數(shù)據(jù)以快照的方式寫入本地磁盤以實現(xiàn)持久化數(shù)據(jù),并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步[14]。
2.7.2 Sqlite
Sqlite,是一個輕量級的數(shù)據(jù)庫,是遵守ACID的關(guān)系型數(shù)據(jù)庫原理的系統(tǒng),它以C語言實現(xiàn)非常高效。它是D.RichardHipp建立的開源項目。它的設(shè)計目標(biāo)是能夠嵌入到使用的軟件中,而且目前已經(jīng)廣泛應(yīng)用在很多軟件產(chǎn)品,它占用內(nèi)存資源非常的低,只需要占用幾百K字節(jié)的內(nèi)存[16][17]。
2.7.3 Nginx
Nginx (“engine x”) 是一個著名的開源高性能的 HTTP 和反向代理服務(wù)器,它使用C語言開發(fā)網(wǎng)絡(luò)庫使用libevent性能高效代碼結(jié)構(gòu)優(yōu)良,其源代碼以類BSD許可證的形式發(fā)布。因它的高穩(wěn)定性、高性能、豐富的操作功能、示例配置文件和低系統(tǒng)資源的占用而聞名,漸漸成為高性能網(wǎng)站使用比例最高的web服務(wù)器[15][18]。
2.7.4 Visual Studio 2013
Microsoft Visual Studio(簡稱VS)是美國微軟公司強(qiáng)大的開發(fā)語言工具包系列產(chǎn)品。VS是一個功能豐富的開發(fā)工具,如代碼提示、良好的錯誤提示、代碼管控工具、UML工具、集成開發(fā)環(huán)境(IDE)等等。在最新的VS2013版本中支持了大部分C++11標(biāo)準(zhǔn)實現(xiàn),新增了代碼信息指示、Git版本控制支持還有單元測試支持等。
2.7.5 Visio 2013
Visio是一款需求分析、系統(tǒng)設(shè)計和流程進(jìn)行可視化軟件。對UML統(tǒng)一建模語言很好的支持,同時也包含有很多行業(yè)可視化工具,為人們更好的表達(dá)設(shè)計思路和想法,提高工作生活的效率。
第三章 即時通信系統(tǒng)的設(shè)計
3.1 即時通信系統(tǒng)功能描述
隨著web的發(fā)展,在HTML5標(biāo)準(zhǔn)中提出了Websocket protocol協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信(full-duplex)。為用戶提供能夠通過客戶端和web端接入的即時通信平臺,讓用戶體驗傳統(tǒng)客戶端和HTML5標(biāo)準(zhǔn)結(jié)合帶來的超爽體驗,方便人們之間的信息交流,創(chuàng)建新型溝通文化,提升人們生活的效率。
該系統(tǒng)具有私聊,群聊,消息通知、離線消息存儲,上下線通知等基本功能,同時保證數(shù)據(jù)通信的即時性以及通信過程和消息存儲的安全性。
圖3.1 用戶用例圖
3.2系統(tǒng)總體設(shè)計
TCP服務(wù)器和客戶端采用C++編寫,通過TCP協(xié)議與服務(wù)器連接并由SSL安全傳輸層保證安全,實現(xiàn)即時通信。瀏覽器端通過HTML5中提出的Websocket協(xié)議與服務(wù)器連接,Websocket服務(wù)器和HTTP服務(wù)器采用Nodejs編寫。不同物理服務(wù)器,不同語言服務(wù)器采用統(tǒng)一的數(shù)據(jù)傳輸格式來傳輸,借助redis數(shù)據(jù)庫的Pub/Sub模式和消息隊列,來進(jìn)行服務(wù)器之間的信息通信。對數(shù)據(jù)庫進(jìn)行Master/Salve備份。
圖3.2 服務(wù)器設(shè)計圖
3.3數(shù)據(jù)庫設(shè)計
為了提高對數(shù)據(jù)的處理,采用緩存數(shù)據(jù)庫Redis。Redis是一個Key-Value數(shù)據(jù)庫,數(shù)據(jù)庫設(shè)計主要體現(xiàn)在Key的設(shè)計。存儲的數(shù)據(jù)是二進(jìn)制安全的。
3.4主要的消息時序圖
3.4.1 未讀消息時序圖
1,用戶登陸后發(fā)出未讀消息請求。
2, 查詢unread列表所有私聊未讀消息。如:LRANGE unread:14006 0 -1
3,向Response添加未讀消息。
4,查詢所有群未讀消息。如:SORT groupSet:14006 GET # GET unreadNumber:14006:*
5,向Response添加未讀消息。
6,對Response序列化發(fā)送消息。
3.4.2點對點私聊時序圖
圖3.3 點對點聊天時序圖
1, 一個用戶發(fā)出一條點對點聊天消息。
2, 消息服務(wù)器接收到Peer消息,判斷是否在當(dāng)前服務(wù)器。
3, 如果接收的用戶在當(dāng)前服務(wù)器,向接收者的連接發(fā)送消息;如果用戶不在當(dāng)前服務(wù)器,查詢用戶狀態(tài)。如:EXIST online:14006
4, 接收數(shù)據(jù)庫查詢結(jié)果,判斷對方是否離線。
5, 如果對方離線,將二進(jìn)制消息保存到對方未讀消息列表;如果對方在線,根據(jù)返回結(jié)果得知對方Socket信息,向其Publish PeerMsg 二進(jìn)制數(shù)據(jù)。
6, 其他服務(wù)器Publish 一條PeerMsg消息。
A, 訂閱到一條PeerMsg:address:port消息,判斷對方是否在服務(wù)器上。
B, 如果用戶在服務(wù)器上,向其發(fā)送Peer消息;如果用戶不在服務(wù)器,將二進(jìn)制消息保存到對方未讀消息列表。一般用戶是會在服務(wù)器上的,防止發(fā)布消息的時候,用戶退出的情況。
3.4.3群聊消息時序圖
圖3.4 群聊天時序圖
1, 一個用戶發(fā)出一條群聊天消息。
2, 消息服務(wù)器接收到一條群消息,向數(shù)據(jù)庫查詢?nèi)撼蓡T信息。如:SORT onlineGroup:1 by no_exist_key get # get online:*
3, 獲取到群當(dāng)前在線人員信息。
4, 向本服務(wù)器的在線用戶發(fā)送群消息;向其他服務(wù)器Publish包含用戶ID列表和群消息的數(shù)據(jù);將消息推入消息列表,如:LPUSH groupMsg:1 二進(jìn)制數(shù)據(jù);獲取群成員和在線成員的差集,SDIFF groupMember:1 onlineGroup:1;更改未在線用戶群消息未讀數(shù)目,如INCR unreadNumber:14006:1;
A, 其他服務(wù)器Publish groupMsg消息包含用戶ID列表和群消息。
B, 訂閱到一條groupMsg消息,向用戶ID列表中的用戶發(fā)送群消息。
3.5網(wǎng)絡(luò)處理設(shè)計
基于TCP協(xié)議為什么需要對數(shù)據(jù)進(jìn)行封包和拆包:TCP是個面向可靠傳輸協(xié)議,就是沒有邊界的一串?dāng)?shù)據(jù),就像河里面的水一樣是連續(xù)的,其間沒有分界線[22]。傳輸時出現(xiàn)粘包的原因有: 開啟Nagle算法后,發(fā)送端需要等待緩沖區(qū)滿才發(fā)送出去,造成粘包;接收方系統(tǒng)繁忙沒有及時接收緩沖區(qū)的包,造成多個包連續(xù)等原因。假設(shè)我們連續(xù)調(diào)用兩次send分別發(fā)送兩段數(shù)據(jù)data1和data2,在接收端有可能出現(xiàn)以下幾種接收情況:
A.先接收到data1,然后接收到data2。
B.先接收到data1的部分?jǐn)?shù)據(jù),然后接收到data1余下的部分以及data2的全部。
C.先接收到了data1的全部數(shù)據(jù)和data2的部分?jǐn)?shù)據(jù),然后接收到了data2的余下的數(shù)據(jù)。
D.一次性接收到了data1和data2的全部數(shù)據(jù)。
對于A這種情況正是我們需要的,對于B,C,D的情況就是大家經(jīng)常說的"粘包",就需要我們把接收到的數(shù)據(jù)進(jìn)行拆包,拆成一個個獨立的數(shù)據(jù)包.為了拆包就必須在發(fā)送端進(jìn)行封包。
對于UDP來說就不存在拆包的問題,因為UDP是用戶數(shù)據(jù)報協(xié)議,也就是數(shù)據(jù)包是一個一個發(fā),接收端不保證包的次序和是否到達(dá),但能夠確定一個UDP包是一個完整的消息。
3.5.1封包
封包就是給一段數(shù)據(jù)加上額外信息,使得在解析TCP數(shù)據(jù)時能夠區(qū)分完整消息數(shù)據(jù)。由于消息是序列化成二進(jìn)制數(shù)據(jù)進(jìn)行傳輸,所以包需要附帶消息的類型,過濾非法包時封包會加入"包尾"內(nèi)容,如“\r\n”分隔符。
圖3.6 消息封包圖
3.5.2拆包
TCP每次讀取到分隔符”\r\n”時作為一個包判斷,讀取頭部網(wǎng)絡(luò)字節(jié)序4 bytes數(shù)據(jù),轉(zhuǎn)換為本地字節(jié)序整數(shù)n,判斷緩沖區(qū)大小是否等于n+4。如果相等則消費緩沖區(qū)n+4個字節(jié);如果不相等則不消費緩沖區(qū)。
網(wǎng)絡(luò)消息流程[20]
圖3.7 消息流程圖
1, 服務(wù)器異步讀取數(shù)據(jù),接收到一個TCP流后回調(diào)HandleRead函數(shù)。向緩沖區(qū)Commit接收到的字節(jié)數(shù)n。
2, 對緩沖區(qū)進(jìn)行拆包,循環(huán)判斷緩沖區(qū)是否有完整包,如果有調(diào)用ProtobufCodec的OnMessage函數(shù),如果沒有跳出循環(huán)。開始接收下一個TCP流。
3, OnMessage函數(shù)對緩沖區(qū)consume消費m個字節(jié)數(shù),對二進(jìn)制數(shù)據(jù)解碼,生成對應(yīng)的Message。
4, 調(diào)用ProtobufDispatcher的OnProtobufMessage函數(shù)將消息映射到服務(wù)器相應(yīng)的處理函數(shù)。
5, 消息服務(wù)器對不同消息進(jìn)行相應(yīng)的處理。
6, 如果消息需要其他服務(wù)器處理則Publish相應(yīng)服務(wù)器消息,如果用戶在本服務(wù)器直接向其發(fā)送相應(yīng)的消息。
7, 對消息進(jìn)行封包,發(fā)送二進(jìn)制數(shù)據(jù)。
3.6負(fù)載均衡設(shè)計
登陸服務(wù)器每次登陸后,取加權(quán)集合serverRank權(quán)值最大的服務(wù)器信息,對分配消息服務(wù)器的消息服務(wù)器進(jìn)行加負(fù)權(quán);用戶退出后對分配的消息服務(wù)器加正權(quán);
Web端通過配置Nginx來實現(xiàn)對Https和Websocket的負(fù)載均衡。
3.7網(wǎng)絡(luò)安全設(shè)計
圖3.8 網(wǎng)絡(luò)安全連接圖
1, 客戶端登錄時采用TLS/SSL連接,數(shù)字簽名證書采用自簽證證書,登錄時傳輸密碼的MD5校驗碼。
2, 登錄服務(wù)器分配消息服務(wù)器和SessionID。
3, 連接消息服務(wù)器時第一個消息包作為握手包,不加密只包含用戶ID。
4, 如果數(shù)據(jù)庫有用戶登錄記錄,返回成功。
5, 兩端用SessionID作為種子對以后要傳輸?shù)臄?shù)據(jù)進(jìn)行AES加密。
6, web端登錄、拉取好友信息、群消息等用HTTPs(TCP短連接)。
7, 聊天消息采用在HTTPS建立的websockets連接(TCP長連接)。
第四章 即時通信系統(tǒng)的實現(xiàn)
4.1主要類和文件說明
Tcp_Server:服務(wù)器網(wǎng)絡(luò)連接類。采用Boost Asio作為異步模型,實現(xiàn)高性能網(wǎng)絡(luò)服務(wù)器。監(jiān)聽端口、接收新的連接,對每個連接創(chuàng)建新的Tcp_Session對象。
Tcp_Session:網(wǎng)絡(luò)連接Session類。接收、發(fā)送TCP流,PING數(shù)據(jù)包,錯誤處理,消息接收到后交付ProtubufCodec處理[22]。
Ssl_Server:安全傳輸層TLS/SSL服務(wù)器網(wǎng)絡(luò)連接類。
Ssl_Session:安全傳輸層TLS/SSL連接Session類。
Connection_Manager:網(wǎng)絡(luò)連接管理類。管理連接用戶ID與連接的映射關(guān)系,創(chuàng)建、退出時要處理的相關(guān)數(shù)據(jù)。
MyBuffer:數(shù)據(jù)緩存區(qū)類。
ProtubufCodec:網(wǎng)絡(luò)消息封包和拆包及加密解密類。
成員變量存儲ProtubufDispatcher的HandleMessage函數(shù)。
圖4.1 ProtuCode類UML圖
ProtubufDispatcher:處理函數(shù)和不同消息類型之間映射類。它有一個 map<Descriptor*, ProtobufMessageCallback> 成員,通過registerMessageCallback 向Map表添加映射,ProtubufCodec解碼后調(diào)用HandleMessage,找到回調(diào)函數(shù),如果沒找到調(diào)用默認(rèn)回調(diào)。
圖4.2 ProtubufDispatcher類UML圖
Credis:與redis數(shù)據(jù)庫操作類,像管道,多操作原子性等復(fù)雜操作通過返回redisContext來處理。
Server:服務(wù)器核心類,向ProtubufCodec,ProtubufDispatcher,tcp_server或ssl_server注冊各種服務(wù)器處理回調(diào),消息的對應(yīng)處理方式,發(fā)布服務(wù)器間消息,訂閱服務(wù)器間消息,操作數(shù)據(jù)庫等操作,對于數(shù)據(jù)處理處理函數(shù)使用互斥鎖確保在多線程下的安全。
圖4.3 服務(wù)器啟動和退出處理圖
SessionID.h:密鑰生成函數(shù),通過當(dāng)前系統(tǒng)時間戳和C++11的隨機(jī)數(shù)生成引擎和正態(tài)分布生成15位長的密鑰種子。
DemoServer.h:消息服務(wù)器啟動文件,啟動時接收服務(wù)器監(jiān)聽參數(shù),創(chuàng)建和運行io_service對象負(fù)責(zé)連接應(yīng)用程序與操作系統(tǒng)的IO服務(wù),控制臺事件(如:Ctrl + c,關(guān)閉控制臺)的監(jiān)聽以及處理。
LoginServer.h:登陸服務(wù)器啟動文件。
Message.pb.h:登錄時與登錄服務(wù)器連接消息類集合。
MessageChat.h:登錄后客戶端和消息服務(wù)器消息類集合。
MessageServer.h:消息服務(wù)器之間的訂閱消息類集合。
Node.js服務(wù)端
由于Node.js采用C++語言編寫而成,它不是Javascript應(yīng)用,而是一個Javascript的運行環(huán)境,基于libuv跨平臺網(wǎng)絡(luò)庫,具有異步IO、事件驅(qū)動、單線程等特點。Websocket協(xié)議對TCP流封裝成Frame數(shù)據(jù)包,websocket庫采用Socket.io,數(shù)據(jù)傳輸采用JSON格式,TCP連接采用Node.js內(nèi)置庫net,Https也采用內(nèi)置庫https。
創(chuàng)建新的數(shù)據(jù)庫用來對web端Session的高速存儲,以用戶名作為作為關(guān)鍵字,存儲的內(nèi)容是Session相關(guān)內(nèi)容的JSON數(shù)據(jù)。包含SessionId、Session過期時間和最大生命周期。實現(xiàn)HTTP服務(wù)器重啟后瀏覽器不需要重新登陸,關(guān)鍵字生存周期為一周,Session過期時間為30分鐘,Session過期后更新數(shù)據(jù)庫和瀏覽器Session的內(nèi)容。
socket.js:websocket服務(wù)器文件,服務(wù)器啟動和退出時流程與C++服務(wù)器相同,用于訂閱發(fā)布消息、實時對聊天數(shù)據(jù)的處理、消息通知等實時通信操作。
multiProcess.js:由于Node.js是單進(jìn)程單線程的,通過進(jìn)程間通信傳遞相關(guān)句柄,實現(xiàn)Master-Worker模式主進(jìn)程管理和調(diào)度工作進(jìn)程的功能,充分利用多核CPU資源。
圖4.4 Node.js服務(wù)器多進(jìn)程示意圖
HttpsServer.js:Https服務(wù)器文件,用戶登陸、退出、拉取好友信息、群信息、分組信息、用戶信息等操作。其HTTPS數(shù)據(jù)接口如表:4.1
表4.1 HTTPS數(shù)據(jù)接口
/data/groupMember?groupId=1 群成員信息
/data/friendsList 用戶好友列表
/data/unreadPeerMsg 所有好友未讀消息
data/groupsList 群列表信息
/data/unreadGroupMsg 所有群未讀消息
圖4.5 HTTPS數(shù)據(jù)接口效果圖
客戶端和服務(wù)器很多文件公用:
DlgGroups.h、DlgFriends.h含有主窗口Tab頁好友列表、群列表窗口對話框類。
DlgChat.h、DlgGroupChat.h含有點對點私聊、群聊天窗口對話框類。
ClientDlg.h、DlgLogin.h含有主窗口、登錄窗口對話框類。
Web端
路由設(shè)計:/:首頁;/user/userid:用戶主頁;/register:用戶注冊頁面;/login:用戶登錄頁面;/loginOut:用戶退出頁面;/Chat:聊天頁面;/happyChat:無狀態(tài)聊天頁面,可以創(chuàng)建臨時匿名會話。
client.js是websocket客戶端的業(yè)務(wù)邏輯實現(xiàn)代碼。
Ca.crt、server.crt、client.crt為ca證書、服務(wù)器證書、客戶端證書;server.csr、client.csr為證書請求鏈,ca.key、server.key、client.key為密鑰。
4.2系統(tǒng)部分截圖
圖4.6 C++服務(wù)器端啟動控制臺截圖
圖4.7 Nodejs的HTTP服務(wù)器效果圖
圖4.8 Nodejs的Websocket服務(wù)器啟動效果圖
圖4.9 C++登錄界面
圖4.10 web登錄界面
圖4.11 Web注冊界面
圖4.12 客戶端登錄后界面
圖4.13 Web端登錄后界面
第五章 即時通信系統(tǒng)的測試
5.1測試目的和任務(wù)
軟件測試是對軟件規(guī)格說明、軟件設(shè)計和編碼的最后復(fù)審,目的是在軟件產(chǎn)品交互之前盡可能發(fā)現(xiàn)軟件中潛在的錯誤。大量統(tǒng)計數(shù)據(jù)表明,軟件測試成本往往占整個開發(fā)成本的1/3左右。隨著人類對計算機(jī)的逐步深入,人們對軟件的要求也越來越高,“不是人適應(yīng)軟件,而是軟件適應(yīng)人”等觀點已經(jīng)成為人們的共識。
測試是保證軟件質(zhì)量的重要手段,也是軟件設(shè)計與開發(fā)過程中必不可少的環(huán)節(jié)。本系統(tǒng)在開發(fā)期間對每個功能都進(jìn)行了單元測試,新的功能單元測試成功后才添加到系統(tǒng)都進(jìn)行了集成測試,集成測試成功后才進(jìn)行下一個功能開發(fā),系統(tǒng)主要功能完成后對其進(jìn)行了確認(rèn)測試和系統(tǒng)測試。
5.2測試流程
I,配置Nginx代理服務(wù)器實現(xiàn)對websocket的負(fù)載均衡;配置redis數(shù)據(jù)庫實現(xiàn)Master/Slave備份和其他配置;npm install下載工程中package.json對應(yīng)的Nodejs依賴庫。
II,先4臺開啟C++消息服務(wù)器1臺開啟登錄服務(wù)器,多個用戶在不同機(jī)器上打開客戶端之間并進(jìn)行通信,對功能測試用例進(jìn)行測試,觀察服務(wù)器消息記錄和消息流動。
III,開啟Nodejs的HTTP服務(wù)器和Websocket服務(wù)器,多個用戶在不同機(jī)器上的瀏覽器之間相互通信,對功能測試用例進(jìn)行測試,觀察服務(wù)器消息記錄和消息流動。
IV,同時開啟C++服務(wù)器和Nodejs服務(wù)器,在不同的機(jī)器上打開客戶端和瀏覽器,兩個用戶之間一個使用客戶端一個使用瀏覽器進(jìn)行通信,對功能測試用例進(jìn)行測試,觀察不同服務(wù)器消息記錄和消息流動。
5.3 功能測試用例
表5.1 功能測試用例
index 功能模塊 設(shè)計數(shù)據(jù)測試 預(yù)期結(jié)果 測試描述
001 用戶注冊 填寫未注冊的用戶 注冊成功 進(jìn)入登錄界面
002 用戶注冊 填寫已注冊用戶 注冊失敗 提示用戶已存在
003 用戶注冊 填寫的信息不合法 注冊失敗 提示填寫信息格式不合法
004 用戶登錄 用戶ID和密碼正確 登錄成功 生成好友列表
005 用戶登錄 用戶已登錄 登錄失敗 提示已登錄
006 用戶登錄 用戶ID或密碼錯誤 登錄失敗 提示用戶ID或密碼錯誤
007 添加好友 查找的用戶ID存在且不是自己的好友 添加成功 刷新好友列表
008 添加好友 添加自己的用戶ID 添加失敗 提示自己不能添加自己
009 添加好友 查找的用戶ID已是用戶好友 添加失敗 提示已經(jīng)加為好友
010 添加好友 查找未注冊用戶ID 添加失敗 提示找不到用戶信息
011 發(fā)送消息 消息不為空 發(fā)送成功 服務(wù)器接收到消息
012 發(fā)送消息 消息為空 發(fā)送失敗 提示消息不能為空
5.4 測試結(jié)果
圖5.1 客戶端之間點對點私聊天
圖5.2 客戶端之間群聊天
兩個用戶登錄后分別連接8083和8084端口服務(wù)器,二者相互聊天在服務(wù)器的信息,。如圖5.3
圖5.3 在不同消息服務(wù)器上的聊天記錄
圖5.4 不同瀏覽器之間即時通信效果
圖5.5 Websocket服務(wù)器消息記錄
圖5.5 客戶端與瀏覽器即時通信效果
圖6.6 客戶端與瀏覽器聊天時C++服務(wù)器記錄
圖6.7 客戶端與瀏覽器通信時Websocket服務(wù)器記錄
第六章 結(jié)論和展望
6.1 結(jié)論
本文主要討論了基于TCP和Websocket協(xié)議的即時通信系統(tǒng)的研究和實現(xiàn)。研究不同協(xié)議類型服務(wù)器通過統(tǒng)一的服務(wù)器消息格式實現(xiàn)互通互聯(lián),簡單的負(fù)載均衡,異步網(wǎng)絡(luò)編程,Publish/Subscribe設(shè)計模式,實現(xiàn)了Web端與傳統(tǒng)客戶端之間即時通信,服務(wù)器的高性能、高并發(fā)。本系統(tǒng)按照軟件工程思想,使用面向?qū)ο笤O(shè)計模式設(shè)計并封裝了大量的類,函數(shù)式編程方法解決異步編程的困難,并采用多服務(wù)器協(xié)作的方式,提高了服務(wù)器的健壯性和可拓展性。 在實現(xiàn)的過程中學(xué)習(xí)了多種網(wǎng)絡(luò)協(xié)議。
6.2 進(jìn)一步工作的方向
由于時間和能力有限,基于TCP和Websocket協(xié)議的即時通信系統(tǒng)的還不是很完善,系統(tǒng)的一些其他功能和細(xì)節(jié)需要進(jìn)一步的改進(jìn)和增強(qiáng)。需要繼續(xù)完善的功能有:
① 增加文件傳輸、視頻聊天、語音聊天、視頻會議等功能。
② 將C++登錄服務(wù)器也改為Https。
③ 編寫自己的消息隊列服務(wù)器。本系統(tǒng)借助redis高速緩存數(shù)據(jù)庫實現(xiàn)服務(wù)器間消息隊列。
④ 添加系統(tǒng)監(jiān)控功能。由于時間和目前能力有限沒有設(shè)計系統(tǒng)監(jiān)控功能和日志記錄,只是簡單輸出在控制臺界面。
⑤ 對數(shù)據(jù)進(jìn)行分布式存儲。雖然服務(wù)器采用多物理機(jī),但設(shè)計是沒有考慮對數(shù)據(jù)的分布式切割,這對服務(wù)器的拓展性影響很大。
⑥ 更改服務(wù)器數(shù)據(jù)傳輸類型。有些序列化的消息存儲和傳輸通過二進(jìn)制傳輸,雖然性能好,但可讀性比較差,可以將傳輸類型改為JSON數(shù)據(jù)。
參考文獻(xiàn)
[1] 牛曉蕾. 基于 TCP/IP 協(xié)議的安全即時通信系統(tǒng)設(shè)計與實現(xiàn)[D].西安電子科技大學(xué).2007
[2] 史濟(jì)民,顧明華,鄧紅.軟件工程—原理方法與應(yīng)用[M].北京:高等教育出版社.2009
[3] 謝希仁.計算機(jī)網(wǎng)絡(luò)[M].北京:電子工業(yè)出版社.2007
[4] 樸靈.深入淺出Node.js[M].北京:人民郵電出版社.2013
[5] 維基百科 websocket.http://zh.wikipedia.org/wiki/WebSocket.2015-4-14
[6] [美]Scott Meyers. Effective C++[M].北京:電子工業(yè)出版社. 2006-7
[7] [美] Stanley B.Lippman,[美] Josée Lajoie,[美] Barbara E. Moo. C++ Primer 5th Edition[M].北京:電子工業(yè)出版社.2013
[8] 百度百科 boost( C++ 庫).http://baike.baidu.com/subview/663725/10275011.htm.2015
[9] Google Protocol Buffer 的使用和原理. http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ .2011
[10] openssl. http://www.openssl.org/docs/.2015
[11] 百度百科 openssl. http://baike.baidu.com/view/300712.htm. 2015
[12] hiredis .https://github.com/redis/hiredis
[13] socket.io. https://www.npmjs.com/package/socket.io. 2015
[14] 黃健宏. Redis設(shè)計與實現(xiàn)[M].北京:機(jī)械工業(yè)出版社.2014
[15] 百度百科 nginx.http://baike.baidu.com/view/926025.htm.2015
[16] 百度百科 sqlite http://baike.baidu.com/view/19310.htm 2015
[17] 王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論(第四版)[M].北京:高等教育出版社,2007
[18] Nginx .http://nginx.org/en/docs/
[19] 孫鑫. VC++深入詳解[M].北京:電子工業(yè)出版社.2006
[20] 在 muduo 中實現(xiàn) protobuf 編解碼器與消息分發(fā)器. http://www.cnblogs.com/Solstice/archive/2011/04/13/2014362.html#2982572. 2011
[21] 一種自動反射消息類型的 Google Protobuf 網(wǎng)絡(luò)傳輸方案.http://blog.csdn.net/Solstice/article/details/6300108 . 2011-04-03
[22] 封包和拆包. http://blog.csdn.net/fengge8ylf/article/details/793808 .2006-06-03
致謝
省略文章來源:http://www.zghlxwxcb.cn/news/detail-721623.html
5、資源下載
本項目源碼及完整論文如下,有需要的朋友可以點擊進(jìn)行下載。如果鏈接失效可點擊下方卡片掃碼自助下載。文章來源地址http://www.zghlxwxcb.cn/news/detail-721623.html
序號 | 畢業(yè)設(shè)計全套資源(點擊下載) |
---|---|
本項目源碼 | 基于 C+++TCP+Websocket的即時通信系統(tǒng)設(shè)計與實現(xiàn)(源碼+文檔)_ C++__即時通信系統(tǒng).zip |
到了這里,關(guān)于C++畢業(yè)設(shè)計——基于 C+++TCP+Websocket的即時通信系統(tǒng)設(shè)計與實現(xiàn)(畢業(yè)論文+程序源碼)——即時通信系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!