2021-09-14 14:25:28 +08:00
|
|
|
|
---
|
2021-09-14 15:26:11 +08:00
|
|
|
|
title: 7.即时消息
|
2021-09-14 14:25:28 +08:00
|
|
|
|
description: 即时消息模块的使用
|
|
|
|
|
published: true
|
2021-10-09 17:48:11 +08:00
|
|
|
|
date: 2021-10-09T09:48:10.464Z
|
2021-09-14 14:25:28 +08:00
|
|
|
|
tags: wg-basic
|
|
|
|
|
editor: markdown
|
|
|
|
|
dateCreated: 2021-09-14T06:25:26.887Z
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# 依赖模块
|
2021-09-14 14:44:49 +08:00
|
|
|
|
|
2021-09-14 14:25:28 +08:00
|
|
|
|
```xml
|
2021-09-14 14:44:49 +08:00
|
|
|
|
<dependency>
|
|
|
|
|
<groupId>ink.wgink</groupId>
|
|
|
|
|
<artifactId>module-instant-message</artifactId>
|
|
|
|
|
<version>1.0-SNAPSHOT</version>
|
|
|
|
|
</dependency>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# 配置
|
|
|
|
|
|
|
|
|
|
```yml
|
|
|
|
|
websocket:
|
|
|
|
|
url: 127.0.0.1
|
|
|
|
|
port: 8081
|
|
|
|
|
# 上下文
|
|
|
|
|
context: websocket
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# 如何对接
|
|
|
|
|
|
|
|
|
|
1. 不论后台还是APP,首先需要完成登录
|
|
|
|
|
2. 请求接口完成socket登录
|
2021-09-14 14:25:28 +08:00
|
|
|
|
|
2021-09-14 14:44:49 +08:00
|
|
|
|
- 后台请求接口:`api/websocket/client/login/{clientName}`
|
|
|
|
|
- APP请求接口:`app/websocket/client/login/{clientName}`
|
|
|
|
|
- 请求方法:GET
|
|
|
|
|
- clientName:客户端名称(唯一标识,非中文)
|
|
|
|
|
|
|
|
|
|
3. 请求接口后,拿到会话ID(sessionId)
|
|
|
|
|
4. 初始化 WebSocket
|
2021-09-14 15:09:00 +08:00
|
|
|
|
5. 连接打开后,发起 **会话注册**,携带请求后的 **sessionId** 完成会话注册。
|
|
|
|
|
6. 注册成功后,可发起 scoket 请求
|
|
|
|
|
|
|
|
|
|
# 类型与参数
|
2021-10-09 17:45:37 +08:00
|
|
|
|
## 1.消息格式说明
|
2021-09-14 15:09:00 +08:00
|
|
|
|
|
|
|
|
|
消息格式为 **JSONObject** 字符串
|
|
|
|
|
具体内容如下表
|
|
|
|
|
|
2021-09-14 15:18:49 +08:00
|
|
|
|
| 属性 | 说明 | 类型 | 是否可空 |
|
2021-09-14 15:28:56 +08:00
|
|
|
|
| :-: | :-: | :-: | :-: |
|
2021-09-14 15:16:03 +08:00
|
|
|
|
| id | 消息ID,唯一 | String | 否 |
|
|
|
|
|
| type | 消息类型编码 | Integer | 否 |
|
|
|
|
|
| isSystem | 是否是系统消息 | Boolean | 否 |
|
|
|
|
|
| from | 发送人的 **userId**,如果是系统消息则为:**SYSTEM** | String | 否 |
|
|
|
|
|
| to | 接收人的 **userId** 或 **userId 列表**。userId 列表为 **英文逗号** 分割的字符串 | String | 否 |
|
|
|
|
|
| body | 消息主体,主体的具体格式会根据 **消息编码(type)** 的变化而变化 | String | 否 |
|
|
|
|
|
| timestamp | 消息时间戳 millisecond | Long | 是 |
|
2021-09-14 15:09:00 +08:00
|
|
|
|
|
2021-09-14 15:16:03 +08:00
|
|
|
|
注:from与to可以相同
|
|
|
|
|
|
2021-10-09 17:45:37 +08:00
|
|
|
|
## 2.消息编码
|
2021-09-14 15:09:00 +08:00
|
|
|
|
|
|
|
|
|
| 编码 | 说明 | 主体格式 |
|
|
|
|
|
| :-: | :-: | :-: |
|
|
|
|
|
| 1000 | 注册消息 | RegisterBody 的 JSONObject 字符串 |
|
|
|
|
|
| 2001 | 文本消息 | 发送的字符串内容 |
|
2021-09-14 17:03:58 +08:00
|
|
|
|
| 3001 | 通知 | NoticeBody 的 JSONObject 字符串 |
|
|
|
|
|
| 3003 | 带目标的通知,客户端可以根据业务需求动态变更目标(target)内容 | NoticeBody 的 JSONObject 字符串 |
|
2021-09-14 15:09:00 +08:00
|
|
|
|
| 9001 | 消息发送状态 | StatusBody 的 JSONObject 字符串 |
|
|
|
|
|
| 9101 | 消息接受状态 | StatusBody 的 JSONObject 字符串 |
|
|
|
|
|
|
2021-10-09 17:45:37 +08:00
|
|
|
|
## 3.主体
|
2021-09-14 15:16:03 +08:00
|
|
|
|
|
2021-09-14 15:18:49 +08:00
|
|
|
|
**RegisterBody**
|
|
|
|
|
|
|
|
|
|
| 属性 | 说明 | 类型 | 是否可控 |
|
|
|
|
|
| :-: | :-: | :-: | :-: |
|
|
|
|
|
| sessionId | 登录获取到的会话ID | String | 否 |
|
2021-09-14 15:09:00 +08:00
|
|
|
|
|
2021-09-14 15:25:38 +08:00
|
|
|
|
**StatusBody**
|
|
|
|
|
|
2021-09-14 17:03:58 +08:00
|
|
|
|
| 属性 | 说明 | 类型 | 是否可空 |
|
2021-09-14 15:25:38 +08:00
|
|
|
|
| :-: | :-: | :-: | :-: |
|
|
|
|
|
| code | 状态码 | Integer | 否 |
|
|
|
|
|
| status | 状态 | StatusEnum | 否 |
|
|
|
|
|
| msg | 说明 | String | 否 |
|
|
|
|
|
|
2021-09-14 17:03:58 +08:00
|
|
|
|
**NoticeBody**
|
|
|
|
|
|
|
|
|
|
| 属性 | 说明 | 类型 | 是否可空 |
|
|
|
|
|
| :-: | :-: | :-: | :-: |
|
|
|
|
|
| title | 标题 | String | 否 |
|
|
|
|
|
| msg | 内容 | String | 否 |
|
|
|
|
|
| target | 目标,需要客户端点击触发效果时使用,可以为约定好的 url、page 等等 | String | 是 |
|
|
|
|
|
| serviceId | 业务ID | String | 是 |
|
|
|
|
|
|
2021-10-09 17:45:37 +08:00
|
|
|
|
## 4.状态码
|
2021-09-14 15:25:38 +08:00
|
|
|
|
|
|
|
|
|
| 编码 | 名称 | 说明 |
|
|
|
|
|
| :-: | :-: | :-: |
|
|
|
|
|
| 200 | SUCCESS | 成功 |
|
|
|
|
|
| 400 | FAILED | 失败 |
|
|
|
|
|
| 401 | MESSAGE_ERROR | 消息错误 |
|
|
|
|
|
| 402 | SESSION_ERROR | 会话错误 |
|
|
|
|
|
| 403 | TYPE_ERROR | 类型编码错误 |
|
|
|
|
|
| 404 | BODY_ERROR | 消息体错误 |
|
|
|
|
|
| 405 | FROM_ERROR | 来源错误 |
|
|
|
|
|
| 406 | TO_ERROR | 接收人错误 |
|
|
|
|
|
| 407 | RECEIVE_ERROR | 接收错误 |
|
2021-10-09 16:24:02 +08:00
|
|
|
|
|
|
|
|
|
# 自定义处理消息业务
|
|
|
|
|
|
2021-10-09 16:45:09 +08:00
|
|
|
|
1. 实现 `ink.wgink.module.instantmessage.service.IWebSocketTextCustomService` 接口
|
2021-10-09 17:48:11 +08:00
|
|
|
|
2. 在 **handle** 方法中完成业务逻辑:handle方法接收两个参数,第一个参数是当前会话通道,第二个参数是消息体
|
2021-10-09 16:45:09 +08:00
|
|
|
|
3. 发送消息:调用WebSocketChannelManager.getInstance().sendText(channel, message) 方法发送消息
|
2021-10-09 16:24:02 +08:00
|
|
|
|
|
2021-10-09 17:47:41 +08:00
|
|
|
|
# 通道管理器
|
|
|
|
|
|
|
|
|
|
`WebSocketChannelManager`
|
2021-10-09 16:24:02 +08:00
|
|
|
|
|
2021-10-09 16:45:09 +08:00
|
|
|
|
该类不能 **new**,通过 **getInstance()** 方法得到单例对象,提供了如下功能:
|
|
|
|
|
|
|
|
|
|
| 方法 | 参数 | 说明 |
|
|
|
|
|
| :-: | :-: | :-: |
|
|
|
|
|
| listOnlineUser | userId: 用户ID | 获取在线用户客户端列表 |
|
|
|
|
|
| getOnlineUser | userId: 用户ID, clientName:客户端名称 | 获取在线用户 |
|
|
|
|
|
| listOnlineUser | userIds: 用户ID列表 | 获取在线用户客户端列表 |
|
|
|
|
|
| listOnlineUser | userIds: 用户ID列表, clientName: 客户端名称 | 获取在线用户客户端列表 |
|
|
|
|
|
| getOnlineUserBySessionId | sessionId: 会话ID | 通过会话获取用户 |
|
|
|
|
|
| getOnlineUserByChannelId | channelId: 通道ID | 通过通道获取用户 |
|
|
|
|
|
| sendText | channel: 接收人通道, webSocketClientMessage: 发送内容 | 单发文本消息 |
|
2021-10-09 16:47:06 +08:00
|
|
|
|
| sendGroupText | channels: 接收人通道列表, webSocketClientMessage: 发送内容 | 群发文本消息 |
|
|
|
|
|
|
2021-10-09 17:46:54 +08:00
|
|
|
|
> webSocketClientMessage 与[消息格式说明](#类型与参数) 中的 **消息格式** 相同
|