天津即时通讯项目

blue 888ed935be update README.md. %!s(int64=3) %!d(string=hai) anos
commom 04167892c5 消息撤回后采用逻辑删除 %!s(int64=3) %!d(string=hai) anos
im-platform 04167892c5 消息撤回后采用逻辑删除 %!s(int64=3) %!d(string=hai) anos
im-server 04167892c5 消息撤回后采用逻辑删除 %!s(int64=3) %!d(string=hai) anos
im-ui 999e883b77 支持删除和撤回消息 %!s(int64=3) %!d(string=hai) anos
minio 1449145b52 头像功能开发中 %!s(int64=3) %!d(string=hai) anos
截图 dce090af8f 截图更新 %!s(int64=3) %!d(string=hai) anos
打包 93558d89c3 添加一键打包脚本 %!s(int64=3) %!d(string=hai) anos
.gitignore 3c690a73ab 项目更名为盒子IM %!s(int64=3) %!d(string=hai) anos
LICENSE a6df97fff9 add LICENSE. %!s(int64=3) %!d(string=hai) anos
README.md 888ed935be update README.md. %!s(int64=3) %!d(string=hai) anos
pom.xml 3c690a73ab 项目更名为盒子IM %!s(int64=3) %!d(string=hai) anos

README.md

项目介绍

  1. 盒子IM是一个仿微信实现的网页版聊天软件,目前完全开源,仅用于学习和交流。
  2. 支持私聊、群聊、离线消息、发送图片、文件、好友在线状态显示等功能。
  3. 后端采用springboot+netty实现,前端使用vue。
  4. 服务器支持集群化部署,每个im-server仅处理自身连接用户的消息

近期更新

  1. 支持发送emoji表情
  2. 支持发送语音消息
  3. 支持撤回和删除消息

在线体验

体验地址: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

快速接入

消息推送的代码目前已经完成了封装,可以通过下面的教程快速的引入到自己的项目中

4.1服务器接入 引入pom文件

<dependency>
    <groupId>com.bx</groupId>
    <artifactId>im-client</artifactId>
    <version>1.1.0</version>
</dependency>

依赖了redis,所以要配置redis地址:

spring:
  redis:
    host: 127.0.0.1
    port: 6379

直接把IMClient @Autowire进来就可以发送消息了:

 @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吧!