应老师要求不写界面,写界面其实挺简单的,所以我写这个程序是纯粹的控制台程序,使用setup.ini文件配置参数
1 新建工程
文件—新建文件或项目—如下选择:
一路点到底,中间需要自定义名字的地方自定义名字。
然后再次点击文件—新建文件或项目,选择C++ - C++ class:
得到的项目结构如下:
2 配置工程和文件
打开.pro结尾的文件,在
QT += core
后面添加network sql
,分别对应qt的网络库和数据库操作库,添加完之后像这样:
QT += core network sql
执行一下构建-构建项目,然后执行qmake,再点击一下绿色的运行按钮。
这个时候,在工程所在目录,会出现类似下面的文件夹:
打开它,再打开里面的debug文件夹,就是可执行程序所在的位置。
- 在这里新建一个文本文档setup.ini,在里面写入:
[DataBase]
server=127.0.0.1
port=63300
user=root
passward=123456
根据自己数据库的配置来改变相应的内容,文件的用法后面再讲。
- 安装MySQL,复制C:\Program Files\MySQL\MySQL Server 5.7\lib目录下的libmysql.dll文件到现在这个目录下。
3 源码及注释
tcpser.h
#ifndef TCPSER_H
#define TCPSER_H
#include <QObject>
#include <QtNetwork> //TCP相关的头文件
#include <QSqlDatabase> //数据库相关的头文件
#include <QDataStream>
#include <QByteArray> //这两个是跟数据流数据类型有关的
#include <QDebug> //调试输出
class tcpser : public QObject
{
Q_OBJECT
public:
explicit tcpser(QObject *parent = 0);
private:
QTcpServer * server; //建立服务器和socket对象指针
QTcpSocket * socket;
QSqlDatabase *db= new QSqlDatabase(QSqlDatabase::addDatabase("QMYSQL")); //在数据库操作对象里添加MySQL
void send_data(); //服务器发送数据函数
void sys_init(); //系统初始化函数,读取ini配置文件并初始化参数
private slots:
void newConnection(); //新连接建立时处理的槽函数(信号:server的newconnect)
void ReceiveData(); //收到信息时处理的槽函数(信号:socket的readready)
signals:
public slots:
};
#endif // TCPSER_H
tcpser.cpp
#include "tcpser.h"
tcpser::tcpser(QObject *parent) : QObject(parent)
{ //构造函数
qDebug()<<"System ini";
socket=0;
server=new QTcpServer(this); //初始化服务器和socket
server->listen(QHostAddress::Any,6600); //创建监听
connect(server,SIGNAL(newConnection()),this,SLOT(newConnection())); //将新连接信号与自定义的新连接处理的槽绑定(这里两个函数同名)
sys_init(); //读取配置文件并连接数据库
qDebug()<<"server up";
}
void tcpser::newConnection() //新连接产生时调用
{
socket=server->nextPendingConnection(); //从新连接建立socket
connect(socket,SIGNAL(readyRead()),this,SLOT(ReceiveData()));//绑定可读信号与处理的槽
qDebug()<<"new connect";
send_data(); //测试,发送消息给客户端
}
void tcpser::ReceiveData() //处理数据的槽
{
QString datas=socket->readAll();//将数据全部读出
qDebug("get");
}
void tcpser::send_data() //发送数据的函数
{
QString str=0x11;
QByteArray arr;
QDataStream dst(&arr,QIODevice::ReadWrite);
dst<<str;
this->socket->write(arr);
}
void tcpser::sys_init() //读取配置文件并连接数据库
{
qDebug()<<"database connecting";
QSettings configIniRead(QCoreApplication::applicationDirPath()+"/setup.ini", QSettings::IniFormat);//此处获取可执行文件目录
db->setHostName(configIniRead.value("/DataBase/server").toString());
db->setPort(configIniRead.value("/DataBase/port").toInt());
db->setDatabaseName(configIniRead.value("/DataBase/databasename").toString());
db->setUserName(configIniRead.value("/DataBase/user").toString());
db->setPassword(configIniRead.value("/DataBase/password").toString());
db->open();
qDebug()<<"connected success";
}
main.cpp
#include <QCoreApplication>
#include "tcpser.h" //包含类的头文件
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
tcpser *ts=new tcpser();//创建类
return a.exec();
}
4 效果
注意:程序对于server启动和数据库连接没有做不成功的处理
使用TCP调试助手新建客户端建立连接:
点击连接,收到server发送的调试信息,可以发送一些数据过去:
5 显示数据
为了测试数据接收是否正常,可以将ReceiveData() 函数替换:
void tcpser::ReceiveData() //处理数据的槽
{
QString datas=socket->readAll();//将数据全部读出
QByteArray debugdata=datas.toLatin1();
char *out=debugdata.data();
qDebug(out);
}
在调试区域可以看到客户端发送的内容: