05-接入消息推送(实现聊天功能)

1. 前言

前面已经介绍过,消息推送功能由im-server实现,并且已经封装了sdk(im-client)。

现在我们把消息推送功能看成一个黑盒,暂时不深究它的具体实现,本小节的目标是在im-platform中集成im-client,集成之后,im-platform只需要调用im-client的api,就能够把消息推送到前端

同样,如果您企业中的项目需要集成消息推送功能,也是同样的接入方式,只是将im-platform替换成您的服务

2. im-client相关API介绍

2.1. API列表

API

说明

sendPrivateMessage

推送私聊消息

sendGroupMessage

推送群聊消息

sendSystemMessage

推送系统消息

isOnline

用户是否在线

2.2. 私聊消息API参数

参数

类型

必填

说明

sender

IMUserInfo

发送方的信息,包括发送方的id和终端类型

recvId

Long

接收方id

recvTerminals

List<Integer>

接收者的终端类型,默认全部

sendToSelf

Boolean

是否发送给自己的其他终端,默认true

sendResult

Boolean

是否需要回推发送结果,默认true

data

泛型

消息内容,类型由应用层定义

2.3. 群聊消息API参数

参数

类型

必填

说明

sender

IMUserInfo

发送方的信息,包括发送方的id和终端类型

recvIds

List<Long>

接收者id列表(一般填群成员id,为空则不会推送)

recvTerminals

List<Integer>

接收者终端类型,默认所有类型

sendToSelf

Boolean

是否需要同时推送给自己的其他终端,默认true

sendResult

Boolean

是否需要回推发送结果,默认true

data

泛型

消息内容,类型由应用层定义

2.4. 系统消息API参数

参数

类型

必填

说明

recvIds

List<Long>

接收者id列表(一般填群成员id,为空则不会推送)

recvTerminals

List<Integer>

接收者终端类型,默认所有类型

sendResult

Boolean

是否需要回推发送结果,默认true

data

泛型

消息内容,类型由应用层定义

3. 快速接入

3.1. 后端接入

3.1.1. 在im-platform的pom.xml中引入im-client依赖
 
 
 
<dependency>
<groupId>com.bx</groupId>
<artifactId>im-client</artifactId>
<version>3.0.0</version>
</dependency>

注:上面的依赖包目前并没有上传到公开仓库,需要自行编译并上传到自己的maven私仓,或者直接把代码整合到自己的项目

3.1.2. 消息推送使用了redis充当MQ进行通信,所以要在application.yml中配置redis地址
 
 
 
spring:
redis:
host: 127.0.0.1
port: 6379
3.1.3. 调用IMClient的API进行消息推送

推送私聊消息代码样例(群聊和系统消息也是类似的方式,不再赘述)

 
 
 
@Autowired
private IMClient imClient;
 
public void sendMessage(){
IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
// 发送方的id和终端类型
sendMessage.setSender(new IMUserInfo(1L, IMTerminalType.APP.code()));
// 对方的id
sendMessage.setRecvId(2L);
// 推送给对方所有终端
sendMessage.setRecvTerminals(IMTerminalType.codes());
// 同时推送给自己的其他类型终端
sendMessage.setSendToSelf(true);
// 需要回推发送结果,将在IMListener接收发送结果
sendMessage.setSendResult(true);
// 推送的内容
sendMessage.setData(msgInfo);
// 推送消息
imClient.sendPrivateMessage(sendMessage);
}
3.1.4. 监听发送结果

如果需要监听消息推送的结果,需要以下两步:

  • 编写消息监听类,实现MessageListener,并加上@IMListener
  • 发送消息时指定sendResult字段为true

监听器类代码样例:

 
 
 
@Slf4j
@IMListener(type = IMListenerType.PRIVATE_MESSAGE)
public class PrivateMessageListener implements MessageListener {
 
@Override
public void process(IMSendResult<PrivateMessageVO> result){
PrivateMessageVO messageInfo = result.getData();
if(result.getCode().equals(IMSendCode.SUCCESS.code())){
log.info(“消息发送成功,消息id:{},发送者:{},接收者:{},终端:{}”,messageInfo.getId(),result.getSender().getId(),result.getReceiver().getId(),result.getReceiver().getTerminal());
}
}
}

3.2. 前端接入

3.2.1. 将wssocket.js放到im-web中的/api目录

📎wssocket.js

3.2.2. 接收消息

前端代码样例:

 
 
 
import * as wsApi from ‘./api/wssocket’;
 
let wsUrl = ‘ws://localhost:8878/im’
let token = “您的token”;
wsApi.connect(wsUrl,token);
wsApi.onConnect(() => {
// 连接打开
console.log(“连接成功”);
});
wsApi.onMessage((cmd,msgInfo) => {
if (cmd == 2) {
// 异地登录,强制下线
console.log(“您已在其他地方登陆,将被强制下线”);
} else if (cmd == 3) {
// 私聊消息
console.log(msgInfo);
} else if (cmd == 4) {
// 群聊消息
console.log(msgInfo);
}else if (cmd == 5){
// 系统消息
console.log(msgInfo);
}
 
})
wsApi.onClose((e) => {
if (e.code != 3000) {
console.log(“意外断开,进行重连”);
wsApi.reconnect(wsUrl,token);
}else{
console.log(“主动断开”);
}
});

4. 实现聊天功能(私聊+群聊)

当我们的im-platform集成im-client之后,实现私聊和群聊功能就会变得非常简单,通过简单的crud以及调用api即可实现。

以下是聊天相关的业务代码(代码比较简单,小伙伴可以自行阅读):

类名

方法

说明

PrivateMessageServiceImpl

sendMessage

推送私聊消息

GroupMessageServiceImpl

sendMessage

推送群聊消息

PrivateMessageListener

process

监听私聊消息结果,消息发送成功后,状态修改为送达

GroupMessageListener

process

监听群聊消息结果,暂时没实际作用

 

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容