# Fast-IM
## 基于Spring Boot + WebSocket + Redis的分布式即时通讯群聊系统
#### 适用于直播间聊天、游戏内聊天、客服聊天等临时性群聊场景。
* 使用WebSocet连接IM服务端与客户端。
* 使用Redis string存储用户登录令牌,key为"login:"+用户id,value为token。
* 使用Redis list存储群聊消息,key为 "gml:"+群组id,value为群组消息列表(JSON格式)。
* 使用Redis set存储用户加入的群组列表,key为 "ugs:"+用户id,value为用户当前加入的所有群组id集合。
* 使用Redis pub/sub订阅发布功能实现分布式WebSocket推送服务,订阅发布主题管道名称为 "mq:"+群组id(每个群组单独共享一个主题)。
![avatar](./ws_img.jpg)
***
## 实现功能
* 分布式WebSocket推送服务,客户端向任意一个IM服务端发送消息,其他IM服务端都可接收到这条消息,并将消息推送给所有在线连接的同群组客户端(基于Redis订阅/发布功能及WebSocket连接实现)。
* 临时群聊快速搭建(适用于直播间聊天、游戏内聊天)。
* 群聊历史聊天记录查询(HTTP接口实现)。
* 自动清除长期废弃的群聊(基于Redis键值过期功能)。
* 实时推送用户所加入的群组列表的最新动态(WebSocket连接实现)。
* 用户登录状态验证(Redis Token)。
* 一定时间内的消息撤回功能(HTTP接口实现)。
***
## 使用说明
* 部署Redis。
* 配置application.yml文件中的参数。
* 启动项目。
* 启动后访问 http://127.0.0.1:9000/test/websocket ,测试WebSocket连接。
![avatar](./ws_test.jpg)
***
## 自定义业务逻辑
* 可在controller/UserController及service/UserService文件中自定义用户登录逻辑。
* 可在config/InterceptorConfig及interceptor/ApiInterceptor文件中自定义http接口拦截器及拦截路由。
***
## 消息模板说明
```
groupId:消息所属群组id
userId:发送该条消息的用户id
info:消息主体内容
ts:消息创建时间戳(毫秒级)
```
为了省内存,没有消息唯一id/uuid,查询某条消息时,按照groupId、userId、ts这三个字段来匹配消息。先根据groupId查找到指定Redis list,再根据userId和ts查找到list中的指定消息(ps:即使有人在同一毫秒内向某群组插入了两条消息,也无大碍,只会略微影响消息撤回功能及获取历史消息记录功能)。
***
## WebSocket连接说明
### 群组聊天室连接(监听群内聊天消息更新)
>ws://127.0.0.1:9000/group/chat/{groupId}/{userId}/{token}
* `groupId:群组id`
* `userId:用户id`
* `token:登录令牌,默认不开启websocket令牌验证,可随意填写一串字符(不能为空)`
连接建立后服务端将返回该群组最新的一批消息列表list与该群组消息总数total(以JSON字符串形式推送),格式如下:
```json
{
"list":[
{"groupId":"1","userId":"3","info":"1-hello","ts":1648368380132},
{"groupId":"1","userId":"1","info":"2-hello","ts":1648368386964},
{"groupId":"1","userId":"1","info":"3-hello","ts":1648368388389},
{"groupId":"1","userId":"3","info":"4-hello","ts":1648368390249},
{"groupId":"1","userId":"1","info":"5-hello","ts":1648368391742},
{"groupId":"1","userId":"2","info":"6-hello","ts":1648368393362},
{"groupId":"1","userId":"1","info":"7-hello","ts":1648368394696},
{"groupId":"1","userId":"6","info":"8-hello","ts":1648368396091},
{"groupId":"1","userId":"1","info":"9-hello","ts":1648368397434},
{"groupId":"1","userId":"1","info":"0-hello","ts":1648368400179}
],
"total":399
}
```
* `groupId:该消息所属群组id`
* `userId:发送该消息的用户id`
* `info:消息主体信息`
* `ts:消息创建时间戳(毫秒级)`
注:如果开启了websocket令牌验证,且用户登录令牌token验证失败,则服务端返回"440"代码,并断开连接。
```json
"440"
```
连接成功后客户端即可向服务端发送消息
* 客户端发送
```json
"im hello"
```
然后服务端向所有在线的群组成员推送该条消息(以JSON字符串形式推送),格式如下:
```json
{
"groupId":"1",
"userId":1,
"info":"im hello",
"ts":1648380678385
}
```
### 首页群组列表连接(监听用户加入的所有群组数据更新)
>ws://127.0.0.1:9000/group/list/{userId}/{token}
* `userId:用户id`
* `token:登录令牌,默认不开启websocket令牌验证,可随意填写一串字符(不能为空)`
连接建立后,服务端将周期性检查用户群组列表中是否有新消息到达,如果有新消息到达,则向客户端发送最新的群组信息列表(以JSON字符串形式推送),推送数据格式如下:
```json
[
{
"newMessage":
{
"groupId":"1",
"userId":"2",
"info":"hi",
"ts":1648380678385
},
"total":1
},
{
"newMessage":
{
"groupId":"1",
"userId":"1",
"info":"hello",
"ts":1648380642476
},
"total":17
}
]
```
* `newMessage:该群组当前最新的一条消息`
* `total:该群组当前消息总数`
注:如果开启了websocket令牌验证,且用户登录令牌token验证失败,则服务端返回"440"代码,并断开连接。
```json
"440"
```
***
## HTTP接口文档
***
### 用户登录
#### 接口说明
> 根据业务自定义,默认直接通过验证并返回token。
#### 接口URL
> http://127.0.0.1:9000/user/login
#### 请求方式
> POST
#### Content-Type
> form-data
#### 请求Body参数
参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述
--- | --- | --- | --- | ---
userId | 1 | Text | 是 | 用户id
password | 123456 | Text | 是 | 密码
#### 成功响应示例
```json
{
"code": 200,
"msg": "8f2c1eb2099049eab5cad6a78a1f8285",
"data": "user_info"
}
```
***
### 获取指定消息之前的历史消息列表
#### 接口说明
> 前端聊天室上拉刷新时,可调用此接口获取历史消息列表。
#### 接口URL
> http://127.0.0.1:9000/group/listMessage
#### 请求方式
> POST
#### Content-Type
> form-data
#### Header参数
参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述
--- | --- | --- | --- | ---
userId | 1 | Text | 是 | 用户id
token | 84e9d36e4c7c44e0a79bb71f1b4ce9c4 | Text | 是 | 登录令牌
#### 请求Body参数
参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述
--- | --- | --- | --- | ---
userId | 1 | Text | 是 | 指定消息的用户id
groupId | 1 | Text | 是 | 指定消息所属群组id
ts | 1648443134344 | Text | 是 | 指定消息的创建时间戳
count | 4 | Text | 是 | 要获取的历史消息数量
#### 成功响应示例
```json
{
"code": 200,
"msg": "操作成功",
"data": [
"{\"groupId\":\"1\",\"userId\":\"1\",\"info\":\"1\",\"ts\":1648368380132}",
"{\"groupId\":\"1\",\"userId\":\"1\",\"info\":\"2\",\"ts\":1648368386964}",
"{\"groupId\":\"1\",\"userId\":\"1\",\"info\":\"3\",\"ts\":1648368388389}",
"{\"groupId\":\"1\",\"userId\":\"1\",\"info\":\"4\",\"ts\":1648368390249}"
]
}
```
***
### 获取一定区间内的群组消息列表
#### 接口说明
> 可以给管理端用,用于查看群组消息列表。
#### 接口URL
> http://127.0.0.1:9000/group/listMessage
#### 请求方式
> POST
#### Content-Type
> form-data
#### Header参数
参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述
--- | --- | --- | --- | ---
userId | 1 | Text | 是 | 用户id
token | 84e9d36e4c7c44e0a79bb71f1b4ce9c4 | Text | 是 | 登录令牌
#### 请求Body参数
参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述
--- | --- | --- | --- | ---
groupId | 1 | Text | 是 | 群组id
startPage | 0 | Text | 是 | 起始页
endPage | 5 | Text | 是 | 终止页
#### 成功响应示例
```json
{
"code": 200,
"msg": "操作成功",
"data": [
"{\"groupId\":\"1\",\"userId\":\"1\",\"info\":\"1\",\"ts\":1648368380132}",
"{\"groupId\":
程序员张小妍
- 粉丝: 1w+
- 资源: 3474
最新资源
- YOLO算法-禾本科杂草数据集-4760张图像带标签.zip
- YOLO算法-无人机俯视视角动物数据集-10140张图像带标签-斑马-骆驼-大象-牛-羊.zip
- YOLO算法-挖掘机与火焰数据集-8129张图像带标签-挖掘机.zip
- YOLO算法-塑料数据集-3029张图像带标签-塑料制品-白色塑料.zip
- PyKDL库源码,编译安装PyKDL库
- YOLO算法-红外探测数据集-10573张图像带标签-小型车-人-无人机.zip
- 基于 C++和TCP和WebSocket的即时通信系统设计与实现(源码+文档)
- 电商管理系统项目源代码全套技术资料.zip
- 全国2022年04月高等教育自学考试02326操作系统试题及答案
- YOLO算法-垃圾数据集-3818张图像带标签-可口可乐-百事可乐.zip
- YOLO算法-瓶纸盒合并数据集-1317张图像带标签-纸张-纸箱-瓶子.zip
- YOLO算法-杂草检测项目数据集-3970张图像带标签-杂草.zip
- YOLO算法-杂草检测项目数据集-3853张图像带标签-杂草.zip
- YOLO算法-挖掘机与火焰数据集-7735张图像带标签-挖掘机.zip
- 文旅项目源代码全套技术资料.zip
- YOLO算法-罐头和瓶子数据集-1531张图像带标签-鲜奶-瓶子.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页