您当前的位置:首页 > 电脑百科 > 软件技术 > 软件技术

使用 Netty 实现一个 IM 即时通讯系统

时间:2022-09-23 13:38:49  来源:今日头条  作者:爱马士团团长

一、目录介绍

  • 功能梳理
  • 具体实现

二、需求梳理

通过前面两章内容的学习,我们基本学会了如何使用.NETty 建立一个长连接,接下来我们就在这个基础上,实现一个单机版的 im 系统。

主要功能,我梳理了一下:

  • 登录
  • 维持连接、心跳检测
  • 聊天消息
  • 消息ack

使用到的相关组件:

  • SpringBoot-job
  • GuavaCache

三、具体实现

本期的内容是基于,原理篇一的 dome 代码基础上进行的,没有看过的原理一的小伙伴,建议先回顾一下原理篇一。

原理篇一的代码结构:

  • Server(主程序)
    • ServerHandler(业务处理程序)

实战篇一的代码结构:

 

代码的层级结构如上所示,接下来,我们将会一个个模块对逻辑进行讲解。

1、登录

1)实现逻辑

不管是长连接还是短连接,鉴权这个动作都是要有的,我相信这个功能模块,大家是很好理解的。我这里就不在过多的赘述了,具体实现步骤如下所示:

1、前后端建立 ws 连接

2、前端发送登录类型的报文,如下所示:

{
    "token": "2",
    "type": "10"
}

token:这里的 token,就是用户登录标识,大家可以根据自己所依赖的业务系统,进行修改。

type:这里表示消息报文的类型,本文所有类型定义如下所示:

  • USER_LOGIN(10, "用户上线")
  • USER_LOGIN_RESP(11, "用户上线响应")
  • HEARTBEAT_TIMEOUT(30, "心跳超时")
  • PING(40, "心跳")
  • PONG(41, "心跳响应")
  • CHAT(80, "聊天"),
  • CHAT_RESP(81, "聊天响应")
  • ACK(90, "确认")
  • ACK_RESP(91, "确认响应")
  • UNKNOWN(0, "未知类型")

示例代码如下图所示,WsMsgDispatcher.dispatch

 

消息类型

3、后端对 token 进行校验,校验成功就记录用户登录信息。

示例代码如下图所示,UserLoginProcessor.login

 

登录业务逻辑

2)具体效果

主要的业务代码我们已经讲解完毕了,接下来我们来看看效果:

 

用户登录

从上图,我们可以看到,我们登录的两个用户都成功了,并且返回了对应的用户信息。

2、维持连接、心跳检测

这个模块的功能,其实我们在原理篇二的时候已经讲过了具体的实现方案了,这里也不再过多的赘述了,我们直接来看具体实现方法吧。

1)维持连接

1、前端每10秒发送一次心跳消息,报文如下所示:

{
    "type": "40",
    "fromId": "2"
}

注:前端发送的每个消息,理论上都是需要带上用户表示的,后端都是需要进行鉴权操作的。我们这里为了方便讲解(偷懒,bushi)将这部分逻辑进行了简化,大家在具体实现的时候,记得一定要加上 鉴权逻辑

2、后端检测,用户是否还在线,如果在线,则刷新用户的最新在线时间,并回复 PONG 消息。

示例代码如下图所示,HeartBeatProcessor.process

 

维持连接1

 

维持连接2

2)心跳检测

这里主要是基于 IdleStateEvent 事件实现的。

TextWebSocketFrameHandler 继承 SimpleChannelInboundHandler 类,并实现 userEventTriggered 方法,具体代码如下所示:

 

心跳检测

这里详细说一下,三种事件的区别:

  • readerIdleTimeSeconds:读超时。即当在指定的时间间隔内没有从 Channel 读取到数据时,会触发一个 READER_IDLE 的 IdleStateEvent 事件。
  • writerIdleTimeSeconds: 写超时。即当在指定的时间间隔内没有数据写入到 Channel 时,会触发一个 WRITER_IDLE 的 IdleStateEvent 事件。
  • allIdleTimeSeconds: 读/写超时。即当在指定的时间间隔内没有读且没有写操作时,会触发一个 ALL_IDLE 的 IdleStateEvent 事件。

所以,我们这里检测 ALL_IDLE 事件即可。

3)具体效果

维持连接效果如下所示:

 

维持连接效果

心跳检测效果如下所示:

 

心跳超时效果1

 

心跳超时效果2

3、聊天消息

聊天消息模块主要分为两部分:

  • 消息接收:客户端推送消息到服务端
  • 消息推送:服务端将消息推送到指定的客户端

这边主要的难点在于,服务端将消息推送到指定的客户端,具体场景有2种情况:

  • 消息的发送者和消息的接受者,在同一台服务器上建立的 ws 连接,这种情况,就很好处理,直接在服务器上找到建立的 ws 连接,然后将消息推送给对应的客户端。
  • 消息的发送者和消息的接受者,在不同的服务器上建立的 ws 连接,这种情况就比较复杂,实现方案也很多,比较简单的实现方式就是,发送一条广播消息,让对应的服务器,将消息推送到指定的客户端。

