cim

📲cim(cross IM) 适用于开发者的分布式即时通讯系统

  • Owner: crossoverJie/cim
  • Platform:
  • License:: MIT License
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

Build Status

📘介绍, 📽视频演示, 🏖TODO LIST, 🌈系统架构, 💡流程图, 🌁快速启动, 👨🏻‍✈️内置命令, 🎤通信, ❓QA, 💌联系作者

介绍

CIM(CROSS-IM) 一款面向开发者的 IM(即时通讯)系统;同时提供了一些组件帮助开发者构建一款属于自己可水平扩展的 IM

借助 CIM 你可以实现以下需求:

  • IM 即时通讯系统。
  • 适用于 APP 的消息推送中间件。
  • IOT 海量连接场景中的消息透传中间件。

在使用或开发过程中有任何疑问都可联系我

视频演示

点击下方链接可以查看视频版 Demo。, YouTube, Bilibili, :------:, :------:, 群聊 私聊, 群聊 私聊, ,

TODO LIST

系统架构

  • CIM 中的各个组件均采用 SpringBoot 构建。
  • 采用 Netty 构建底层通信。
  • Redis 存放各个客户端的路由信息、账号信息、在线状态等。
  • Zookeeper 用于 IM-server 服务的注册与发现。

cim-server

IM 服务端;用于接收 client 连接、消息透传、消息推送等功能。

支持集群部署。

cim-forward-route

消息路由服务器;用于处理消息路由、消息转发、用户登录、用户下线以及一些运营工具(获取在线用户数等)。

cim-client

IM 客户端;给用户使用的消息终端,一个命令即可启动并向其他人发起通讯(群聊、私聊)。

流程图

  • 客户端向 route 发起登录。
  • 登录成功从 Zookeeper 中选择可用 IM-server 返回给客户端,并保存登录、路由信息到 Redis
  • 客户端向 IM-server 发起长连接,成功后保持心跳。
  • 客户端下线时通过 route 清除状态信息。

快速启动

首先需要安装 Zookeeper、Redis 并保证网络通畅。

git clone https://github.com/crossoverJie/cim.git
cd cim
mvn -Dmaven.test.skip=true clean package

部署 IM-server(cim-server)

cp /cim/cim-server/target/cim-server-1.0.0-SNAPSHOT.jar /xx/work/server0/
cd /xx/work/server0/
nohup java -jar  /root/work/server0/cim-server-1.0.0-SNAPSHOT.jar --cim.server.port=9000 --app.zk.addr=zk地址  > /root/work/server0/log.file 2>&1 &

cim-server 集群部署同理,只要保证 Zookeeper 地址相同即可。

部署路由服务器(cim-forward-route)

cp /cim/cim-server/cim-forward-route/target/cim-forward-route-1.0.0-SNAPSHOT.jar /xx/work/route0/
cd /xx/work/route0/
nohup java -jar  /root/work/route0/cim-forward-route-1.0.0-SNAPSHOT.jar --app.zk.addr=zk地址 --spring.redis.host=redis地址 --spring.redis.port=6379  > /root/work/route/log.file 2>&1 &

cim-forward-route 本身就是无状态,可以部署多台;使用 Nginx 代理即可。

启动客户端

cp /cim/cim-client/target/cim-client-1.0.0-SNAPSHOT.jar /xx/work/route0/
cd /xx/work/route0/
java -jar cim-client-1.0.0-SNAPSHOT.jar --server.port=8084 --cim.user.id=唯一客户端ID --cim.user.userName=用户名 --cim.route.url=http://路由服务器:8083/


如上图,启动两个客户端可以互相通信即可。

本地启动客户端

注册账号

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{
  "reqNo": "1234567890",
  "timeStamp": 0,
  "userName": "zhangsan"
}' 'http://路由服务器:8083/registerAccount'

从返回结果中获取 userId

{
    "code":"9000",
    "message":"成功",
    "reqNo":null,
    "dataBody":{
        "userId":1547028929407,
        "userName":"test"
    }
}

启动本地客户端

# 启动本地客户端
cp /cim/cim-client/target/cim-client-1.0.0-SNAPSHOT.jar /xx/work/route0/
cd /xx/work/route0/
java -jar cim-client-1.0.0-SNAPSHOT.jar --server.port=8084 --cim.user.id=上方返回的userId --cim.user.userName=用户名 --cim.route.url=http://路由服务器:8083/

客户端内置命令, 命令, 描述, ------, ------, :q!, 退出客户端, :olu, 获取所有在线用户信息, :all, 获取所有命令, :q [option], 【:q 关键字】查询聊天记录, :ai, 开启 AI 模式, :qai, 关闭 AI 模式, :pu, 模糊匹配用户, :info, 获取客户端信息, :emoji [option], 查询表情包 [option:页码], :delay [msg] [delayTime], 发送延时消息, :, 更多命令正在开发中。。,

聊天记录查询

使用命令 :q 关键字 即可查询与个人相关的聊天记录。

客户端聊天记录默认存放在 /opt/logs/cim/,所以需要这个目录的写入权限。也可在启动命令中加入 --cim.msg.logger.path = /自定义 参数自定义目录。

AI 模式

使用命令 :ai 开启 AI 模式,之后所有的消息都会由 AI 响应。

:qai 退出 AI 模式。

前缀匹配用户名

使用命令 :qu prefix 可以按照前缀的方式搜索用户信息。

该功能主要用于在移动端中的输入框中搜索用户。

群聊/私聊

群聊



群聊只需要在控制台里输入消息回车后即可发送,同时所有在线客户端都可收到消息。

私聊

私聊首先需要知道对方的 userID 才能进行。

输入命令 :olu 可列出所有在线用户。

接着使用 userId;;消息内容 的格式即可发送私聊消息。




同时另一个账号收不到消息。

emoji 表情支持

使用命令 :emoji 1 查询出所有表情列表,使用表情别名即可发送表情。


延时消息

发送 10s 的延时消息:

:delay delayMsg 10

联系作者

Main metrics

Overview
Name With OwnercrossoverJie/cim
Primary LanguageJava
Program languageJava (Language Count: 4)
Platform
License:MIT License
所有者活动
Created At2018-05-20 15:55:56
Pushed At2025-05-21 01:14:31
Last Commit At2025-05-21 09:14:31
Release Count10
Last Release Namev2.0.0 (Posted on )
First Release Name0 (Posted on )
用户参与
Stargazers Count9.4k
Watchers Count389
Fork Count2.9k
Commits Count531
Has Issues Enabled
Issues Count96
Issue Open Count37
Pull Requests Count55
Pull Requests Open Count3
Pull Requests Close Count14
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private