應(yīng)老師要求不寫界面斤儿,寫界面其實(shí)挺簡單的,所以我寫這個程序是純粹的控制臺程序恐锦,使用setup.ini文件配置參數(shù)
1 新建工程
文件—新建文件或項(xiàng)目—如下選擇:
一路點(diǎn)到底往果,中間需要自定義名字的地方自定義名字。
然后再次點(diǎn)擊文件—新建文件或項(xiàng)目一铅,選擇C++ - C++ class:
![C++ class](http://upload-images.jianshu.io/upload_images/4909431-10b4df649f6e5bf6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
得到的項(xiàng)目結(jié)構(gòu)如下:
2 配置工程和文件
打開.pro結(jié)尾的文件陕贮,在
QT += core
后面添加network sql
,分別對應(yīng)qt的網(wǎng)絡(luò)庫和數(shù)據(jù)庫操作庫潘飘,添加完之后像這樣:
QT += core network sql
執(zhí)行一下構(gòu)建-構(gòu)建項(xiàng)目飘蚯,然后執(zhí)行qmake馍迄,再點(diǎn)擊一下綠色的運(yùn)行按鈕。
這個時候局骤,在工程所在目錄攀圈,會出現(xiàn)類似下面的文件夾:
![build](http://upload-images.jianshu.io/upload_images/4909431-b63173a11009e5bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
打開它,再打開里面的debug文件夾峦甩,就是可執(zhí)行程序所在的位置赘来。
- 在這里新建一個文本文檔setup.ini,在里面寫入:
[DataBase]
server=127.0.0.1
port=63300
user=root
passward=123456
根據(jù)自己數(shù)據(jù)庫的配置來改變相應(yīng)的內(nèi)容凯傲,文件的用法后面再講犬辰。
- 安裝MySQL,復(fù)制C:\Program Files\MySQL\MySQL Server 5.7\lib目錄下的libmysql.dll文件到現(xiàn)在這個目錄下冰单。
3 源碼及注釋
tcpser.h
#ifndef TCPSER_H
#define TCPSER_H
#include <QObject>
#include <QtNetwork> //TCP相關(guān)的頭文件
#include <QSqlDatabase> //數(shù)據(jù)庫相關(guān)的頭文件
#include <QDataStream>
#include <QByteArray> //這兩個是跟數(shù)據(jù)流數(shù)據(jù)類型有關(guān)的
#include <QDebug> //調(diào)試輸出
class tcpser : public QObject
{
Q_OBJECT
public:
explicit tcpser(QObject *parent = 0);
private:
QTcpServer * server; //建立服務(wù)器和socket對象指針
QTcpSocket * socket;
QSqlDatabase *db= new QSqlDatabase(QSqlDatabase::addDatabase("QMYSQL")); //在數(shù)據(jù)庫操作對象里添加MySQL
void send_data(); //服務(wù)器發(fā)送數(shù)據(jù)函數(shù)
void sys_init(); //系統(tǒng)初始化函數(shù)幌缝,讀取ini配置文件并初始化參數(shù)
private slots:
void newConnection(); //新連接建立時處理的槽函數(shù)(信號:server的newconnect)
void ReceiveData(); //收到信息時處理的槽函數(shù)(信號:socket的readready)
signals:
public slots:
};
#endif // TCPSER_H
tcpser.cpp
#include "tcpser.h"
tcpser::tcpser(QObject *parent) : QObject(parent)
{ //構(gòu)造函數(shù)
qDebug()<<"System ini";
socket=0;
server=new QTcpServer(this); //初始化服務(wù)器和socket
server->listen(QHostAddress::Any,6600); //創(chuàng)建監(jiān)聽
connect(server,SIGNAL(newConnection()),this,SLOT(newConnection())); //將新連接信號與自定義的新連接處理的槽綁定(這里兩個函數(shù)同名)
sys_init(); //讀取配置文件并連接數(shù)據(jù)庫
qDebug()<<"server up";
}
void tcpser::newConnection() //新連接產(chǎn)生時調(diào)用
{
socket=server->nextPendingConnection(); //從新連接建立socket
connect(socket,SIGNAL(readyRead()),this,SLOT(ReceiveData()));//綁定可讀信號與處理的槽
qDebug()<<"new connect";
send_data(); //測試,發(fā)送消息給客戶端
}
void tcpser::ReceiveData() //處理數(shù)據(jù)的槽
{
QString datas=socket->readAll();//將數(shù)據(jù)全部讀出
qDebug("get");
}
void tcpser::send_data() //發(fā)送數(shù)據(jù)的函數(shù)
{
QString str=0x11;
QByteArray arr;
QDataStream dst(&arr,QIODevice::ReadWrite);
dst<<str;
this->socket->write(arr);
}
void tcpser::sys_init() //讀取配置文件并連接數(shù)據(jù)庫
{
qDebug()<<"database connecting";
QSettings configIniRead(QCoreApplication::applicationDirPath()+"/setup.ini", QSettings::IniFormat);//此處獲取可執(zhí)行文件目錄
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();//創(chuàng)建類
return a.exec();
}
4 效果
注意:程序?qū)τ趕erver啟動和數(shù)據(jù)庫連接沒有做不成功的處理
使用TCP調(diào)試助手新建客戶端建立連接:
點(diǎn)擊連接诫欠,收到server發(fā)送的調(diào)試信息,可以發(fā)送一些數(shù)據(jù)過去:
5 顯示數(shù)據(jù)
為了測試數(shù)據(jù)接收是否正常涵卵,可以將ReceiveData() 函數(shù)替換:
void tcpser::ReceiveData() //處理數(shù)據(jù)的槽
{
QString datas=socket->readAll();//將數(shù)據(jù)全部讀出
QByteArray debugdata=datas.toLatin1();
char *out=debugdata.data();
qDebug(out);
}
在調(diào)試區(qū)域可以看到客戶端發(fā)送的內(nèi)容:
![send debug](http://upload-images.jianshu.io/upload_images/4909431-b189a9a071430c98.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)