知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)
1、引言
沟通是人类的最基本需求,复杂多变的沟通内容、沟通方式,正是人类文明之所以如此璀璨的关键所在。

在自然界中,要完成一件事情的沟通,我们可以直接通过声音传递给对方,这是再平常不过的事了(靠“吼”就能解决)。
随着计算机的普及,互联网改变了我们的生活,甚至改变了我们的沟通方式。现在,“有什么事微信或QQ上找我”已经是很多的人口头禅了。

那么,作为不懂技术的普通人,有没有想过,你每次使用QQ或微这种IM聊天应用时,你所发送的消息,是如何被计算机送达给对方的?(这显然不可能靠“吼”解决 ^_^)
本文将从非技术人员的视角,为你讲解一下IM聊天应用中的聊天消息是怎么发送的。
学习交流:
- 即时通讯/推送技术开发交流4群:101279154[推荐]
- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》
(本文同步发布于:http://www.52im.net/thread-2433-1-1.html)
2、关于作者

巩鹏军:专注移动开发十多年,热爱即时通讯技术。个人微信公众号:“巩鹏军”。
3、阅读对象
本文适合非技术背景的读者阅读,如您喜欢本文,则下列文章您也可能喜欢:
《技术往事:微信估值已超5千亿,雷军曾有机会收编张小龙及其Foxmail》
《技术往事:史上最全QQ图标变迁过程,追寻IM巨人的演进历史》
《开发往事:深度讲述2010到2015,微信一路风雨的背后》
《开发往事:记录微信3.0版背后的故事(距微信1.0发布9个月时)》
《前创始团队成员分享:盘点微信的前世今生——微信成功的必然和偶然》
《[技术脑洞] 如果把14亿中国人拉到一个微信群里技术上能实现吗?》
《QQ和微信止步不前,意味着即时通讯社交应用创业的第2春已来?》
《即时通讯创业必读:解密微信的产品定位、创新思维、设计法则等》
《老罗最新发布了“子弹短信”这款IM,主打熟人社交能否对标微信?》
如果您是专业技术人员,则跟本文相关的专业技术知识等,可以以下文章中找到:
好了,费话不多说,我们开始正文部分。。。
4、在微信里,我们发送一条聊天消息是如此简单
李雷在手机上打开微信(IM客户端),在聊天输框中输入“Hello!”,点击发送。几乎是瞬间,韩梅梅手机上的微信(IM客户端)就会显示李雷的头像后面跟着“Hello!”。
整个过程如下图所示:

从上面的图示可以看到,整个过程涉及三大部分:
1)李雷手机上的IM客户端(微信);
2)IM服务端;
3)韩梅梅手机上的IM客户端(微信)。
下面,我们逐一介绍每个部分的具体工作原理。
5、消息发送者:发送端是怎么工作的?
先看看发送端,李雷手机上的IM客户端中发生了什么?

从上图可以看出,发送一条信息经过三个步骤:
1)消息编辑:
李雷操作键盘输入要发送的文字,点击“发送”按钮。这一切都发生在IM客户端的界面模块中。类似用笔在信纸上写信,键盘就是笔,聊天框就是信纸;
2)消息入库:
IM客户端中的数据模块会先将聊天内容“Hello!”加上谁发给谁等信息,按标准格式打包为一条IM消息,并存入本地数据库。这类似信纸装入信封,填写地址,投入邮箱的过程。一条IM消息就是一封信,本地数据库就是李雷家的邮箱;
3)消息发送:
IM客户端中的网络模块通过长连接将IM消息发给IM服务端。这类似邮递员将信件汇总发往邮政局。网络模块就是邮递员,IM服务端就是邮政局。(长连接是IM客户端跟IM服务端一直保持的网络链路)。
6、消息“中转站”:IM服务端是怎么工作的?
担负“邮政局”职责的IM服务端是IM世界中全知全能的神,它认识所有人,经手所有消息,跟每个人都一直保持联系(长连接)。

每条消息在IM服务端中都要至少经过以下处理:
1)消息接收:
长连接服务从和李雷的长连接接收到“Hello!”的IM消息。IM服务端跟所有登录的IM客户端保持长连接(一条一直活跃的网络链路,每个客户端一条),长连接上定时会有心跳消息来监测客户端的在线离线状态,心跳消息就像邮递员每天都会在邮政局和邮箱之间巡回一样;
2)消息验证:
用户服务查询IM消息的目标人韩梅梅,以及发送人李雷和目标人韩梅梅是否好友关系,确保韩梅梅是真实存在而非虚构的,并且韩梅梅愿意接收李雷的消息,否则会给李雷退信。(一般IM服务端会将IM消息的副本存入数据库中备份);
3)消息转发:
在长连接服务中找到跟韩梅梅手机上IM客户端保持的长连接,并将消息发送给韩梅梅。
7、消息接收者:接收端又是怎么工作的呢?
下面看看韩梅梅手机上发生了什么?

