QQ是如何实现千万人级别的消息处理(原创)
本文最后更新于 1560 天前,其中的信息可能已经有所发展或是发生改变。

3i21AJ.jpg

这段时间因为在家实在没事情做,就在想,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技术(即点对点技术)
3i2Q74.jpg

会话流程

那么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毕竟这么多人使用了这么多年,对于即时通讯也是大哥中的一等,其技术也不是我们一般人能够涉及的,但如果多研究,自然也可以开发出来

最后,喜欢文章的可以点个赞哦,并转发。
3i23N9.jpg

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