简介
由于网上已经有很多大佬已经做了很多相关项目案例。所以我们应该站在巨人的肩膀上,多向大佬们学习。下面主要是我收集到Netty项目,具体项目怎么实现的,我就不讲了,大佬们已经做得很简单明了。
1.IM聊天类
Netty 入门与实战:仿写微信 IM 即时通讯系统
来自lightningMan大佬的:
https://github.com/lightningMan
Netty 入门与实战:仿写微信 IM 即时通讯系统
使用Netty实现了单聊和群聊,将Netty从基础到项目一体化,可以说是入门Netty不错的选择。
单聊流程
单聊指的是两个用户之间相互聊天。下面我们来看一下,用户单聊的基本流程
- 如上图,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 的程序逻辑结构
同类型的项目还有:
琪琪IM:https://gitee.com/qiqiim/qiqiim-server
2.RPC类
SOFABolt
蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。
地址:https://github.com/sofastack/sofa-bolt
SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。
- 为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上,而不是过多的纠结于网络底层 NIO 的实现以及处理难以调试的网络问题,Netty 应运而生。
- 为了让中间件开发者能将更多的精力放在产品功能特性实现上,而不是重复地一遍遍制造通信框架的轮子,SOFABolt 应运而生。
目前该产品已经运用在了蚂蚁中间件的微服务 (SOFARPC)、消息中心、分布式事务、分布式开关、以及配置中心等众多产品上。
功能介绍
SOFABolt 的基础功能包括:基础通信功能 ( remoting-core )
基于 Netty 高效的网络 IO 与线程模型运用 连接管理 (无锁建连,定时断链,自动重连) 基础通信模型 ( oneway,sync,future,callback ) 超时控制 批量解包与批量提交处理器 心跳与 IDLE 事件处理
协议框架 ( protocol-skeleton )
命令与命令处理器 编解码处理器 心跳触发器
私有协议定制实现 - RPC 通信协议 ( protocol-implementation )
RPC 通信协议的设计 灵活的反序列化时机控制 请求处理超时 FailFast 机制 用户请求处理器 ( UserProcessor ) 双工通信
3.MQTT类
陆陆大神的:https://github.com/1ssqq1lxr/iot_push
MQTT 协议是 IBM 开发的即时通讯协议,相对于 IM 的实际上的准标准协议 XMPP 来说,MQTT 更小,更快,更轻量。MQTT 适合于任何计算能力有限,工作在低带宽、不可靠的网络中的设备,包括手机,传感器等等。
已实现的功能:
发布订阅功能 遗言通知 会话session数据 发布保留消息 主题过滤(/test 会接受到 /test/yy 的主题消息) 实现标准的 qos0 qos1 qos2消息确认机制 ssl加密 支持ws协议 集成spring容器