阅读量:0
上一篇实现了客户端与服务器的通信,这一篇继续实现相关功能
本章内容
- 服务器与数据库的连接
- 通信格式的规范
- 登录信息的验证
1.数据库的建立
这里连接的是Mysql8.0数据库,如果想要简单点可以直接用sqlite3数据库,调用逻辑基本差不多,数据库语法也基本一致。
在服务器工程里,添加Sql模块,
接着完善登陆数据库的代码
//登录数据库 bool OperateMysql::connectDatabase(QString strUserName, QString strPwd) { m_db = QSqlDatabase::addDatabase("QMYSQL"); //, "connection1" m_db.setHostName("localhost"); m_db.setPort(3306); m_db.setUserName(strUserName); m_db.setPassword(strPwd); return m_db.open(); }
接下来初始化相关库表,这里先创建一个用户信息表,其他表格后续慢慢补充添加
//初始化数据库 void OperateMysql::initDatabase() { bool bRet; QString strSql = "create database mychat"; //如果存在不产生影响 OperateMysql::getInstance()->operateSql(strSql); strSql = "use mychat"; //切换到对应库 bRet = OperateMysql::getInstance()->operateSql(strSql); strSql = "create table if not exists users(ID varchar(255) primary key, " "nickname varchar(255) not null, " "password varchar(255) not null)"; bRet = OperateMysql::getInstance()->operateSql(strSql); } //执行语句 bool OperateMysql::operateSql(QString strSql) { QSqlQuery query(m_db); return query.exec(strSql); }
关于这里的用户表,采用的类似QQ号的形式建立的表,“ID”代表的是账号,“nickname”是昵称(暂时用不到),"password"是密码
在命令行连接数据库,给数据库中提前录入一些账户用于测试和操作
2.通信格式的规范
需要注意的是,本项目为了更接近实际产品,客户端的所有通信都是通过服务器处理和转发,所以客户端并不直接连接数据库,而是将信息和数据发送到服务器,处理完再将结果返回客户端,为了后续数据传输的效率,现在就将客户端与服务器之间数据交互的格式制定,当然后续可以逐步改进和优化。
由于客户端和服务器两边用到的格式基本一致,因此我建立了一个路径,存放这些公用的文件和代码
以下是目前定义的一些通信数据结构体,包括登陆、注册和聊天信息,本章主要用到的是登陆有关的数据和代码
//基础消息通信类型枚举 enum DataComType { ERR, //错误或未识别类型 LOGIN_CHECK, //登录验证 ACCOUNT_REGISTER, //账户注册 CHAT_MSG, //聊天消息 }; //基础消息通信结构体 typedef struct BaseDataComStruct { int iType = -1; //1:登录验证 2:账户注册 3:聊天消息 DataComType dataComType = ERR; QString strData;//消息数据 long long timestamp; //时间戳 DataComType transformCode(int iType) { switch (iType) { case 1: return LOGIN_CHECK; case 2: return ACCOUNT_REGISTER; case 3: return CHAT_MSG; default: return ERR; } }; int transformCode(DataComType tp) { switch (tp) { case LOGIN_CHECK: return 1; case ACCOUNT_REGISTER: return 2; case CHAT_MSG: return 3; default: return -1; } } }BaseDataComStruct; //登录信息结构体 typedef struct LoginDataStruct { QString strAccountName; //账户名 QString strPassword; //密码 QString strLoginIP; //登录IP }; //聊天消息结构体 typedef struct ChatMsgDataStruct { QString strSenderID; //发送方ID QString strRecverID;