微信的聊天又分为单聊和群聊,下面分别来介绍一下。源码

单聊流程

单聊指的是两个用户之间相互聊天。下面我们来看一下,用户单聊的基本流程

  1. 如上图,A 要和 B 聊天,首先 A 和 B 需要与服务器建立连接,然后进行一次登录流程,服务端保存用户标识和 TCP 连接的映射关系
  2. A 发消息给 B,首先需要将带有 B 标识的消息数据包发送到服务器,然后服务器从消息数据包中拿到 B 的标识,找到对应的 B 的连接,将消息发送给 B
  3. 任意一方发消息给对方,如果对方不在线,需要将消息缓存,对方上线之后再发送

我们把客户端与服务端之间相互通信的数据包称为指令数据包,指令数据包分为指令和数据,每一种指令对应客户端或者服务端的一种操作,数据部分对应的是指令处理需要的数据。

下面我们先来看一下,要实现单聊,客户端与服务端分别要实现哪些指令:

单聊的指令

指令图示

指令列表

指令内容 客户端 服务端
登录请求 发送 接收
登录响应 接收 发送
客户端发消息 发送 接收
服务端发消息 接收 发送
登出请求 发送 接收
登出响应 接收 发送

群聊流程

群聊指的是一个组内多个用户之间的聊天,一个用户发到群组的消息会被组内任何一个成员接收,下面我们来看一下群聊的基本流程

如上图,要实现群聊,其实和单聊类似

  1. A,B,C 依然会经历登录流程,服务端保存用户标识对应的 TCP 连接
  2. A 发起群聊的时候,将 A,B,C 的标识发送至服务端,服务端拿到之后建立一个群聊 ID,然后把这个 ID 与 A,B,C 的标识绑定
  3. 群聊里面任意一方在群里聊天的时候,将群聊 ID 发送至服务端,服务端拿到群聊 ID 之后,取出对应的用户标识,遍历用户标识对应的 TCP 连接,就可以将消息发送至每一个群聊成员

下面,我们再来看一下群聊除了需要实现上述指令之外,还需要实现的指令集

群聊要实现的指令集

指令图示

指令列表

指令内容 客户端 服务端
创建群聊请求 发送 接收
群聊创建成功通知 接收 发送
加入群聊请求 发送 接收
群聊加入通知 接收 发送
发送群聊消息 发送 接收
接收群聊消息 接收 发送
退出群聊请求 发送 接收
退出群聊通知 接收 发送

Netty

我们使用 Netty 统一的 IO 读写 API 以及强大的 pipeline 来编写业务处理逻辑,在后续的章节中,我会通过 IM 这个例子,带你逐步了解 Netty 的以下核心知识点。

  • 服务端如何启动
  • 客户端如何启动
  • 数据载体 ByteBuf
  • 长连自定义协议如何设计
  • 粘包拆包原理与实践
  • 如何实现自定义编解码
  • pipeline 与 channelHandler
  • 定时发心跳怎么做
  • 如何进行连接空闲检测

客户端使用 Netty 的程序逻辑结构

上面这幅图展示了客户端的程序逻辑结构

  1. 首先,客户端会解析控制台指令,比如发送消息或者建立群聊等指令
  2. 然后,客户端会基于控制台的输入创建一个指令对象,用户告诉服务端具体要干什么事情
  3. TCP 通信需要的数据格式为二进制,因此,接下来通过自定义二进制协议将指令对象封装成二进制,这一步称为协议的编码
  4. 对于收到服务端的数据,首先需要截取出一段完整的二进制数据包(拆包粘包相关的内容后续小节会讲解)
  5. 将此二进制数据包解析成指令对象,比如收到消息
  6. 将指令对象送到对应的逻辑处理器来处理

服务端使用 Netty 的程序逻辑结构

服务端的程序逻辑结构与客户端非常类似,这里不太赘述。

