0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

工程师邓生 来源:Java知音 作者:啊杰 2022-09-30 15:03 次阅读

实战篇一的代码结构:

c474c46a-3bb3-11ed-9e49-dac502259ad0.png

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

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

c4894ee4-3bb3-11ed-9e49-dac502259ad0.jpg

消息类型

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

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

c4a7f1aa-3bb3-11ed-9e49-dac502259ad0.jpg

登录业务逻辑

2)具体效果

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

c4d601a8-3bb3-11ed-9e49-dac502259ad0.jpg

用户登录

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

2、维持连接、心跳检测

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

1)维持连接

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

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

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

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

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

c4f291a6-3bb3-11ed-9e49-dac502259ad0.jpg

维持连接1

c5099784-3bb3-11ed-9e49-dac502259ad0.jpg

维持连接2

2)心跳检测

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

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

c5298e7c-3bb3-11ed-9e49-dac502259ad0.jpg

心跳检测

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

readerIdleTimeSeconds: 读超时。即当在指定的时间间隔内没有从 Channel 读取到数据时,会触发一个 READER_IDLE 的 IdleStateEvent 事件。

writerIdleTimeSeconds: 写超时。即当在指定的时间间隔内没有数据写入到 Channel 时,会触发一个 WRITER_IDLE 的 IdleStateEvent 事件。

allIdleTimeSeconds: 读/写超时。即当在指定的时间间隔内没有读且没有写操作时,会触发一个 ALL_IDLE 的 IdleStateEvent 事件。

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

3)具体效果

维持连接效果如下所示:

c55d429e-3bb3-11ed-9e49-dac502259ad0.jpg

维持连接效果

心跳检测效果如下所示:

c57ee6d8-3bb3-11ed-9e49-dac502259ad0.jpg

心跳超时效果1

c58e6284-3bb3-11ed-9e49-dac502259ad0.jpg

心跳超时效果2

3、聊天消息

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

消息接收:客户端推送消息到服务端

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

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

消息的发送者和消息的接受者,在同一台服务器上建立的 ws 连接,这种情况,就很好处理,直接在服务器上找到建立的 ws 连接,然后将消息推送给对应的客户端。

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

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

1)消息接收

具体步骤如下所示:

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

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

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

c59db5d6-3bb3-11ed-9e49-dac502259ad0.png

消息接收

2)消息推送

具体步骤如下所示:

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

具体代码如下所示:

c5ce93f4-3bb3-11ed-9e49-dac502259ad0.png

消息推送

3)具体效果

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

c60cd286-3bb3-11ed-9e49-dac502259ad0.png

聊天登录

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

c629c292-3bb3-11ed-9e49-dac502259ad0.png

张三发送消息给李四

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

c6547a3c-3bb3-11ed-9e49-dac502259ad0.png

李四发送消息给张三

4、消息 ack

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

1)消息 ack 机制

具体步骤如下:

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

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

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

c67a0efa-3bb3-11ed-9e49-dac502259ad0.png

消息ack

2)消息重试

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

c6ab8c00-3bb3-11ed-9e49-dac502259ad0.png

消息重试




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    9096

    浏览量

    85307
  • 通讯系统
    +关注

    关注

    0

    文章

    70

    浏览量

    12204
  • ALL
    ALL
    +关注

    关注

    0

    文章

    6

    浏览量

    20863

原文标题:太顶了,使用 Netty 实现了一个 IM 即时通讯系统

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    即时通讯软件哪家好?企业即时通讯怎么选择?

    云部署:支持企业私有化部署、双重数据传输加密技术保障企业信息安全imo云办公室拥有专业的技术团队,为企业量身定制即时通讯解决方案,降低企业通信成本;提高员工办公、沟通效率,实现团队紧密协作;为企业的核心商业信息提供坚实的保障。 了解更多详情:软件试用咨询:021-6628
    发表于 08-09 15:16

    即时通讯是怎么做到的?

    在线状态、IP地址、 IM客户端使用的TCP端口(Port)号等,即时通讯好友PC机上的即时通讯软件收到此信息后将在PC桌面上弹出小窗口
    发表于 01-21 10:41

    Lotus即时通讯工具将与雅虎Google实现互通

        1月24日消息,根据达成的交易,IBM公司Lotus Sametime即时通讯服务的用户将能够与AOL、雅虎的即时通讯用户“交谈”。
    发表于 03-07 20:47 806次阅读

    即时通讯详解

    即时通讯详解1. 引言 2. 即时通讯背景知识
    发表于 08-05 09:55 3048次阅读

    Android平台简易即时通讯方案

    论文简单介绍Android平台的特性,主要阐述了基于Android平台简易即时通讯(IM)的作用和功能以及实现方法。
    发表于 02-21 10:27 5146次阅读
    Android平台简易<b class='flag-5'>即时通讯</b>方案

    环信即时通讯

    Android环信即时通讯。。。。。。。。。。。。。。。。
    发表于 05-17 16:41 1次下载

    java实现IM即时通讯聊天功能代码

    从实际工程应用角度出发,以计算机网络原理为指导,结合当前网络中的些常用技术,编程实现基于C/S架构的网络聊天工具是切实可行的。本文为大家介绍java Smack整合Openfire服务器实现
    发表于 01-24 16:10 2.8w次阅读

    区块链即时通讯系统开发,区块链直播聊天平台开发

    区块链即时通讯系统开发,区块链直播聊天平台开发数字资产交易所模式和玩法还是那样,法币OTC交易所,币币撮合交易所,但是最近也是有模式比较新颖,那就是数字资产抵押平台,这个模式还是比
    发表于 05-30 20:24 607次阅读

    区块链IM即时通讯系统开发技术

    决这现状我们开发了款区块链IM即时通讯系统IM即时通讯
    发表于 06-07 15:46 2944次阅读

    移动端区块链IM即时通讯直播平台系统APP开发的技术特征

    通讯其实在我们的生活中是种在不断完善以及创新的沟通方式,传统的通讯往往有很多种网络、电话、写信等等。经过这些烟花缭乱的传统通讯方式发展到如今的IM
    的头像 发表于 06-13 10:41 4710次阅读

    企业内部IM即时通讯系统开发直播聊天APP软件开发

    IM即时通讯系统兴起于1998年,发展至今,IM即时通讯系统(开发咨询微/电:138.....2
    发表于 07-06 16:39 432次阅读

    IM即时通讯系统开发APP融合区块链应用搭建技术

    IM即时通讯系统APP融合了区块链技术,主打区块链技术把现实与网络打造成为种高便捷性的社交平台、资产平台。当然这款APP不仅对接了直播系统
    发表于 08-23 16:27 906次阅读

    区块链IM社交系统的开发币圈即时通讯软件APP

    全球用户聚集地,通过币圈的隐秘即时通讯系统,可以畅聊币圈资讯,分享全球币圈的最新动态,键分享世界各地币圈用户玩家,打造币圈交易、分享、
    发表于 08-30 11:05 511次阅读

    go语言实现的简单im即时通系统

      本文介绍了 go 语言实现的简单 im 即时通系统。 简介 纯go
    的头像 发表于 10-20 16:02 3639次阅读

    拳头产品|海泰虎讯,新代安全即时通讯系统

    即时通讯系统是目前互联网上最为流行的通信方式,各种各样的即时通讯软件也层出不穷。随着移动办公的快速普及,即时通讯软件在移动办公中得到越来越广泛的应用,已经成为日常办公软件的
    的头像 发表于 11-01 08:57 621次阅读