--- title: 7.即时消息 description: 即时消息模块的使用 published: true date: 2021-12-07T06:19:41.128Z tags: wg-basic editor: markdown dateCreated: 2021-09-14T06:25:26.887Z --- # 依赖模块 ```xml ink.wgink module-instant-message 1.0-SNAPSHOT ``` # 配置 ```yml websocket: url: 127.0.0.1 port: 8081 # 上下文 context: websocket ``` # 如何对接 1. 不论后台还是APP,首先需要完成登录 2. 请求接口完成socket登录 - 后台请求接口:`api/websocket/client/login/{clientName}` - APP请求接口:`app/websocket/client/login/{clientName}` - 请求方法:GET - clientName:客户端名称(唯一标识,非中文) 3. 请求接口后,拿到会话ID(sessionId) 4. 初始化 WebSocket 5. 连接打开后,发起 **会话注册**,携带请求后的 **sessionId** 完成会话注册。 6. 注册成功后,可发起 scoket 请求 # 类型与参数 ## 1.消息格式说明 消息格式为 **JSONObject** 字符串 具体内容如下表 | 属性 | 说明 | 类型 | 是否可空 | | :-: | :-: | :-: | :-: | | id | 消息ID,唯一 | String | 否 | | type | 消息类型编码 | Integer | 否 | | isSystem | 是否是系统消息 | Boolean | 否 | | from | 发送人的 **userId**,如果是系统消息则为:**SYSTEM** | String | 否 | | to | 接收人的 **userId** 或 **userId 列表**。userId 列表为 **英文逗号** 分割的字符串 | String | 否 | | body | 消息主体,主体的具体格式会根据 **消息编码(type)** 的变化而变化 | String | 否 | | timestamp | 消息时间戳 millisecond | Long | 是 | 注:from与to可以相同 ## 2.消息编码 | 编码 | 说明 | 主体格式 | | :-: | :-: | :-: | | 1000 | 注册消息 | RegisterBody 的 JSONObject 字符串 | | 2001 | 文本消息 | 发送的字符串内容 | | 3001 | 通知 | NoticeBody 的 JSONObject 字符串 | | 3003 | 带目标的通知,客户端可以根据业务需求动态变更目标(target)内容 | NoticeBody 的 JSONObject 字符串 | | 9001 | 消息发送状态 | MessageSendStatusBody 的 JSONObject 字符串 | | 9101 | 消息接受状态 | 自定义的交互内容 | ## 3.主体 **RegisterBody** | 属性 | 说明 | 类型 | 是否可控 | | :-: | :-: | :-: | :-: | | sessionId | 登录获取到的会话ID | String | 否 | **MessageSendStatusBody** | 属性 | 说明 | 类型 | 是否可空 | | :-: | :-: | :-: | :-: | | code | 状态码 | Integer | 否 | | status | 状态 | StatusEnum | 否 | | msg | 说明 | String | 否 | **NoticeBody** | 属性 | 说明 | 类型 | 是否可空 | | :-: | :-: | :-: | :-: | | title | 标题 | String | 否 | | msg | 内容 | String | 否 | | target | 目标,需要客户端点击触发效果时使用,可以为约定好的 url、page 等等 | String | 是 | | serviceId | 业务ID | String | 是 | ## 4.消息发送状态码 | 编码 | 名称 | 说明 | | :-: | :-: | :-: | | 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 | 接收错误 | | 408 | USER_OFFLINE | 用户离线 | | 408 | CUSTOM_HANDLE_ERROR | 自定义处理异常 | # 自定义处理消息业务 1. 实现 `ink.wgink.module.instantmessage.service.IWebSocketTextCustomService` 接口 2. 在 **handle** 方法中完成业务逻辑:handle方法接收两个参数,第一个参数是当前会话通道,第二个参数是消息体 3. 发送消息:调用WebSocketChannelManager.getInstance().sendText(channel, message) 方法发送消息 # 通道管理器 `WebSocketChannelManager` 该类不能 **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: 发送内容 | 单发文本消息 | | sendGroupText | channels: 接收人通道列表, webSocketClientMessage: 发送内容 | 群发文本消息 | > webSocketClientMessage 与[消息格式说明](#类型与参数) 中的 **消息格式** 相同 # 消息类型枚举 ```java public enum MessageTypeEnum { REGISTER(1000, "注册消息,body 为 RegisterBody 的 JSON 字符串"), MESSAGE(2001, "文本消息"), MESSAGE_HREF(2002, "链接消息"), MESSAGE_IMAGE(2003, "图片消息"), MESSAGE_FILE(2004, "文件消息"), MESSAGE_AUDIO(2005, "音频消息"), MESSAGE_VIDEO(2006, "视频消息"), MESSAGE_GROUP(2101, "群发文本消息"), MESSAGE_GROUP_HREF(2102, "群发链接消息"), MESSAGE_GROUP_IMAGE(2103, "群发图片消息"), MESSAGE_GROUP_FILE(2104, "群发文件消息"), MESSAGE_GROUP_AUDIO(2105, "群发音频消息"), MESSAGE_GROUP_VIDEO(2106, "群发视频消息"), MESSAGE_SYSTEM(2201, "系统消息"), MESSAGE_SYSTEM_GROUP(2202, "系统群发消息"), MESSAGE_SYSTEM_TARGET(2203, "系统目标消息"), NOTICE(3001, "通知"), NOTICE_GROUP_MESSAGE(3002, "群通知"), NOTICE_TARGET_MESSAGE(3003, "目标通知,用于APP打开特定页面"), UPDATE_SERVICE_HANDLE_STATUS(3004, "更新业务的处理状态"), SEARCH_ONLINE_USER(4001, "查询全部在线用户,body 为查询用户的 userId"), SEARCH_ONLINE_USER_FRIEND(4002, "查询朋友在线用户,body 为查询用户的 userId"), SEARCH_COUNT_NEED_TO_DEALT_WITH(4003, "查询全部待办总数"), WEBRTC_CALL(5001, "webrtc呼叫"), WEBRTC_ANSWER(5002, "webrtc接听"), WEBRTC_REFUSE(5003, "webrtc拒绝"), WEBRTC_JOIN(5004, "webrtc加入"), // 消息状态 STATUS_SEND(9001, "消息发送状态,body 为 MessageSendStatusBody 的 JSON 字符串"), STATUS_SEND_ONLINE(9002, "发送在线状态,body 为 在线用户的ID JSONArray 字符串"), STATUS_SEND_OFFLINE(9003, "发送离线状态,body 为 离线用户的ID JSONArray 字符串"), STATUS_RECEIVE(9101, "消息接受状态,body 自定义的交互内容"); } ```