springboot+WebSocket

在线聊天项目
原理:
后端负责系统推送消息、查询记录会话用户信息等,前端负责订阅并调用接口
会话列表和未读消息属于广播,消息发送属于点对点。消息记录查询更多及处理未读消息等其他接口使用AJAX。


用户功能:
1、取得初始化连接相关配置,作聊天前准备工作。获取聊天账号的信息,当前需要关注的聊天会话ID
2、检测当前账号是否在线。连接成功之后,需要发送心跳维护在线状态
3 断线重连

消息功能:
1 错误消息
2心跳消息 前端设置3秒定时,发送心跳到服务器
3 发送消息(如果对方聊天会话对象ID正好是当前发送消息的fromUser的ID,则当前消息为已读)
4消息记录查询
5会话历史消息查询 6 处理未读消息 7 消息总数量 8关闭消息链接(使当前用户下线)

会话功能:
1 开始会话 2结束会话 3移除会话 4 推送会话列表

Redis 
用于存储:
1 当前会话(掉线后或者下线后删除)

移除当前会话会删除redis里的当前会话key
开始会话操作,会设置当前会话key(key客服ID+value咨询用户)
用户消息记录查询,会设置当前会话key(key用户ID+value客服)
用户初始化连接,删除当前会话key
默认触发订阅事件(监听器),当客服首次打开会话列表,系统会设置会话列表首个会话对象为当前会话对象
客服切换会话对象,点击触发更新未读消息接口。此时设置当前会话
发送消息时候,会根据toUser来获取当前会话,如果存在则发送消息自动更改为已读消息。


2 在线用户(掉线后或者下线后删除)

检查用户是否在线会去redis去取值,判断是否在线。有值表示在线
查询会话列表,会查询当前用户是否在线
初始化链接及验证用户信息时候,会查询用户是否在线
用户下线会删除在线用户和当前会话key
心跳检测会检查并设置在线用户和当前会话

遇到难点:
1 跨域 使用JSONP
2 当前会话问题 session共享
3 并发请求(同时开始会话)
4 断线重连 上线不成功,定时任务1秒发起连接请求

主要接口:
1 用户接口
 A 初始化连接
 B 心跳接口
 C 关闭接口
 D 接收错误接口
 E 检查用户是否在线

2 消息接口
 A 消息记录(包括加载更多)
参数有:记录中最大的IDmax-id,默认值为0;size分页数量默认为6
传会话ID,用于设置当前会话对象(redis).返回消息列表及下一页的消息数量。数量为0表示没有更多。
 B 统计消息数量
 C 处理未读消息
  更新消息状态为未读。统计未读消息数量并推送。
如果是客服,则在redis设置当前会话对象。并推送会话列表
 D 发送消息
通过SimpMessageHeaderAccessor取得消息头数据。
E 根据会话ID查询聊天记录(客服用)
返回消息列表及下一页的消息数量。数量为0表示没有更多。


3 会话接口
A 接受会话
B 结束会话
C 移除当前会话

后端推送场景
1 错误信息 

2 点对点聊天--发消息;结束会话

3 会话列表(会话列表包括每个会话的未读消息数量)
 A 开始会话(每个客服推一次)
 B 结束会话 (每个客服推一次)
 C 监听器WebSocketEventListener
 D 更新消息状态
 E 发消息

4 未读消息数量
 A开始会话(每个客服推一次)
 B 结束会话 
 结束会话,先更新本次会话的消息未读数量。(统计数量,如果有未读消息则推送用户和客服)
然后推送每个客服的未读消息数量
(每个客服推一次)
 C 发送消息
 D 更新消息状态


前端订阅统计

需要改善的地方
1 聊天内容显示支持链接和图片
2 聊天支持粘贴图片/发送
3 账号过期 聊天账号也要过期
4 聊天 断网/链接断开 错误提示
5 聊天文字输入框支持拖拉/滚动条 niceScroll插件

技术点:
监听器WebSocketEventListener
处理逻辑:根据订阅的URL匹配。只要订阅了,自动推送
@EventListener
public void handleWebSocketSubscribeListener(SessionSubscribeEvent event)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值