前言
暑假把linux下的高级编程和网络编程学习了一遍,学习很重要,但是也得有个练手的地方,所以必须做做项目来认识下自己所学习的知识。
能够找到小伙伴一起做项目也是一件很快乐的事情的,很幸运的有两个小伙伴一起做这个项目,而我正好负责整个客户端模块,她两负责编写服务器的模块。
开始吧:
项目具体描述:做一个可以实现单个服务器响应多客户端私聊和群聊的聊天工具。具体功能越丰富越好。
下面我以我们做项目的形式来讲讲我们的项目的实现。
项目策划
虽然只是私底下做项目,但是我们还是做了个小小的项目时间和项目实现上的规划,相当于一个实现的计划。
几个问题
这个项目有几个核心的东西必须讨论清楚:
(1)用户信息存储的数据库表
(2)自己定制的信息协议
自己定制协议,这样可以很大程度上放开很多东西,有了自己的协议我可以把所有的东西都变成一条消息,比如在实现私聊,群聊,离线消息,加好友等,都可以设置为一条请求消息和一条对应的回复消息的协议直接进行消息的打包,传输和解析操作。
下面看看外面自己定制的协议:
1 #ifndef AGREEMENT 2 #define AGREEMENT 3 4 /* 5 注册:101+用户名长度+用户名+密码长度+密码+密保问题+密保答案长度+密保答案 6 登录:102+用户名长度+用户名+密码长度+密码 7 改密:103+用户名长度+用户名+密保问题+密保答案长度+密保答案+密码长度+新密码 8 退出:104+用户名长度+用户名 9 加入群聊:105+用户名长度+用户名 10 回复: 11 111+回复类型+消息长度+消息 1:成功,2:用户名重复失败 12 112+回复类型+消息长度+消息 1:成功 2:失败(用户名,密码) 13 113+回复类型+消息长度+消息 1:成功 2:失败(用户名,密保) 14 15 16 201+发送者用户名长度+发送者用户名+接受者用户名长度+接受者用户名+消息长度+消息 17 202+发送者用户名长度+发送者用户名+消息长度+消息 18 203+被禁言用户名长度+被禁言用户名+禁言时间消息(一个字节) 19 204+被删除用户名长度+被删除用户名 20 205+指定用户名长度+指定用户名 21 206+发送者用户名长度+发送者用户名+接受者用户名长度+接受者用户名+消息长度+消息 22 207+发送者用户名长度+发送者用户名+接受者用户名长度+接受者用户名+文件消息长度+文件消息 23 208+用户数量+用户名长度+用户名 24 */ 25 //枚举: 26 /*消息类型*/ 27 enum{REGISTER,LOGIN,CHPASSWD,QUIT,JOIN,PMSG,QMSG,GAGMSG,DELMSG,SETMSG,LATEMSG,FILEMSG,USERLIST,REG_ACK,LOG_ACK,CHPW_ACK}; 28 29 /*101解析*/ 30 enum{REG_TYPE,REG_USERLEN,REG_USER,REG_PWLEN,REG_PW,REG_QUE,REG_ANSLEN,REG_ANS}; 31 /*102解析*/ 32 enum{LOG_TYPE,LOG_USERLEN,LOG_USER,LOG_PWLEN,LOG_PW}; 33 /*103解析*/ 34 enum{CHPW_TYPE,CHPW_USERLEN,CHPW_USER,CHPW_QUE,CHPW_ANSLEN,CHPW_ANS,CHPW_PWLEN,CHPW_PW}; 35 /*104解析*/ 36 enum{QUIT_TYPE,QUIT_USERLEN,QUIT_USER}; 37 /*105解析*/ 38 enum{JOIN_TYPE,JOIN_USERLEN,JOIN_USER}; 39 40 /*201解析*/ 41 enum{PRI_TYPE,PRI_FROMLEN,PRI_FROM,PRI_TOLEN,PRI_TO,PRI_MSGLEN,PRI_MSG}; 42 /*202解析*/ 43 enum{QM_TYPE,QM_FROMLEN,QM_FROM,QM_MSGLEN,QM_MSG}; 44 /*203解析*/ 45 enum{GAG_TYPE,GAG_USERLEN,GAG_USER,GAG_TIME}; 46 /*204解析*/ 47 enum{DEL_TYPE,DEL_USERLEN,DEL_USER}; 48 /*205解析*/ 49 enum{SET_TYPE,SET_USERLEN,SET_USER}; 50 /*206解析*/ 51 enum{LATE_TYPE,LATE_FROMLEN,LATE_FROM,LATE_TOLEN,LATE_TO,LATE_MSGLEN,LATE_MSG}; 52 /*207解析*/ 53 enum{FILE_TYPE,FILE_FROMLEN,FILE_FROM,FILE_TOLEN,FILE_TO,FILE_MSGLEN,FILE_MSG}; 54 /*208解析*/ 55 enum{USERL_TYPE,USERL_USERLEN,USERL_USER}; 56 57 /*111解析*/ 58 enum{REG_ACK_TYPE,REG_ACK_REPLY,REG_ACK_MSGLEN,REG_ACK_MSG}; 59 /*112解析*/ 60 enum{LOG_ACK_TYPE,LOG_ACK_REPLY,LOG_ACK_MSGLEN,LOG_ACK_MSG}; 61 /*113解析*/ 62 enum{CHPW_ACK_TYPE,CHPW_ACK_REPLY,CHPW_ACK_MSGLEN,CHPW_ACK_MSG}; 63 64 #include <QString> 65 #include <QCryptographicHash> 66 67 QString md5(QString str); 68 69 #endif // AGREEMENT