Skip to content

Latest commit

 

History

History
61 lines (58 loc) · 3.08 KB

README.md

File metadata and controls

61 lines (58 loc) · 3.08 KB

#linux_qq 运行于linux上的命令行即时通讯程序

###编译运行

  • 编译
    • 进入clientserver目录,分别运行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事件: 用户输入,网络输入,网络输出
      • 开辟子线程负责文件发送或接收
      • 文件发送和主线程发送消息是一个互斥访问消息缓冲的问题
      • 接收文件是一个生产者-消费者问题: 主线程将接收到的文件消息发送到队列,子线程从队列读出消息并将消息内容写入对应文件