# chat_room
**Repository Path**: jackyandwang/chat_room
## Basic Information
- **Project Name**: chat_room
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-09-21
- **Last Updated**: 2024-09-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### HLW聊天室——使用Linux C网络编程技术开发的多人聊天工具
#### 安装部署
- 克隆
``` shell?linenums
git clone https://github.com/fujie-xiyou/chat_room.git
```
- 服务器端
``` shell?linenums
cd chat_room/Server
make
```
然后将`chat_room.sql`导入到你的数据库中,并修改`config.json`中的数据库信息
最后`./chat_room_srv`
没有报错的话服务器就启动成功了
- 客户端
``` shell?linenums
cd chat_room/Client
make
```
然后在config.json中修改服务器地址
最后`./chat_room_cli`
请先注册一个账号
#### 演示视频
[聊天室视频演示](https://www.github.com/fujie-xiyou/Graph-bed/raw/master/小书匠/聊天室.md/聊天室演示.mp4)
#### 项目概述
- 本项目是一个使用Linux C网络编程技术开发的字符界面聊天室,基本功能有,用户注册登录,添加好友,私聊,创建群聊,邀请好友加入群聊,群聊,聊天记录查看,文件传送等。
#### 项目设计
- 本项目基于C/S模型设计,分为客户端和服务器端两个部分,客户端直接连接到服务器,与服务器双向交换数据,服务器端用于接收客户端发来的消息,并转发给目标用户,所有数据的持久化工作也均由服务器端完成。
- 项目代码采用分层的思想进行设计,客户端由界面层和业务逻辑层(请求层)构成,服务器端由业务逻辑层和持久化层构成,代码结构如图:

- 数据库设计
- 本项目开发时尚未系统学过数据库相关课程,但是后来审视本项目数据库设计,居然是符合BC范式的。
- 项目数据库部分示例如图所示

- 文件传输功能设计
由于本项目客户端与服务器端采用JSON进行数据交互,对于文件传输需要做特殊处理,因此在此简单介绍一下文件传输的处理方式,先上图:

- 如图在当用户输入要发送的文件名后,系统使用open()系统调用打开文件,然后使用read()系统调用读取指定字节的文件内容,将read的返回值记录在数据包的size字段,然后将读取到的文件内容使用base64转码,将得到的结果记录在数据包的data字段中,然后将数据包发给接收方,再根据read返回值的大小判断文件是否全部发送完成,如果read返回值小于read的大小参数,则关闭文件,否则继续read转码发送。
- 接收方收到文件包后,将data中的数据解码为二进制,然后根据size的值将存储data的转码结果的buff中的数据追加写入文件中。