netty之微信-IM简介(二)相关推荐

  1. 微信开发sdk_二次开发微信API更新日志

    微信开发sdk_二次开发微信API更新日志 微信开发sdk_二次开发微信API更新日志 2.6.35 清粉优化 小于1k的图片发送失败的问题 联系人资料新增电话号码和描述 发布2.6.31->2 ...

  2. 微信小程序生成二维码可文字,链接,图片(支持中文)

    功能简介 : 微信小程序生成二维码,支持文本和网址,支持中英文,输入框可清空,可单击保存二维码...... 核心代码 : createQrCode:function(url,canvasId,cavW ...

  3. PHP支付接口教程,详解微信支付(二)

    PC扫码支付 扫码支付首先是要分清楚两种模式: [模式一]:商户后台系统根据微信支付规则链接生成二维码,链接中带固定参数productid(可定义为产品标识或订单号).[模式二]:商户后台系统调用微信 ...

  4. 适合新手学习的laravel接入微信接口,实现微信公众号二次开发

    2019独角兽企业重金招聘Python工程师标准>>> 最近使用laravel做微信公众号二次开发,发现网上能够参考的资料基本上很少,很多地方都讲的不够详细,致使许多新手采坑无数,所 ...

  5. 微信扫描普通二维码进入小程序

    微信扫描普通二维码进入小程序的方法,和代码没有什么关系,主要是在小程序平台进行设置 1. 开发配置 开发 -- 开发管理 -- 开发设置 -- 扫普通链接二维码打开小程序 2. 配置规则 根据说明配置 ...

  6. 【微信小程序】微信小程序生成二维码报错errcode=41030,invalid page rid

    场景 调用微信小程序生成二维码接口,提示报错 错误内容 array(2) {["errcode"] => int(41030)["errmsg"] =&g ...

  7. 微信公众号二次开发可以做哪些功能?

    微信公众平台现在很多商家企业都在使用,但如何通过微信公众平台展现自己企业的特色和优势,给客户提供更多便利功能,进而通过微信公众平台为企业带来更多的益处呢? 这是众多使用微信公众平台的商家企业需要深入思 ...

  8. 如何给CSDN博客添加微信公众号二维码或自定义栏目

    1. 前言 在浏览CSDN博客的过程中,我们可以发现有些博主的主页有微信公众号二维码等一些个人栏目信息.这可以让其他浏览博客的游客和作者进行有效的沟通,同时也可以在博客里对自己的微信公众号作宣传.我这 ...

  9. thinkphp5+php微信公众号二维码扫码关注推广二维码事件实现

    thinkphp5微信公众号二维码扫码关注推广二维码事件实现, 给出实现的全部方法: 获取二维码,让微信公众号跳转到以下代码的code方法即可,用户点击二维码后,通过二维码获取关注用户信息及二维码推广 ...

最新文章

  1. java多附件上传 实例demo
  2. StandardWrapper ...$$EnhancerByCGLIB$$b9
  3. 【错误记录】Android Studio 编译报错 ( AppCompat does not support the current theme features )
  4. java6集合编程题
  5. HDU 2222 ac自动机模板
  6. 计算机初级考试题库网络管理,计算机基础考试题库(含答案)
  7. python class用法理解_Python小世界:彻底搞懂Python一切皆对象!
  8. linux之systemctl命令
  9. 【HDU 5384】Danganronpa(AC自己主动机)
  10. Python 获取URL访问的HEAD头信息
  11. 一个请求里能有多个cookie吗_从一个男人对女人家人的态度里,能看出他有多爱对方吗?...
  12. 小程序-时间管理工具
  13. Atitit 前端测试最简化内嵌web服务器 php 与node.js 目录 1.1. php内置Web Server 1 1.2. Node的 2 Node的比较麻烦些。。Php更加简单
  14. python下载快手视频教程_python如何下载快手视频
  15. 2022道路运输企业安全生产管理人员考试题及答案
  16. statcounter统计的浏览器市场占有率
  17. VM虚拟机安装及安装Windows系统
  18. android定位4g不准,定位不准/失败的处理方法
  19. python调用加签名的接口_python接入开放平台:签名验签、加密解密、授权认证的测试方法...
  20. 360安全卫士防黑加固关闭了Telnet远程连接服务,如何开启?

热门文章

  1. SDH原理--1.SDH概述
  2. java sapi_使用Microsoft SAPI进行语音合成
  3. OS学习笔记-18(清华大学慕课)信号量
  4. [Oracle] 一个通过添加本地分区索引提高SQL性能的案例
  5. 【HTML】input多行文本
  6. 用python如何制作表格_Python中如何用xlwt制作表格
  7. 手机共享电脑的proxy网络
  8. 掌阅科技让数字化阅读更便捷
  9. JDBC的一些API
  10. Oracle EBS 常用表 查询语句