本文由于是 单机版 的 im,所以只会有第一种情况发生,第二种情况就留给大家自由发挥了。

1)消息接收

具体步骤如下所示:

1、客户端发送类型为80的报文,如下所示:

{
    "type": "80",
    "fromId": "1",
    "toId": "2",
    "content": {
        "contentType": 1,
        "body": "测试消息"
    }
}

2、服务端(ChatProcessor)对消息进行处理,具体代码如下所示:

 

消息接收

2)消息推送

具体步骤如下所示:

1、获取消息接受者所连接的服务器 ip 地址 2、判断当前服务器 ip 地址是否和上面的 ip 地址相同,如果相同则推送消息,否则转发给目标服务器

具体代码如下所示:

 

消息推送

3)具体效果

1、我们先登录两个用户,分别是张三、李四,如下图所示:

 

聊天登录

2、张三发送消息给李四,如下图所示:

 

张三发送消息给李四

3、李四发送消息给张三,如下图所示:

 

李四发送消息给张三

4、消息 ack

因为网络环境异常或者其他异常状况的发送,可能会出现消息推送失败的情况,这时候就需要 消息 ack 机制和重试,来保证我们的消息可以推送成功。

1)消息 ack 机制

具体步骤如下:

1、客户端收到 80 类型的消息,解析并发送 ack 报文,如下所示:

{
    "type": "90",
    "msgId": "2bfea133-72a8-4315-82aa-80049fe4fb7b"
}

2、服务端收到 ack 消息,变更消息状态(AckProcessor),具体代码如下图所示:

 

消息ack

2)消息重试

这里因为是单机版 im,所以直接采用 SpringBoot-Job 实现,Job 代码如下所示:

 

消息重试

以上文章来源于JAVA知音 ,作者啊杰



