一个linux下,基于命令行的聊天软件
CLCS(Command Line Chat Software)是一个linux下的命令行软件, 采用了分布式的设计, 每一台电脑均可以当作一个服务器, 也可以当作一个客户端。
CLCS分为两个应用程序,一个是客户端,一个是服务端。客户端是用户使用的程序,服务端则是为其他用户提供服务的程序。可以将服务端存放在远程服务器上。这样就可以实现用户之间的远程交流了。
CLCS采用了c++
作为编程语言, 采用git
来实现版本管理,使用cmake
作为构建系统。客户端和服务端均存放在同一个目录下,由同一个CMakeLists.txt
来管理。
客户端与服务端采用tcp
连接,其中服务端采用了epoll ractor
模型,同时都使用了线程池来辅助程序的运行。由于epoll reactor
使用了ET
模式,同时我的水平还没有特别高,所以在运行时可能会出现不可预料的问题,我已经尽我的努力让出错的风险降低了。如果你发现了新的bug,欢迎联系我。
目前实现的功能还是比较单一的,受时间所限,暂时无法开发出更多功能了
目前客户端已经实现的功能有:
-
添加用户
-
重命名用户
-
发送消息
- 向指定的用户发送消息(加密)
- 向当前所在的群组中发送消息
-
接收用户发送的消息
-
重新连接服务器
-
重新设置目标服务器的地址
-
查看-
- 当前系统的时间
- 自己的
uuid
- 当前已经添加的好友
- 当前程序与服务器的连接的状态
- 当前程序与服务器的延迟
- 当前是否在群组中
-
向服务器发送回调消息(服务器会将消息原封不动的返回)
-
群组
- 加入群组
- 退出群组
-
保存设置
-
退出程序
目前服务端已经实现的功能:
- 可操作
- 退出程序
- 不可操作
- 连接与客户端的连接
- 处理客户端发来的请求
- 向客户端发送信息流
当前的开发环境:
Linux version 5.19.1-3-MANJARO
gcc 版本 12.1.1 20220730 (GCC)
cmake version 3.23.3
要求的开发环境:
- 支持
c++20
的标准 - 支持
cmake
的-B
和--build
命令 - 安装
openssl
开发环境 - 安装
libuuid
库 - 安装
json
库(作者是nlohmann
)
不论是服务器还是客户端,都分为两步:
- 建立
cmake
的工作文件夹
cmake -B build
- 执行
cmake
的命令
cmake --build build --target=CLCS-server -j=8
-j的值可以根据你自己电脑上的核心的数量来改变
-
进入
./build/CLCS-server
文件夹 -
运行
CLCS-server
(也可以将当前程序移动到其他地方启动, 启动的时候,程序会在当前的目录下生成工作文件夹) -
进行初始化设置
语言: 看情况选择, 若无对应的语言文件, 则需要自己翻译, 语言文件在当前目录下的 `option/language` 文件夹中
ip与端口: 若无特殊需要, 跳过即可(ip将为当前可用ip, 端口将设置为6000)
- 程序开始运行
cmake --build build --target=CLCS-client -j=8
-
进入
build/CLCS-client
文件夹 -
运行
CLCS-client
(也可以将当前程序移动到其他地方启动, 启动的时候,程序会在当前的目录下生成工作文件夹) -
进行初始化设置
语言: 看情况选择, 若无对应的语言文件, 则需要自己翻译, 语言文件在当前目录下的 `option/language` 文件夹中
ip与端口: 填写目标服务器的地址(ip + 端口)
- 程序开始运行
以下是在客户端中输入help
命令弹出来的提示信息
add
添加指定的用户
add [uuid]
cat
查看信息
cat [参数]
connect
与服务器的连接状态
group
是否在群组中
latency
与服务器的延迟
time
当前系统的时间
user
当前已经保存的用户
uuid
自己的uuid
group
群组相关的操作
join
加入群组
leave
离开群组
help
输出此条信息
quit
退出程序
re_connect
重新连接目标服务器
recall
向服务器发送回调消息
recall [消息]
rename
更改用户的昵称
rename [uuid/旧昵称] [新昵称]
reset_target
重新设置目标服务器的ip和地址
save
保存设置
send
发送消息
group
向群组发送消息
send group [消息]
user
向用户发送消息
send user [uuid/昵称] [消息]
1. 好友1 和 好友2连接到同一个服务器中
2. 好友1查看自己的uuid
(好友1输入)cat uuid
此时设好友1的uuid为51c44468-329e-4df6-8771-5d6350842ec5
3. 好友2添加好友1
(好友2输入)add 51c44468-329e-4df6-8771-5d6350842ec5
这样好友2就将好友1的公钥信息保存到了自己的本地
4. 好友2 重命名 好友1的昵称
(好友2输入)rename 51c44468-329e-4df6-8771-5d6350842ec5 user1
这样,好友1的昵称就设置为了user1
1. 好友1 和好友2连接到同一个服务器中
2. 好友2向好友1发送hello
(好友2输入)send user user1 "hello"
3. 此时好友1 的屏幕中则会显示出时间,好友2的昵称和消息内容,若好友2没有被好友1添加过, 则会自动添加好友2
1. 加入当前服务器的群组
group join
2. 向服务器的群组中发送"hello world"
send group "hello world"
3.(可选)退出群聊
group leave
服务端主要的功能是用于转发客户端的消息。
有两个命令可以使用:
quit --- 退出并保存当前的程序
block --- 阻塞输入
有两种办法
- 使用
nohup
命令nohup ./CLCS-server
或nohup ./CLCS-server
- 直接使用
&
./CLCS-server -b &
阻塞了以后,如果想要重新输入,只需要输入 CTRL + C
即可恢复
如果当前没有任何状态(即没有阻塞消息的输入,也没有暂停消息的输出)时,按下ctrl-c
键,即可暂停消息的输出,再次按下时即可恢复。
当消息出来的过于频繁以至于无法完整输入一个命令时可以运用此技巧。
不知道下一次是什么时候再次开发这个软件了,应该是会在我考完研以后吧。。。
目前处在一个早起的版本, 仅仅实现了基础的业务逻辑, 其他的比如历史记录等都暂时未开始制作
软件还没有跑过压力测试,或许以后可以想办法跑一下压力测试
2024.1.20 - 2024.1.25
- ALL DONE!
- 添加历史记录
- 添加文件传输