QQ是如何實現千萬人級別的消息處理(原創)

在這裏插入圖片描述
這段時間因爲在家實在沒事情做,就在想,QQ到底是scoket還是什麼什麼亂七八糟的

後來又到網上撈了一下,才知道QQ通訊原理是這樣的

首先我們平常看見的通訊軟件基本都是scoket並採用tcp協議的,但是仔細研究了一下QQ才分享,QQ卻不是。
QQ採用的是混合型p2p,協議是UDP。一開始我只知道p2p可以用來下載,播放視頻,但是我不知道他居然可以用在即時聊天上,
後來尋找了一下,擁有這項技術的軟件有:QQ、阿里旺旺、MSN、遊戲。範圍挺廣嗷,然後我便仔細研究了一下P2P技術,接下來給大家簡潔的講一下

P2P簡介

P2P,中文名:點對點技術。點對點技術又稱對等互聯網絡技術,是一種網絡新技術,依賴網絡中參與者的計算能力和帶寬,而不是把依賴都聚集在較少的幾臺服務器上。P2P網絡通常用於通過Ad Hoc連接來連接節點。這類網絡可以用於多種用途,各種檔案分享軟件已經得到了廣泛的使用。P2P技術也被使用在類似VoIP等實時媒體業務的數據通信中。
純點對點網絡沒有客戶端或服務器的概念,只有平等的同級節點,同時對網絡上的其它節點充當客戶端和服務器。這種網絡設計模型不同於客戶端-服務器模型,在客戶端-服務器模型中通信通常來往於一箇中央服務器。
有些網絡(如Napster, OpenNAP, 或IRC @find)的一些功能(比如搜索)使用客戶端-服務器結構,而使用P2P結構來實現另外一些功能。類似Gnutella 或Freenet的網絡則使用純P2P結構來實現全部的任務。

具體可以百度:P2P技術(即點對點技術)

會話流程

那麼P2P技術對於服務器的壓力較小,而且完全依賴用戶客戶端,相對於服務器配置不高,而且後期維護擴展,都非常輕鬆。
既然是點對點技術,那麼肯定得先有個用戶客戶端登錄到系統,然後系統獲取用戶的會話信息列表,列表信息有系統中其他用戶的地址,每個用戶都有單獨的地址和識別號,這樣方面系統識別。接下來用戶就可以開始操作了,可以主動向其他用戶發送消息,而且不需要經過服務器!發生消息只需要向其他用戶地址發生操作數據就行了,而且不需要服務器的任何操作!這就是點對點技術的精巧。如果有其他新用戶或用戶推出,會向系統發送通知,並轉發到其他用戶,而且是所有,其他用戶便能實時知道這個用戶的狀態,以及更新其他用戶的會話信息列表

按照上面思路,我們可以設計出下面這些會話流程
用戶通過客戶端進入系統,向系統發送登錄請求

系統收到請求,處理後向用戶客戶端返回相關消息,同意用戶加入,並將系統的服務線程所在的監聽端口告訴用戶,方便通訊

客戶端按照系統給出的端口和系統建立穩定的連接

系統通過連接把剛剛進入的用戶信息傳給新加入的客戶端

客戶端獲得了最新的在線用戶列表,這會,就可以愉快的與其他在線用戶聊天啦

用戶不管是進入或是退出,都需要通知系統以便即時更新在線用戶列表

用戶管理

一個系統爲了能夠穩定高效的運行下去,肯定需要管理功能了,那麼接下來給大家介紹怎麼管理進入你係統的用戶。
系統中,無論是服務器還是用戶客戶端,都需要保存一份在線用戶列表。客戶端的用戶列表從一開始登錄系統後到系統獲取。在程序運行中,服務器需要實時將系統內用戶的變動情況及時的通知在線的每個客戶端成員。
新用戶登錄,系統給個最新的用戶表,並同時向系統內每個成員廣播“新成員login”消息,其他成員收到消息並更新最新用戶表
用戶退出也是同樣,系統也會通知其他用戶,但前提是:用戶退出前必須向服務器發送通知,否則用戶表將不會更新。比如QQ一個用戶客戶端忽然無法使用,該用戶客戶端沒能在退出QQ之前發送退出通知,這將導致其他用戶的因爲該用戶在線,可惜這個用戶不在線,並收不到最新消息

客戶端與服務器會話

登錄過程

客戶端用匿名UDP向系統發送消息,消息內容包含3個字段,分別是:login、username、locallPEndPoint,其中“login”表示請求登錄,“username”爲用戶名,“locallPEndPoint”是客戶端地址
服務器收到匿名UDP返回以下消息
Accept、port

其中。“Accept”表示服務器接受了請求,“port”指服務器返回的端口,服務線程在這個端口監聽客戶連接,該連接使用同步的TCP協議
用戶列表格式如下:
username1,IPEndPoint1;username2,IPEndPoint2;…;end
username1;username2爲用戶名,IPEndPoint1,IPEndPoint2…爲它們對應的端點。每個用戶的信息都有個“用戶名+端點”組成,用戶信息之間以“;”隔開,整個用戶列表以“end”結尾。

服務器協調管理用戶

(1)新用戶加入通知。

由於系統中已存在的每個用戶都有一份當前用戶表,因此當有新成員加入時,服務器無需重複給系統中的每個成員再傳送用戶表,只要將新加入成員的信息告訴系統內的其他用戶,再由他們各自更新自己的用戶表就行了。

服務器向系統內用戶廣播發送如下消息:

端點字段寫爲“remoteIPEndPoint”,表示是遠程某個用戶終端登陸了,本地客戶線程據此更新用戶列表。其實,在這個過程中,服務器只是將受到的“login”消息簡單地轉發而已。

(2)用戶退出。

與新成員加入時一樣,服務器將用戶退出的消息直接進行廣播轉發:

logout,username,remoteIPEndPoint

其中,“remoteIPEndPoint”爲退出系統的遠程用戶終端的端點地址。

用戶終端之間聊天

用戶聊天時,他們各自的客戶端之間是以P2P方式工作的,彼此地位對等,獨立,不與服務器發生直接聯繫。

服務線程

系統運行後,先有服務器啓動服務線程,只需單擊“啓動”按鈕即可。
即時聊天軟件可以在兩名或多名用戶之間傳遞即時消息的網絡軟件,大部分的即時聊天軟件都可以顯示聯絡人名單,並能顯示聯絡人是否在線。使用者發出的每一句話都回即時顯示在雙方的螢幕上。

結尾

是不是還一臉懵?沒關係,我也是,說了這麼多,也只是介紹了點對點技術。

那麼真實實踐該怎麼做呢?等我再研究研究,我會把我的結果分享出來,同時大家也可以上網看一下P2P具體怎麼做到多用戶通訊,以及流程和管理還有服務器控制連接。

QQ畢竟這麼多人使用了這麼多年,對於即時通訊也是大哥中的一等,其技術也不是我們一般人能夠涉及的,但如果多研究,自然也可以開發出來

最後,喜歡文章的可以點個贊哦,並轉發。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章