仿微信的聊天工具,网页版多端聊天软件 具有良好的横向扩展能力

仿微信的聊天工具,网页版多端聊天软件 具有良好的横向扩展能力

一个仿微信的聊天工具。后端采用springboot+netty实现,web端使用vue,移动端使用uniapp,支持私聊、群聊、离线消息、发送图片、文件、语音、emoji表情、视频聊天等功能。



一、项目简介

  • 一个仿微信实现的网页版聊天软件,目前完全开源。
  • 支持私聊、群聊、离线消息、发送语音、图片、文件、emoji表情等功能
  • 支持视频聊天(基于webrtc实现,需要ssl证书)
  • 后端采用springboot+netty实现,网页端使用vue,移动端使用uniapp
  • 服务器支持集群化部署,每个im-server仅处理自身连接用户的消息

二、功能概述特点

  • 一个仿微信实现的网页版聊天软件,目前完全开源且免费
  • 支持web端和移动端同时在线以及消息同步
  • 后端服务支持集群化部署,具有良好的横向扩展能力
  • 消息推送功能已进行SDK封装,可快速接入企业项目

合适人群

如果您是以下人群之一,那么盒子IM将会非常适合您:
  • 企业中的项目需要开发IM模块,希望快速整合盒子IM的部分功能
  • 对IM系统比较感兴趣,想学习如何独立编写一个优雅且高性能的IM系统
  • 在校生或者刚参加工作的小伙伴,通过学习优质的开源项目提升自己的编程实战能力
三、技术选型

前置技能

掌握以下技能:
后端:Springboot、Mybatis-plus、Netty、Mysql、Redis
前端:Vue、Uniapp

地环境搭建技术选型

后端框架:Springboot、Netty、Mybatis-plus、Swagger、Jwt
技术组件:Mysql、Redis、Minio、Coturn、Nginx
前端技术:Vue、Eelement-ui、Uniapp、Webrtc

基础环境安装安装GIT、JDK1.8、IDEA、Maven、HbuilderX(略)

项目结构[td]

模块 功能
im-platform 与页面进行交互,处理业务请求
im-server 推送聊天消息
im-client 消息推送sdk
im-common 公共包
im-ui web页面
im-uniapp app页面

消息推送方案

  • 当消息的发送者和接收者连的不是同一个server时,消息是无法直接推送的,所以我们需要设计出能够支持跨节点推送的方案
  • 利用了redis的list数据实现消息推送,其中key为im:unread{serverid},每个key的数据可以看做一个queue,每个im-server根据自身的id只消费属于自己的queue
  • redis记录了每个用户的websocket连接的是哪个im-server,当用户发送消息时,im-platform将根据所连接的im-server的id,决定将消息推向哪个queue

本地快速部署

1.安装运行环境
  • 安装node:v14.16.0
  • 安装jdk:1.8
  • 安装maven:3.6.3
  • 安装mysql:5.7,密码分别为root/root,运行sql脚本(脚本在im-platfrom的resources/db目录)
  • 安装redis:5.0
  • 安装minio,命令端口使用9001,并创建一个名为”box-im”的bucket,并设置访问权限为公开
2.启动后端服务
  1. mvn clean package
  2. java -jar ./im-platform/target/im-platform.jar
  3. java -jar ./im-server/target/im-server.jar

复制代码

3.启动前端web
  1. cd im-ui
  2. npm install
  3. npm run serve

复制代码

访问 http://localhost:8080
4.启动uniapp-h5 将im-uniapp目录导入HBuilderX,点击菜单”运行”->”开发环境-h5″ 访问 http://localhost:5173

快速接入

消息推送的请求代码已经封装在im-client包中,对于需要接入im-server的小伙伴,可以按照下面的教程快速的将IM功能集成到自己的项目中。
注意服务器端和前端都需要接入,服务器端发送消息,前端接收消息。
4.1 服务器端接入
引入pom文件
  1. <dependency>
  2.     <groupId>com.bx</groupId>
  3.     <artifactId>im-client</artifactId>
  4.     <version>2.0.0</version>
  5. </dependency>

复制代码

内容使用了redis进行通信,所以要配置redis地址:
  1. spring:
  2.   redis:
  3.     host: 127.0.0.1
  4.     port: 6379

复制代码

