https://crossoverjie.top/categories/Netty/
介绍
CIM(CROSS-IM)
一款面向开发者的 IM(即时通讯)
系统;同时提供了一些组件帮助开发者构建一款属于自己可水平扩展的 IM
。
借助 CIM
你可以实现以下需求:
IM
即时通讯系统。- 适用于
APP
的消息推送中间件。 IOT
海量连接场景中的消息透传中间件。
在使用或开发过程中有任何疑问都可联系我。
视频演示
点击下方链接可以查看视频版 Demo。
YouTube | Bilibili |
---|---|
群聊 私聊 | 群聊 私聊 |
TODO LIST
- 群聊
- 私聊
- 内置命令
- 聊天记录查询。
- 一键开启价值 2 亿的
AI
模式 - 使用
Google Protocol Buffer
高效编解码 - 根据实际情况灵活的水平扩容、缩容
- 服务端自动剔除离线客户端
- 客户端自动重连
- 延时消息
- 分组群聊
- SDK 开发包
- 离线消息
- 协议支持消息加密
系统架构
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
from https://github.com/crossoverJie/cim
------------
OIM是采用 Java平台开发的一套即时通讯聊天系统,献给对即时通讯有兴趣的朋友。服务端实现了TCP Socket和WebSocket。方便接入网页版、安卓、IOS、PC桌面版客户端。OIM已经实现桌面版客户端,可以跨平台Windows、mac、Linux使用,用于公司内网、外网通讯、客服系统等,聊天系统。OIM项目可用于任何商业、个人作品中并且希望能够保留作者信息。如果OIM能够帮助到您,请点赞好评,加个星.
项目说明
本项目是采用Java为主要开发语言的即时通讯系统,包含客户端和服务端,其中也包含网页版客户端,而oim-fx 是用JavaFx开发的桌面版客户端,为了大家方便下载代码,就将客户端和服务端都放到oim-fx库中,因为有些代码在其他项目中用到,为了方便维护,所以拆分了很多个项目。
献给对即时通讯有兴趣的朋友。服务端实现了TCP Socket和WebSocket。方便接入网页版、安卓、IOS、PC桌面版客户端。OIM已经实现桌面版客户端,可以跨平台Windows、mac、Linux使用,用于公司内网、外网通讯、客服系统等,聊天系统。OIM项目可用于任何商业、个人作品中并且希望能够保留作者信息。如果OIM能够帮助到您,请点赞好评,加个星。
from https://github.com/oimchat/oim-fx
------
flamingo 一款高性能轻量级开源即时通讯软件.
我为 Flamingo 专门录制了两部高清技术讲解视频以方便读者学习,视频中介绍了Flamingo的编译和部署方法、整体架构、各个模块的技术实现细节以及如何学习Flamingo的方法,需要视频教程的读者可以扫描[高性能服务器开发]公众号二维码,关注后并在后台回复关键字“flamingo”即可得到下载链接。
介绍Flamingo IM 是一款高性能、轻量级的开源即时通讯软件,目前包括服务器端、pc 端、安卓端,微信版本和 IOS 版本目前正在开发中。
功能列表目前已经实现了如下功能(这里只列举网络相关的功能,其他客户端已经实现的功能不统计在列,请自行发现):
- 注册
- 登录
- 查找好友、查找群
- 添加好友、添加群
- 好友列表、群列表、最近会话
- 单人聊天功能(包括发文字、表情、窗口抖动、离线文件)
- 群组功能(包括发文字、表情)
- 群发消息
- 修改密码
- 修改个人信息(自定义昵称、签名、个性头像等个人信息)
- 自动升级功能
- 断线重连
- 客户端还有很多细节功能,比如头像有三种显示模式、好友上线动画、聊天记录、聊天自动回复功能等,有兴趣的同学可以自己探索尝试一下吧,这里就不截图了。
编译和安装
服务器端的编译与安装
依赖的开发工具
- 安装cmake、makefile和gcc。
作系统是 Linux,推荐的版本是 CentOS 7.0 以上。服务器代码使用纯C++11开发,所以您的gcc/g++版本必须至少在4.7以上,推荐的版本是4.8.5。另外,使用cmake和makefile工具进行项目管理和编译,因此您需要安装cmake和makefile工具。
安装 mysql。
使用的数据库是mysql,如果您使用的是CentOS 7.0及以上系统,需要安装 mariadb-server、mariadb-client 和 mariadb-devel。如果您使用的是其他版本的linux系统,请安装 mysql-server、mysql-client 和 mysql-devel。
聊天服务 chatserver 会使用到 mysql,mysql 的库名(默认库名叫 flamingo)、登陆用户名和密码配置在
flamingoserver/etc/chatserver.conf
文件中。首次启动聊天服务chatserver时,程序会自动检测是否存在flamingo这样的库,如果不存在则创建之,并检测相应的数据表是否存在,如果不存在则创建它们。所以,无需手动创建对应的库和表。当然,不排除由于不同的mysql版本对应的SQL语法有细微差别,可能建表会失败,这个时候你可能需要手动建表,建表语句在flamingoserver/table.sql中。flamingo目前使用的四个表分别是:
表名 用途说明 t_user 用户信息表 t_user_relationship 好友关系及群成员信息表 t_chatmsg 聊天记录表
编译方法
进入
flamingoserver
目录,执行:cmake .
如果没有错误,会产生一个 Makefile 文件。
执行如下命令生成可执行文件:chatserver、fileserver、imgserver。
make
各个服务的作用如下:
服务名称 用途说明 chatserver 聊天服务,用于基本的用户注册、登陆、聊天功能。 fileserver 文件服务,用于聊天窗口中的离线文件的发送和客户端自动升级包的下载。 imgserver 图片服务,用于聊天中图片文件的发送与用户自定义头像的上传与下载。 启动方式
chatserver、fileserver、imgserver 这三个服务是相互独立的,可以直接在 Linux 中单独启动,也可以以守护进程的形式启动,守护进程形式启动命令:
./chatserver -d ./fileserver -d ./imgserver -d
使用的端口说明
可以使用一下
lsof
命令查看端口是否处于正常侦听状态:[zhangyl@localhost flamingoserver]$ lsof -i -Pn COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chatserve 18540 zhangyl 19u IPv4 1129031 0t0 TCP *:20000 (LISTEN) chatserve 18540 zhangyl 27u IPv4 1129032 0t0 TCP *:8888 (LISTEN) chatserve 18540 zhangyl 35u IPv4 1129033 0t0 TCP *:12345 (LISTEN) fileserve 18552 zhangyl 25u IPv4 1130523 0t0 TCP *:20001 (LISTEN) imgserver 18562 zhangyl 25u IPv4 1131971 0t0 TCP *:20002 (LISTEN)
端口号 所属服务 用途说明 20000 chatserver 聊天端口 8888 chatserver 聊天服务的监控端口,可以使用telnet或nc命令远程连接至聊天服务去查看服务器的一些实时状态信息 12345 chatserver 聊天服务的http端口,聊天服务不仅支持长连接,也支持http短连接。 20001 fileserver 文件服务端口 20002 imgserver 图片服务端口 上表中的8888端口可以使用nc命令,使用方式:
nc -v ip port
去连接,其中port这里就是 8888,-v 选项是 nc 命令支持的选项,表示要求显示的信息丰富一点。示例:[zhangyl@localhost flamingoserver]$ nc -v 127.0.0.1 8888 Ncat: Version 6.40 ( http://nmap.org/ncat ) Ncat: Connected to 127.0.0.1:8888. 1. help-show help info 2. ul-show online user list 3. su-show userinfo specified by userid: su [userid] ul No user online. su please specify userid. help 1. help-show help info 2. ul-show online user list 3. su-show userinfo specified by userid: su [userid]
连接成功以后,你可以根据命令说明输入相应的命令来查看服务器的状态信息,目前只实现三个命令,即上面显示的 help、ul、su,您可以继续增加更多的命令。
**提醒一下:**服务器代码不仅是一款即时通讯软件的服务器代码,同时也是一款通用的 C++11 服务器框架。
pc客户端编译和安装
使用Visual Studio 2019打开flamingoclient/目录下的Flamingo.sln即可编译。这个解决方案包括三个工程项目,说明如下:
项目名称 项目说明 Flamingo.sln flamingo pc版主程序 CatchScreen flamingo聊天中用的抓屏程序,类似QQ截图。 iUpdateAuto 用户pc端自动升级的zip解压工具。
生成后的程序位于目录flamingoclient\Bin目录下,其中客户端与服务器的连接配置信息位于flamingoclient\Bin\config\flamingo.ini文件中,直接打开Flamingo.exe即可启动flamingo pc端。
安卓客户端编译和安装
用Android Studio打开**flamingoAndroid/**目录下的安卓工程,编译产生相应的flamingo.apk文件,安装至安卓手机即可使用。与服务器的连接设置,在安卓版本的登陆界面的服务器设置中。
更新日志
由于平常工作比较忙,不能固定周期地更新flamingo,但我保证我会一直维护下去。更新日志请参见:
https://github.com/baloonwj/flamingo/issues/1
BUG反馈
如果您在使用的过程中发现任何bug,可以给我发邮件:balloonwj@qq.com,也可以去 bug 反馈页面进行反馈:
https://github.com/baloonwj/flamingo/issues/5。
凡是涉及到崩溃、死机等影响使用的重大 bug,我将在三个工作日内予以解决;其他不影响使用的功能性 bug,两个星期内解决。
联系方式
如果您在使用这个项目的过程中遇到任何问题,或者您对我的项目有任何意见或者建议,再或者有不错的想法欢迎与我交流,可以加我微信 easy_coder,您也可以加入QQ技术群进行交流讨论:729995516。
from https://github.com/balloonwj/flamingo
No comments:
Post a Comment