韩梅梅手机上的IM客户端和李雷(发送者)的是一样的,但处理步骤是不同的:
1)消息接收:
网络模块通过跟IM服务端保持的长连接接收IM消息;
2)消息入库:
网络模块会将IM消息存入本地数据库,即信件投入了韩梅梅家的邮箱。网络模块就是邮递员,本地数据库就是韩梅梅家的邮箱;
3)消息展示:
界面模块获取发送人头像,和消息内容一起显示在聊天界面上。
经过上述过程,韩梅梅在自己手机上就看到了李雷发过来的“Hello!”,因为李雷和韩梅梅都是一直和服务器保持长连接,所以上述过程是瞬间完成的,李雷和韩梅梅感觉就像面对面聊天一样方便。这也是Instant Messaging名字的来历。
(本文同步发布于:http://www.52im.net/thread-2433-1-1.html)
知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)的更多相关文章
- Android学习之基础知识五—编写聊天界面
第一步:在app/build.grandle添加RecyclerView依赖库 第二步:在activity_main.xml文件中编写主界面:聊天.发送框.发送按钮三个部分 第三步:编写Message ...
- xmpp和OpenFire示例,即时聊天室,支持离线消息
让我说说为什么写这个博客,这是因为我在上周末的研究XMPP和OpenFire,从互联网上下载Demo,但跑不起来.它花了很长的时间.它被改造.抬高.篇博文也是希望后边学习XMPP和OpenFire的同 ...
- 七、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-聊天消息项的实现
会话好友列表的实现 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展 ...
- TCP/IP协议知识科普
简介 本文主要介绍了工作中常用的TCP/IP对应协议栈相关基础知识,科普文. 本博客所有文章:http://www.cnblogs.com/xuanku/p/index.html TCP/IP网络协议 ...
- SI - 硬件 - 服务器 - 知识科普
服务器对每个从事IT工作的人来说并不陌生,但是服务器所涉及的各种知识细节,并非大家都十分清楚,为了让大家深入了解服务器的关键知识点,笔者特意抽时间总结了这篇科普文章,旨在帮助读者全面了解服务器.今天内 ...
- 由"永恒之蓝"病毒而来的电脑知识科普
永恒之蓝病毒事件: 继英国医院被攻击,随后在刚刚过去的5月12日晚上20点左右肆虐中国高校的WannaCry勒索事件,全国各地的高校学生纷纷反映,自己的电脑遭到病毒的攻击,文档被加密,壁纸遭到篡改,并 ...
- setInterval和setTimeout调用方法小知识科普
function a() { alert('hello'); } setInterval(a, ); setInterval(a(), ); setInterval(); setInterval(); ...
- 一幅图的知识科普--Google免费DNS服务器
学习源于问题的解决 前段时间在虚拟机上安装了一个oracle软件,虚拟机和宿主机器的网络连接方式是桥接模式的,手动设置了静态ip地址,网关地址,但是发现虚拟机的浏览器不能用. 于是通过ping测试了一 ...
- 【新手向】自用的tooltip小插件,前端插件知识科普~
上面的tooltip就是成品图,为了和自己站点的风格保持一致所以自己写的. 第一部分:你绝对碰到过的匿名函数闭包问题 第二部分:写个tooltip demo 第三部分:源码地址 第一部分 你绝对碰到过 ...
随机推荐
- mac里用PyCharm中引用MySqlDB始末
本来想用java来连数据库,然后调用python的,后来想了想,反正是个实验性质的小工程何必搞的这么复杂.直接全部python就好了,于是就为这个想法填了一晚上的坑. 装好了PyCharm的CE版,然 ...
- 你不知道的JavaScript--Item5 全局变量
1.尽量少用全局对象 全局变量的问题在于,你的JavaScript应用程序和web页面上的所有代码都共享了这些全局变量,他们住在同一个全局命名空间,所以当程序的两个不同部分定义同名但不同作用的全局变量 ...
- 『网络の转载』关于初学者上传文件到github的方法
说来也惭愧,我是最近开始用github,小白一个,昨天研究了一个下午.终于可以上传了,所以今天写点,一来分享是自己的一些经验,二来也是做个记录,万一哪天又不记得了:) 废话不多说,直接来,这次主要介绍 ...
- STL--multiset用法
multiset: multiset<int>s; 定义正向迭代器与正向遍历: multiset<int>::iterator it; for(it=s.begin();it! ...
- eclipse使用Git基本流程
1.安装GIT 2.Git的使用 ①下载代码到eclipse(右键导入工程) ②提交代码到本地(commit) ③更新代码到本地(pull) ④当本地出现冲突时,解决冲突,没有冲突当然就最好啦 ⑤提交 ...
- 【SAP S/4 1511之变】:主数据之变
本博文主要讲述SAP S/4 1511版本的变化,主要是跟ECC版本的对比.变化还是挺多的,相当一部分是后勤,但绝大部分还是财务成本这一块.作为从事S/4版本的从业者,了解1511版本的变化还是挺有必 ...
- Resnet论文翻译
摘要 越深层次的神经网络越难以训练.我们提供了一个残差学习框架,以减轻对网络的训练,这些网络的深度比以前的要大得多.我们明确地将这些层重新规划为通过参考输入层x,学习残差函数,来代替没有参考的学习函数 ...
- 【转】超酷的 mip-infinitescroll 无限滚动(无限下拉)
写在前面 无限滚动技术(又叫做无限下拉技术)被广泛应用于新闻类,图片预览类网站.对用户来讲,使用无限滚动的页面有源源不断的信息可以预览,增加用户在页面的停留时长.技术上原理也很简单,在页面加载时加载一 ...
- SSRS报表服务随笔(rdl报表服务)-报表数据:使用第三方控件生成条形码
因为工作需要,需要将订单号显示成条形码,比如数据库存储的20190106A,我需要把这个转换为Code128来显示出来 在国内我没有找到这方面的教程,最后还是一个人自己摸索出来的 在这里我是使用的是B ...
- Redis in .NET Core 入门:(3) Hash
第1篇:https://www.cnblogs.com/cgzl/p/10294175.html 第2篇 String:https://www.cnblogs.com/cgzl/p/10297565. ...