直接把IMClient通过@Autowire导进来就可以发送消息了,IMClient 只有2个接口:
  1. public class IMClient {
  2.     /**
  3.      * 发送私聊消息
  4.      *
  5.      * @param message 私有消息
  6.      */
  7.     public<T> void sendPrivateMessage(IMPrivateMessage<T> message);
  8.     /**
  9.      * 发送群聊消息(发送结果通过MessageListener接收)
  10.      *
  11.      * @param message 群聊消息
  12.      */
  13.     public<T> void sendGroupMessage(IMGroupMessage<T> message);
  14. }

复制代码

发送私聊消息(群聊也是类似的方式):
  1. @Autowired
  2. private IMClient imClient;
  3. public void sendMessage(){
  4.         IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
  5.         // 发送方的id和终端类型
  6.         sendMessage.setSender(new IMUserInfo(1L, IMTerminalType.APP.code()));
  7.         // 对方的id
  8.         sendMessage.setRecvId(2L);
  9.         // 推送给对方所有终端
  10.         sendMessage.setRecvTerminals(IMTerminalType.codes());
  11.         // 同时推送给自己的其他类型终端
  12.         sendMessage.setSendToSelf(true);
  13.         // 需要回推发送结果,将在IMListener接收发送结果
  14.         sendMessage.setSendResult(true);
  15.         // 推送的内容
  16.         sendMessage.setData(msgInfo);
  17.         // 推送消息
  18.         imClient.sendPrivateMessage(sendMessage);
  19. }

复制代码

监听发送结果: 1.编写消息监听类,实现MessageListener,并加上@IMListener 2.发送消息时指定sendResult为true
  1. @Slf4j
  2. @IMListener(type = IMListenerType.ALL)
  3. public class PrivateMessageListener implements MessageListener {
  4.     @Override
  5.     public void process(IMSendResult<PrivateMessageVO> result){
  6.         PrivateMessageVO messageInfo = result.getData();
  7.         if(result.getCode().equals(IMSendCode.SUCCESS.code())){
  8.             log.info(“消息发送成功,消息id:{},发送者:{},接收者:{},终端:{}”,messageInfo.getId(),result.getSender().getId(),result.getReceiver().getId(),result.getReceiver().getTerminal());
  9.         }
  10.     }
  11. }

复制代码

4.2 前端接入 首先将im-ui/src/api/wssocket.js拷贝到自己的项目。
接入代码如下:
  1. import * as wsApi from ‘./api/wssocket’;
  2. let wsUrl = ‘ws://localhost:8878/im’
  3. let token = “您的token”;
  4. wsApi.connect(wsUrl,token);
  5. wsApi.onConnect(() => {
  6.     // 连接打开
  7.     console.log(“连接成功”);
  8. });
  9. wsApi.onMessage((cmd,msgInfo) => {
  10.     if (cmd == 2) {
  11.             // 异地登录,强制下线
  12.             console.log(“您已在其他地方登陆,将被强制下线”);
  13.     } else if (cmd == 3) {
  14.             // 私聊消息
  15.             console.log(msgInfo);
  16.     } else if (cmd == 4) {
  17.             // 群聊消息
  18.             console.log(msgInfo);
  19.     }
  20. })
  21. wsApi.onClose((e) => {
  22.           if (e.code != 3000) {
  23.               console.log(“意外断开,进行重连”);
  24.               wsApi.reconnect(wsUrl,token);
  25.     }else{
  26.                     console.log(“主动断开”);
  27.           }
  28. });

复制代码

私聊:

群聊:

好友列表:

群聊列表:

微信小程序:

下载说明:
1.本站资源都是白菜价出售,同样的东西,我们不卖几百,也不卖几十,甚至才卖几块钱,一个永久会员能下载全站100%源码了,所以单独购买也好,会员也好均不提供相关技术服务。
2.如果源码下载地址失效请联系站长QQ进行补发。
3.本站所有资源仅用于学习及研究使用,请必须在24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担。资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您权益请联系本站删除!
4.本站站内提供的所有可下载资源(软件等等)本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发);但本网站不能保证资源的准确性、安全性和完整性,由于源码具有复制性,一经售出,概不退换。用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug;同时本站用户必须明白,【安安资源网】对提供下载的软件等不拥有任何权利(本站原创和特约原创作者除外),其版权归该资源的合法拥有者所有。
5.请您认真阅读上述内容,购买即以为着您同意上述内容,由于源码具有复制性,一经售出,概不退换。
安安资源网 » 仿微信的聊天工具,网页版多端聊天软件 具有良好的横向扩展能力