# CLCS **Repository Path**: ghost-him/CLCS ## Basic Information - **Project Name**: CLCS - **Description**: 一个linux下,基于命令行的聊天软件 - **Primary Language**: C++ - **License**: GPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-25 - **Last Updated**: 2025-01-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CLCS 一个linux下,基于命令行的聊天软件 [技术文档](https://github.com/ghost-him/CLCS/blob/main/doc/CLCS%20%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3.md) | [更新日志](https://github.com/ghost-him/CLCS/blob/main/doc/CLCS%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97.md) ## CLCS项目介绍 CLCS(Command Line Chat Software)是一个linux下的命令行软件, 采用了分布式的设计, 每一台电脑均可以当作一个服务器, 也可以当作一个客户端。 CLCS分为两个应用程序,一个是客户端,一个是服务端。客户端是用户使用的程序,服务端则是为其他用户提供服务的程序。可以将服务端存放在远程服务器上。这样就可以实现用户之间的远程交流了。 CLCS采用了`c++`作为编程语言, 采用`git`来实现版本管理,使用`cmake`作为构建系统。客户端和服务端均存放在同一个目录下,由同一个`CMakeLists.txt`来管理。 客户端与服务端采用`tcp`连接,其中服务端采用了`epoll ractor`模型,同时都使用了**线程池**来辅助程序的运行。由于`epoll reactor`使用了`ET`模式,同时我的水平还没有特别高,所以在运行时可能会出现不可预料的问题,我已经尽我的努力让出错的风险降低了。如果你发现了新的bug,欢迎联系我。 目前实现的功能还是比较单一的,受时间所限,暂时无法开发出更多功能了 目前**客户端**已经实现的功能有: 1. 添加用户 2. 重命名用户 3. 发送消息 1. 向指定的用户发送消息(加密) 2. 向当前所在的群组中发送消息 4. 接收用户发送的消息 5. 重新连接服务器 6. 重新设置目标服务器的地址 7. 查看- 1. 当前系统的时间 2. 自己的`uuid` 3. 当前已经添加的好友 4. 当前程序与服务器的连接的状态 5. 当前程序与服务器的延迟 6. 当前是否在群组中 8. 向服务器发送回调消息(服务器会将消息原封不动的返回) 9. 群组 1. 加入群组 2. 退出群组 10. 保存设置 11. 退出程序 目前**服务端**已经实现的功能: 1. 可操作 1. 退出程序 2. 不可操作 1. 连接与客户端的连接 2. 处理客户端发来的请求 3. 向客户端发送信息流 ## 程序安装方法 ### 开发环境 当前的开发环境: * `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`) ### 安装步骤 不论是服务器还是客户端,都分为两步: 1. 建立`cmake`的工作文件夹 ``` cmake -B build ``` 2. 执行`cmake`的命令 #### 服务端 ``` cmake --build build --target=CLCS-server -j=8 ``` `-j的值可以根据你自己电脑上的核心的数量来改变` 3. 进入 `./build/CLCS-server` 文件夹 4. 运行`CLCS-server`(也可以将当前程序移动到其他地方启动, 启动的时候,程序会在当前的目录下生成工作文件夹) 5. 进行初始化设置 ``` 语言: 看情况选择, 若无对应的语言文件, 则需要自己翻译, 语言文件在当前目录下的 `option/language` 文件夹中 ip与端口: 若无特殊需要, 跳过即可(ip将为当前可用ip, 端口将设置为6000) ``` 6. 程序开始运行 #### 客户端 ``` cmake --build build --target=CLCS-client -j=8 ``` 3. 进入 `build/CLCS-client` 文件夹 4. 运行`CLCS-client`(也可以将当前程序移动到其他地方启动, 启动的时候,程序会在当前的目录下生成工作文件夹) 5. 进行初始化设置 ``` 语言: 看情况选择, 若无对应的语言文件, 则需要自己翻译, 语言文件在当前目录下的 `option/language` 文件夹中 ip与端口: 填写目标服务器的地址(ip + 端口) ``` 6. 程序开始运行 ## 快速入门 ### 客户端 #### 命令展示 以下是在客户端中输入`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 ``` #### 主要功能二:向好友发送hello ``` 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 --- 阻塞输入 ``` #### 将服务器放在后台运行 有两种办法 1. 使用`nohup`命令 1. `nohup ./CLCS-server `或 `nohup ./CLCS-server` 2. 直接使用`&` 1. `./CLCS-server -b &` **阻塞了以后,如果想要重新输入,只需要输入 `CTRL + C` 即可恢复** ### 小技巧:暂停消息的输出,使得自己可以完整的输入命令 如果当前没有任何状态(即没有阻塞消息的输入,也没有暂停消息的输出)时,按下`ctrl-c`键,即可暂停消息的输出,再次按下时即可恢复。 当消息出来的过于频繁以至于无法完整输入一个命令时可以运用此技巧。 ## 安全性 [![Security Status](https://s.murphysec.com/badge/ghost-him/CLCS.svg)](https://www.murphysec.com/p/ghost-him/CLCS) ## 题外话 不知道下一次是什么时候再次开发这个软件了,应该是会在我考完研以后吧。。。 ## 未来发展 目前处在一个早起的版本, 仅仅实现了基础的业务逻辑, 其他的比如历史记录等都暂时未开始制作 软件还没有跑过压力测试,或许以后可以想办法跑一下压力测试 ### 下一次预计开发时间 `2024.1.20 - 2024.1.25` ### TODO #### 当前版本(version 0.6.0) * ALL DONE! #### 下一个版本(version 0.7.0) * 添加历史记录 * 添加文件传输