wiki-files/wg-basic/websocket.md

6.6 KiB
Raw Blame History

title description published date tags editor dateCreated
7.即时消息 即时消息模块的使用 true 2021-12-07T06:57:37.466Z wg-basic markdown 2021-09-14T06:25:26.887Z

依赖模块

<dependency>
  <groupId>ink.wgink</groupId>
  <artifactId>module-instant-message</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

配置

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. 请求接口后拿到会话IDsessionId

  4. 初始化 WebSocket

  5. 连接打开后,发起 会话注册,携带请求后的 sessionId 完成会话注册。

  6. 注册成功后,可发起 scoket 请求

类型与参数

1.消息格式说明

消息格式为 JSONObject 字符串 具体内容如下表

属性 说明 类型 是否可空
id 消息ID唯一 String
type 消息类型编码 Integer
isSystem 是否是系统消息 Boolean
from 发送人的 userId,如果是系统消息则为:SYSTEM String
to 接收人的 userIduserId 列表。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 接收错误
410 USER_OFFLINE 用户离线
411 TEXT_MESSAGE_USER_OFFLINE 文本消息用户离线
412 RTC_MESSAGE_USER_OFFLINE 实时语音用户离线
500 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 与消息格式说明 中的 消息格式 相同

消息类型枚举

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 自定义的交互内容");
  
}