#linux_qq
运行于linux上的命令行即时通讯程序
###编译运行
- 编译
- 进入
client
和server
目录,分别运行make
- 进入
- 运行
- 首先运行
server
, 进入server
目录, 运行命令./server
- 再运行
client
, 进入client
目录, 运行命令./client xx.xx.xx.xx
xx.xx.xx.xx
代表服务器程序所在机器的ip地址
- 首先运行
###已有功能
- [注册]
- 运行客户端,选择
1
,按照提示输入用户名
和密码
- 运行客户端,选择
- [登录]
- 运行客户端,选择
0
,按照提示输入用户名
和密码
- 运行客户端,选择
- [发送消息]
- 请按照这个格式发送你的消息
to:对方的用户名:消息内容
to
代表发送消息命令:
是英文冒号,作为分隔符
- 请按照这个格式发送你的消息
- [发送文件]
- 命令格式为
fto:对方的用户名:文件路径
fto
代表请求发送文件命令文件路径
必须是合法的unix文件路径形式,例如:/home/wugui/data
或../data
- 该命令支持
目录传输
- 命令格式为
- [同意接收文件]
- 首先进入
client
目录,建立接收文件的根目录:mkdir data
- 命令格式为
fok:文件发送方的用户名:文件名
- 接收到的文件存放在
client/data/
目录下 - 如果待接收的文件已经在data目录下,将导致接收失败
- 首先进入
- [拒绝接收文件]
- 命令格式为
fno:文件发送方的用户名:文件名
- 命令格式为
- [查看好友列表]
- 命令
list
- 命令
- [请求添加好友]
- 命令格式
add:用户名
- 命令格式
- [同意添加好友]
- 命令格式
addok:请求方的用户名
- 命令格式
- [拒绝添加好友]
- 命令格式
addno:请求方的用户名
- 命令格式
###代码文件功能
msg_buffer.h
定义了向socket写入消息和从socket读出消息的缓冲队列util.h
声明了创建socket,设置epoll_event的帮助函数msg_util.h
定义了封装消息和拆解消息的接口ring_queue.h
定义了用于生产者-消费者问题的循环队列const.h
声明了所有常量server/
目录
server.cpp
包含了服务器的逻辑实现,添加新功能只需要修改do_service()函数和service.h中对应的接口即可service.h
定义了服务器程序的服务接口db.h
定义了服务器需要使用的表,这些表用来模拟数据库表registed
文件保存了注册用户信息friendship
文件保存了好友关系
client/
目录
user_input_util.h
定义了提取用户输入的接口fsocket.h
定义了传输文件的接口.文件传输的过程与tcp协议通信过程类似,分成建立连接,文件内容传输,断开连接.client.cpp
包含了客户端的逻辑
- 客户端使用select函数处理三类io事件: 用户输入,网络输入,网络输出
- 开辟子线程负责文件发送或接收
- 文件发送和主线程发送消息是一个
互斥访问
消息缓冲的问题 - 接收文件是一个生产者-消费者问题: 主线程将接收到的文件消息发送到队列,子线程从队列读出消息并将消息内容写入对应文件
- 客户端使用select函数处理三类io事件: 用户输入,网络输入,网络输出