### 项目介绍
1. 盒子IM是一个仿微信实现的网页版聊天软件,目前完全开源,仅用于学习和交流。
1. 支持私聊、群聊、离线消息、发送图片、文件、好友在线状态显示等功能。
1. 后端采用springboot+netty实现,前端使用vue。
1. 服务器支持集群化部署,每个im-server仅处理自身连接用户的消息
#### 近期更新
1. 支持发送emoji表情
1. 支持发送语音消息
1. 支持撤回和删除消息
#### 在线体验
体验地址:https://8.134.92.70
账号:
张三/123456
李四/123456
也可以自行注册账号
体验后记得帮忙点个star哟!
#### 项目结构
| 模块 | 功能 |
|-------------|------------|
| im-platform | 与页面进行交互,处理业务请求 |
| im-server | 推送聊天消息|
| im-common | 公共包 |
#### 集群化方案

- 当消息的发送者和接收者连的不是同一个server时,消息是无法直接推送的,所以我们需要设计出能够支持跨节点推送的方案
- 利用了redis的list类型数据实现消息推送,其中key为im:unread:${serverid},每个key的数据可以看做一个queue(或topic),每个im-server根据自己的serverid只消费属于自己的queue
- redis记录了每个用户的websocket连接的是哪个im-server,当用户发送消息时,im-platform将根据所连接的im-server的serverid,决定将消息推向哪个queue
#### 本地快速部署
1.安装运行环境
- 安装node:v14.16.0
- 安装jdk:1.8
- 安装maven:3.6.3
- 安装mysql:5.7,密码分别为root/root
- 安装redis:4.0
- 安装minio,命令端口使用9001,并创建一个名为"box-im"的bucket,并设置访问权限为公开
2.启动后端服务
```
mvn clean package
java -jar ./im-platform/target/im-platform.jar
java -jar ./im-server/target/im-server.jar
```
3.启动前端ui
```
cd im-ui
npm install
npm run serve
```
4.访问localhost:8080
#### 快速接入
消息推送的代码已经进行了client sdk封装(当然依然是开源的),对于需要接入im-server的小伙伴,可以按照下面的教程快速的集成到自己的项目中
4.1服务器接入
引入pom文件
```
com.bx
im-client
1.1.0
```
依赖了redis,所以要配置redis地址:
```
spring:
redis:
host: 127.0.0.1
port: 6379
```
直接把IMClient @Autowire进来就可以发送消息了,IMClient 只有2个接口:
```
public class IMClient {
/**
* 发送私聊消息
*
* @param recvId 接收用户id
* @param messageInfo 消息体,将转成json发送到客户端
*/
void sendPrivateMessage(Long recvId, PrivateMessageInfo... messageInfo);
/**
* 发送群聊消息
*
* @param recvIds 群聊用户id列表
* @param messageInfo 消息体,将转成json发送到客户端
*/
void sendGroupMessage(List recvIds, GroupMessageInfo... messageInfo);
}
```
发送私聊消息:
```
@Autowired
private IMClient imClient;
public void sendMessage(){
PrivateMessageInfo messageInfo = new PrivateMessageInfo();
Long recvId = 1L;
messageInfo.setId(123L);
messageInfo.setContent("你好呀");
messageInfo.setType(MessageType.TEXT.getCode());
messageInfo.setSendId(userId);
messageInfo.setRecvId(recvId);
messageInfo.setSendTime(new Date());
imClient.sendPrivateMessage(recvId,messageInfo);
}
```
如果需要对消息发送的结果进行监听的话,实现MessageListener,并加上@IMListener即可
```
@Slf4j
@IMListener(type = IMListenerType.PRIVATE_MESSAGE)
public class PrivateMessageListener implements MessageListener {
@Override
public void process(SendResult result){
PrivateMessageInfo messageInfo = (PrivateMessageInfo) result.getMessageInfo();
if(result.getStatus().equals(IMSendStatus.SUCCESS)){
// 消息发送成功
log.info("消息已读,消息id:{},发送者:{},接收者:{}",messageInfo.getId(),messageInfo.getSendId(),messageInfo.getRecvId());
}
}
}
```
#### 界面截图
文字聊天:

发送图片、文件:

发送语音

群聊:

好友列表:

群聊列表:

#### 联系方式
QQ: 825657193
邮箱:825657193@qq.com
有任何问题,欢迎给我留言哦
#### 点下star吧
撸码不易,喜欢的朋友麻烦点个star吧!