服务器发送消息技术,知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)...
本文由作者“巩鹏军“原创发布于微信公众号“巩鹏军”,原题《IM即时通讯 - 消息是怎么送达的?》,即时通讯收录时有修订和改动,感谢作者的分享。
即时通讯网收录和修订,已征得原作者同意。如需转载,请注明详细出处,请尊重原作者的劳动。
1、引言
沟通是人类的最基本需求,复杂多变的沟通内容、沟通方式,正是人类文明之所以如此璀璨的关键所在。
timg-(1).jpg (24.28 KB, 下载次数: 130)
2 年前 上传
在自然界中,要完成一件事情的沟通,我们可以直接通过声音传递给对方,这是再平常不过的事了(靠“吼”就能解决)。
随着计算机的普及,互联网改变了我们的生活,甚至改变了我们的沟通方式。现在,“有什么事微信或QQ上找我”已经是很多的人口头禅了。
timg (2).jpeg (10.75 KB, 下载次数: 134)
2 年前 上传
那么,作为不懂技术的普通人,有没有想过,你每次使用QQ或微这种IM聊天应用时,你所发送的消息,是如何被计算机送达给对方的?(这显然不可能靠“吼”解决 ^_^)
本文将从非技术人员的视角,为你讲解一下IM聊天应用中的聊天消息是怎么发送的。
2、关于作者
a.jpg (13.8 KB, 下载次数: 139)
2 年前 上传
巩鹏军:专注移动开发十多年,热爱即时通讯技术。个人微信公众号:“巩鹏军”。
3、阅读对象
本文适合非技术背景的读者阅读,如您喜欢本文,则下列文章您也可能喜欢:
如果您是专业技术人员,则跟本文相关的专业技术知识等,可以以下文章中找到:
4、在微信里,我们发送一条聊天消息是如此简单
李雷在手机上打开微信(IM客户端),在聊天输框中输入“Hello!”,点击发送。几乎是瞬间,韩梅梅手机上的微信(IM客户端)就会显示李雷的头像后面跟着“Hello!”。
整个过程如下图所示:
1.jpg (58.17 KB, 下载次数: 123)
2 年前 上传
▲ 一条聊天消息发送的全过程
从上面的图示可以看到,整个过程涉及三大部分:
1)李雷手机上的IM客户端(微信);
2)IM服务端;
3)韩梅梅手机上的IM客户端(微信)。
下面,我们逐一介绍每个部分的具体工作原理。
5、消息发送者:发送端是怎么工作的?
先看看发送端,李雷手机上的IM客户端中发生了什么?
2.jpg (46.76 KB, 下载次数: 105)
2 年前 上传
从上图可以看出,发送一条信息经过三个步骤:
1)消息编辑:
李雷操作键盘输入要发送的文字,点击“发送”按钮。这一切都发生在IM客户端的界面模块中。类似用笔在信纸上写信,键盘就是笔,聊天框就是信纸;
2)消息入库:
IM客户端中的数据模块会先将聊天内容“Hello!”加上谁发给谁等信息,按标准格式打包为一条IM消息,并存入本地数据库。这类似信纸装入信封,填写地址,投入邮箱的过程。一条IM消息就是一封信,本地数据库就是李雷家的邮箱;
3)消息发送:
IM客户端中的网络模块通过长连接将IM消息发给IM服务端。这类似邮递员将信件汇总发往邮政局。网络模块就是邮递员,IM服务端就是邮政局。(长连接是IM客户端跟IM服务端一直保持的网络链路)。
6、消息“中转站”:IM服务端是怎么工作的?
担负“邮政局”职责的IM服务端是IM世界中全知全能的神,它认识所有人,经手所有消息,跟每个人都一直保持联系(长连接)。
3.jpg (37.9 KB, 下载次数: 123)
2 年前 上传
每条消息在IM服务端中都要至少经过以下处理:
1)消息接收:
长连接服务从和李雷的长连接接收到“Hello!”的IM消息。IM服务端跟所有登录的IM客户端保持长连接(一条一直活跃的网络链路,每个客户端一条),长连接上定时会有心跳消息来监测客户端的在线离线状态,心跳消息就像邮递员每天都会在邮政局和邮箱之间巡回一样;
2)消息验证:
用户服务查询IM消息的目标人韩梅梅,以及发送人李雷和目标人韩梅梅是否好友关系,确保韩梅梅是真实存在而非虚构的,并且韩梅梅愿意接收李雷的消息,否则会给李雷退信。(一般IM服务端会将IM消息的副本存入数据库中备份);
3)消息转发:
在长连接服务中找到跟韩梅梅手机上IM客户端保持的长连接,并将消息发送给韩梅梅。
7、消息接收者:接收端又是怎么工作的呢?
下面看看韩梅梅手机上发生了什么?
4.jpg (43.78 KB, 下载次数: 118)
2 年前 上传
韩梅梅手机上的IM客户端和李雷(发送者)的是一样的,但处理步骤是不同的:
1)消息接收:
网络模块通过跟IM服务端保持的长连接接收IM消息;
2)消息入库:
网络模块会将IM消息存入本地数据库,即信件投入了韩梅梅家的邮箱。网络模块就是邮递员,本地数据库就是韩梅梅家的邮箱;
3)消息展示:
界面模块获取发送人头像,和消息内容一起显示在聊天界面上。
经过上述过程,韩梅梅在自己手机上就看到了李雷发过来的“Hello!”,因为李雷和韩梅梅都是一直和服务器保持长连接,所以上述过程是瞬间完成的,李雷和韩梅梅感觉就像面对面聊天一样方便。这也是Instant Messaging名字的来历。
(原文链接:点击进入)
服务器发送消息技术,知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)...相关推荐
- im中的定位消息 ios_知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)...
1.引言 沟通是人类的最基本需求,复杂多变的沟通内容.沟通方式,正是人类文明之所以如此璀璨的关键所在. 在自然界中,要完成一件事情的沟通,我们可以直接通过声音传递给对方,这是再平常不过的事了(靠&qu ...
- 设计两个程序要求用消息队列实现简单的聊天功能linux,Linux C 消息队列实现简单的聊天功能...
消息队列是提供一种带有数据标识的特殊管道,使得每一段被写入的数据都变成带标识的消息,读取该段消息的进程只要指定这个标识就可以正确地读取,而不会受到其他消息的干扰,.一个带标识的消息队列,就像并存的管道 ...
- 收藏 | 服务器和存储技术知识
第1章.什么是服务器 第2章.服务器部件技术 第3章.服务器相关软件和应用 来源:高性能计算专业委员会(HPCTC) 原文:https://mp.weixin.qq.com/s/ucYRcW9PfKP ...
- 建议收藏:服务器和存储技术知识
资料免费送(点击链接下载) 史上最全,数据中心机房标准及规范汇总(下载) 数据中心运维管理 | 资料汇总(2017.7.2版本) 加入运维管理VIP群(点击链接查看) <数据中心运维管理> ...
- 局域网服务器发送消息,Java实现简单局域网聊天室
本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下 Java 的Socket编程: 1.TCP协议是面向连接的.可靠的.有序的.以字节流的方式发送数据,通过三次握手方 ...
- IM聊天应用是如何将消息发送给对方的
沟通是人类的最基本需求,复杂多变的沟通内容.沟通方式,正是人类文明之所以如此璀璨的关键所在. 在自然界中,要完成一件事情的沟通,我们可以直接通过声音传递给对方,这是再平常不过的事了(靠"吼& ...
- 直播系统聊天技术(四):百度直播的海量用户实时消息系统架构演进实践
本文原题"百度直播消息服务架构实践",由百度APP消息中台团队原创分享于"百度Geek说"公众号,为了让文章内容更通俗易懂,本次已做排版优化和内容重新划分,原文 ...
- Python Web实时消息后台服务器推送技术---GoEasy
越来越多的项目需要用到实时消息的推送与接收,怎样实现最方便呢?我这里推荐大家使用GoEasy,它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持we ...
- C# Web实时消息后台服务器推送技术---GoEasy
越来越多的项目需要用到实时消息的推送与接收,怎样实现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持w ...
最新文章
- Apache服务器和tomcat服务器有什么区别?
- PIE SDK影像快速拼接
- java 注解 enum_13 Java枚举和注解
- 《深入解析Android 虚拟机》——第1章,第1.3节编译Android源码
- oracle 使从表中随机取出一行记录数据
- centos7.6arm安装mysql8.0.17_Centos yum安装 MySQL 5.7
- 使用Android高性能音频--OpenSL ES和AAudio
- Protobuf序列化的原理-总结
- python Pillow 的简单案例
- 计算机操作系统原理精品课程,计算机操作系统原理.ppt
- 省钱有简单的祛痘方法 - 健康程序员,至尚生活!
- 【Essay】开始研究生小论文的撰写
- 深入理解java:线程本地变量 java.lang.ThreadLocal类
- 用python爬虫批量下载pdf
- 联想微型计算机ai0,联想baby AI
- android 热点 连接电脑上网,安卓手机做wifi热点让笔记本上网的方法
- 英语学习软件——《经典双语广告语大全》(图)
- 沉淀+树脂吸附工艺为铅酸电池废水处理提供新思路
- SQL学习(四)Where语句中的各种匹配方式
- 岛屿问题和昆虫越障问题以及岛屿最大面积
热门文章
- RocketMQ的Producer详解之分布式事务消息(回顾事务)
- 【Homework】说出 == 和 equals 的区别
- vue路由跳转权限_如何在vue中实现路由跳转判断用户权限功能?
- html动画效果放大,一个CSS+jQuery实现的放大缩小动画效果
- 解决MySQL报错ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)
- 【报错笔记】MAVEN pom.xml 报错解决方法
- 怎样将WPS转换word格式?如何进行操作
- 修改Tomcat7的/webapps/ROOT发布路径
- 《数据结构与抽象:Java语言描述(原书第4版)》一练习
- public static float CompareExchange(ref float location1,float value,float comparand)