Tags:Netty   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Netty入门实践:模拟IM聊天
我们使用的框架几乎都有网络通信的模块,比如常见的Dubbo、RocketMQ、ElasticSearch等。它们的网络通信模块使用Netty实现,之所以选择Netty,有两个主要原因: Netty封装了复杂的JD...【详细内容】
2023-12-08  Search: Netty  点击:(241)  评论:(0)  加入收藏
Netty入门实践-模拟IM聊天
我们使用的框架几乎都有网络通信的模块,比如常见的Dubbo、RocketMQ、ElasticSearch等。它们的网络通信模块使用Netty实现,之所以选择Netty,有2个主要原因: Netty封装了复杂的JDK...【详细内容】
2023-12-05  Search: Netty  点击:(108)  评论:(0)  加入收藏
如何使用Netty模拟一个Web服务端
Netty作为Web服务端具有以下好处:高性能Netty是一个基于事件驱动和异步非阻塞的网络编程框架,它使用了高效的NIO(非阻塞输入输出)模型。这使得Netty在处理大量并发连接时表现出...【详细内容】
2023-09-11  Search: Netty  点击:(272)  评论:(0)  加入收藏
玩转Netty,从“Hello World”开始!
为什么要用Netty?首先当然是NIO的使用,本身比较复杂,而且还存在一些问题。除此之外,如果在项目的开发中,要实现稳定的网络通信,就得考虑网络的闪断、客户端的重复接入、客户端的...【详细内容】
2023-05-16  Search: Netty  点击:(417)  评论:(0)  加入收藏
Netty和原生Java的性能比较
Netty是一种基于异步事件循环的网络应用编程方法。本文对比Netty与Java的本地服务器。虽然目前本地服务器使用的人不多,但我仍要找出netty比本地服务器的好处有多少。让我们...【详细内容】
2023-05-16  Search: Netty  点击:(88)  评论:(0)  加入收藏
基于Netty搭建WebSocket,模仿微信聊天页面
作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!前言介绍 本章节我们模仿微信聊天页面,开发一个基于Netty搭建WebSocket通信案例。Netty的应...【详细内容】
2023-03-17  Search: Netty  点击:(237)  评论:(0)  加入收藏
Netty:遇到TCP发送缓冲区满了 写半包操作该如何处理
什么是写半包写半包:一份数据,一次发送没有把他全部发送,需要循环发送,那么第一次的操作称为写半包什么情况下会出现写半包:发送方发送200byte,但是接收方只能接受100byte,因此发送...【详细内容】
2023-03-13  Search: Netty  点击:(209)  评论:(0)  加入收藏
Java使用Netty框架自建DNS代理服务器教程
前言DNS协议作为着互联网客户端-服务器通信模式得第一关,在当下每天都有成千上亿上网记录产生得当今社会,其重要性自然不可言喻。在国内比较有名得DNS服务器有电信得114.114.1...【详细内容】
2023-02-09  Search: Netty  点击:(149)  评论:(0)  加入收藏
Netty基础介绍(使用场景、组件、模型、代码示例等)
Netty简介Netty 对 JDK 自带的 NIO 的 API 进行了良好的封装,解决了如客户端面临断线重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处理等等问题。且Netty拥有...【详细内容】
2023-01-10  Search: Netty  点击:(146)  评论:(0)  加入收藏
从Redis、HTTP协议,看Nett协议设计,我发现了个惊天大秘密
1. 协议的作用TCP/IP 中消息传输基于流的方式,没有边界协议的目的就是划定消息的边界,制定通信双方要共同遵守的通信规则2. Redis 协议如果我们要向 Redis 服务器发送一条 set...【详细内容】
2023-01-03  Search: Netty  点击:(308)  评论:(0)  加入收藏
▌简易百科推荐
如何在Windows 10中查看电脑的名称?这里提供详细步骤
你想在有多台计算机组成的网络上查找你的计算机吗?一种方法是找到你的电脑名称,然后在网络上匹配该名称。下面是如何在Windows 10中使用图形和命令行方法查看你的计算机名称。...【详细内容】
2024-04-10  驾驭信息纵横科技    Tags:Windows 10   点击:(2)  评论:(0)  加入收藏
移动版 Outlook 解锁新技能,可验证登录 OneDrive 等微软服务
IT之家 4 月 9 日消息,微软公司近日发布新闻稿,宣布用户可以使用 Outlook 手机应用,轻松登录 Teams、OneDrive、Microsoft 365 以及 Windows 等微软账号服务。移动端 Outlook...【详细内容】
2024-04-09    IT之家  Tags:Outlook   点击:(3)  评论:(0)  加入收藏
Win10/Win11和 macOS用户反馈:谷歌云服务“捆绑”系统 DNS 设置
IT之家 4 月 6 日消息,谷歌公司承认旗下的 Google One 订阅服务中存在问题,在 Windows 10、Windows 11 以及 macOS 系统上会更改系统 DNS 设置,变更为 8.8.8.8 地址。Google On...【详细内容】
2024-04-08    IT之家  Tags:Win10   点击:(7)  评论:(0)  加入收藏
电脑卡顿怎么重装系统,快看这篇
电脑卡顿时,重装系统确实是一种可能的解决方案。以下是重装系统的详细步骤:备份重要数据:首先,你需要将电脑中的重要文件和数据备份到外部存储设备(如U盘、移动硬盘或云存储)中,以...【详细内容】
2024-04-04  科技数码前锋    Tags:重装系统   点击:(2)  评论:(0)  加入收藏
如何检查电脑的最近历史记录?这里提供详细步骤
如果你怀疑有人在使用你的计算机,并且你想查看他们在做什么,下面是如何查看是否有访问内容的痕迹。如何检查我的计算机的最近历史记录要检查计算机的最近历史记录,应该从web浏...【详细内容】
2024-03-30  驾驭信息纵横科技    Tags:历史记录   点击:(1)  评论:(0)  加入收藏
关于Windows中AppData的相关知识,看这篇文章就可以了
如果AppData文件夹占用了你电脑上的太多空间,则需要清理AppData文件夹。下面是一些帮助你在Windows计算机上进行AppData清理的方法。什么是AppData文件夹AppData文件夹是保存...【详细内容】
2024-03-30  驾驭信息纵横科技    Tags:AppData   点击:(3)  评论:(0)  加入收藏
微软 Edge 浏览器将迎来“内存限制器”功能,用户可自主控制 Edge 内存占用
IT之家 3 月 28 日消息,微软即将为其 Edge 浏览器带来一项实用新功能,据悉该公司正在测试一项内置的内存限制器,这项功能可以让用户限制 Edge 所占用的内存,防止浏览器超出内存...【详细内容】
2024-03-29    IT之家  Tags:Edge   点击:(15)  评论:(0)  加入收藏
一寸照片的大小如何压缩?四个实测效果很好的方法
一寸照片作为生活中常见的尺寸之一,常用于各类证件照与证明文件的制作。然而,受限于其较为狭小的尺寸,上传及打印过程中很容易出现尺寸超限的情况。所以,这个时候就需要对其体积...【详细内容】
2024-03-18  宠物小阿涛    Tags:压缩   点击:(14)  评论:(0)  加入收藏
手机投屏到电脑/电视的方法
方法一:Win10自带的投影功能1、将手机和电脑连接同一个无线网络。2、选择【开始】>【设置】>【系统】>【投影到此电脑】3、将默认的始终关闭的选项更改为所有位置都可用。4、...【详细内容】
2024-03-18    老吴讲I  Tags:投屏   点击:(17)  评论:(0)  加入收藏
微软商店怎么卸载应用 一分钟快速看懂!
微软商店怎么卸载应用 一分钟快速看懂!微软公司(Microsoft Corporation)是一家全球领先的科技企业,总部位于美国华盛顿州的雷德蒙德。成立于1975年,由比尔·盖茨和保罗&mid...【详细内容】
2024-02-27  婷婷说体育    Tags:微软商店   点击:(38)  评论:(0)  加入收藏
站内最新
站内热门
站内头条