netty之微信-IM简介(二)
微信的聊天又分为单聊和群聊,下面分别来介绍一下。源码
单聊流程
单聊指的是两个用户之间相互聊天。下面我们来看一下,用户单聊的基本流程
- 如上图,A 要和 B 聊天,首先 A 和 B 需要与服务器建立连接,然后进行一次登录流程,服务端保存用户标识和 TCP 连接的映射关系
- A 发消息给 B,首先需要将带有 B 标识的消息数据包发送到服务器,然后服务器从消息数据包中拿到 B 的标识,找到对应的 B 的连接,将消息发送给 B
- 任意一方发消息给对方,如果对方不在线,需要将消息缓存,对方上线之后再发送
我们把客户端与服务端之间相互通信的数据包称为指令数据包,指令数据包分为指令和数据,每一种指令对应客户端或者服务端的一种操作,数据部分对应的是指令处理需要的数据。
下面我们先来看一下,要实现单聊,客户端与服务端分别要实现哪些指令:
单聊的指令
指令图示
指令列表
指令内容 | 客户端 | 服务端 |
---|---|---|
登录请求 | 发送 | 接收 |
登录响应 | 接收 | 发送 |
客户端发消息 | 发送 | 接收 |
服务端发消息 | 接收 | 发送 |
登出请求 | 发送 | 接收 |
登出响应 | 接收 | 发送 |
群聊流程
群聊指的是一个组内多个用户之间的聊天,一个用户发到群组的消息会被组内任何一个成员接收,下面我们来看一下群聊的基本流程
如上图,要实现群聊,其实和单聊类似
- A,B,C 依然会经历登录流程,服务端保存用户标识对应的 TCP 连接
- A 发起群聊的时候,将 A,B,C 的标识发送至服务端,服务端拿到之后建立一个群聊 ID,然后把这个 ID 与 A,B,C 的标识绑定
- 群聊里面任意一方在群里聊天的时候,将群聊 ID 发送至服务端,服务端拿到群聊 ID 之后,取出对应的用户标识,遍历用户标识对应的 TCP 连接,就可以将消息发送至每一个群聊成员
下面,我们再来看一下群聊除了需要实现上述指令之外,还需要实现的指令集
群聊要实现的指令集
指令图示
指令列表
指令内容 | 客户端 | 服务端 |
---|---|---|
创建群聊请求 | 发送 | 接收 |
群聊创建成功通知 | 接收 | 发送 |
加入群聊请求 | 发送 | 接收 |
群聊加入通知 | 接收 | 发送 |
发送群聊消息 | 发送 | 接收 |
接收群聊消息 | 接收 | 发送 |
退出群聊请求 | 发送 | 接收 |
退出群聊通知 | 接收 | 发送 |
Netty
我们使用 Netty 统一的 IO 读写 API 以及强大的 pipeline 来编写业务处理逻辑,在后续的章节中,我会通过 IM 这个例子,带你逐步了解 Netty 的以下核心知识点。
- 服务端如何启动
- 客户端如何启动
- 数据载体 ByteBuf
- 长连自定义协议如何设计
- 粘包拆包原理与实践
- 如何实现自定义编解码
- pipeline 与 channelHandler
- 定时发心跳怎么做
- 如何进行连接空闲检测
客户端使用 Netty 的程序逻辑结构
上面这幅图展示了客户端的程序逻辑结构
- 首先,客户端会解析控制台指令,比如发送消息或者建立群聊等指令
- 然后,客户端会基于控制台的输入创建一个指令对象,用户告诉服务端具体要干什么事情
- TCP 通信需要的数据格式为二进制,因此,接下来通过自定义二进制协议将指令对象封装成二进制,这一步称为协议的编码
- 对于收到服务端的数据,首先需要截取出一段完整的二进制数据包(拆包粘包相关的内容后续小节会讲解)
- 将此二进制数据包解析成指令对象,比如收到消息
- 将指令对象送到对应的逻辑处理器来处理
服务端使用 Netty 的程序逻辑结构
服务端的程序逻辑结构与客户端非常类似,这里不太赘述。
netty之微信-IM简介(二)相关推荐
- 微信开发sdk_二次开发微信API更新日志
微信开发sdk_二次开发微信API更新日志 微信开发sdk_二次开发微信API更新日志 2.6.35 清粉优化 小于1k的图片发送失败的问题 联系人资料新增电话号码和描述 发布2.6.31->2 ...
- 微信小程序生成二维码可文字,链接,图片(支持中文)
功能简介 : 微信小程序生成二维码,支持文本和网址,支持中英文,输入框可清空,可单击保存二维码...... 核心代码 : createQrCode:function(url,canvasId,cavW ...
- PHP支付接口教程,详解微信支付(二)
PC扫码支付 扫码支付首先是要分清楚两种模式: [模式一]:商户后台系统根据微信支付规则链接生成二维码,链接中带固定参数productid(可定义为产品标识或订单号).[模式二]:商户后台系统调用微信 ...
- 适合新手学习的laravel接入微信接口,实现微信公众号二次开发
2019独角兽企业重金招聘Python工程师标准>>> 最近使用laravel做微信公众号二次开发,发现网上能够参考的资料基本上很少,很多地方都讲的不够详细,致使许多新手采坑无数,所 ...
- 微信扫描普通二维码进入小程序
微信扫描普通二维码进入小程序的方法,和代码没有什么关系,主要是在小程序平台进行设置 1. 开发配置 开发 -- 开发管理 -- 开发设置 -- 扫普通链接二维码打开小程序 2. 配置规则 根据说明配置 ...
- 【微信小程序】微信小程序生成二维码报错errcode=41030,invalid page rid
场景 调用微信小程序生成二维码接口,提示报错 错误内容 array(2) {["errcode"] => int(41030)["errmsg"] =&g ...
- 微信公众号二次开发可以做哪些功能?
微信公众平台现在很多商家企业都在使用,但如何通过微信公众平台展现自己企业的特色和优势,给客户提供更多便利功能,进而通过微信公众平台为企业带来更多的益处呢? 这是众多使用微信公众平台的商家企业需要深入思 ...
- 如何给CSDN博客添加微信公众号二维码或自定义栏目
1. 前言 在浏览CSDN博客的过程中,我们可以发现有些博主的主页有微信公众号二维码等一些个人栏目信息.这可以让其他浏览博客的游客和作者进行有效的沟通,同时也可以在博客里对自己的微信公众号作宣传.我这 ...
- thinkphp5+php微信公众号二维码扫码关注推广二维码事件实现
thinkphp5微信公众号二维码扫码关注推广二维码事件实现, 给出实现的全部方法: 获取二维码,让微信公众号跳转到以下代码的code方法即可,用户点击二维码后,通过二维码获取关注用户信息及二维码推广 ...
最新文章
- 蓝桥杯国赛知识点汇总
- 闲鱼亿级商品结构化背后的思考和演进
- python语言入门m-Python入门基础三-函数
- MySQL第8天:MySQL索引优化分析之SQL慢
- 新增达达设计的8个Skin
- Docker新手入门:基本用法
- andorid平台游戏内存修改器的开发思路
- MiniGui移植详解1【转】
- Python中DataFrame去重
- 《编码-隐匿在计算机软硬背后的语言》第七章我们的十个数字
- 澳洲大学计算机本科课程,澳洲留学 澳洲大学的本科课程分为6大类
- 【新书推荐】【2019.01】离散数学及其应用(第五版)
- 16比9尺寸是多少厘米_16:9是多大的尺寸?
- CMMB手机电视入网咋就这么难?
- 自考学习记录 课程代码03708《中国近代史纲要》1
- 网络硬件三剑客的集线器(Hub)、交换机(Switch)与路由器(Router)
- CTFShow“萌心区”WP(上)
- [Python爬虫] 三、数据抓取之Requests HTTP 库
- 、HTML“计算机输出”标签codekbdsampttvarpre
- scikit-learn 支持向量机算法库使用小结
热门文章
- 传网络安全提供商FireEye有意收购CyberArk
- 使用three.js模拟城市灯光秀
- 你所不了解的微服务架构
- H264编码原理(无损压缩)
- 计算机在未来医学中的应用,【-通信传播论文:计算机技术在医学中的应用材料】...
- 小程序可通过这三种方式去做竞品分析
- 关于HTML实现拖放时出现禁止图标的解决方案
- 显示空闲链表和隐式空闲链表_使用空闲资源添加Espresso UI测试
- 【Android】解决aab上传Google Play后下载语言文件缺失的问题
- esp8266 OTA 云远程更新固件 wifiupdate