first commit
This commit is contained in:
commit
b5c57afd7b
|
@ -0,0 +1,172 @@
|
|||
# ---> Qt
|
||||
# C++ objects and libs
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.a
|
||||
*.la
|
||||
*.lai
|
||||
*.so
|
||||
*.so.*
|
||||
*.dll
|
||||
*.dylib
|
||||
|
||||
# Qt-es
|
||||
object_script.*.Release
|
||||
object_script.*.Debug
|
||||
*_plugin_import.cpp
|
||||
/.qmake.cache
|
||||
/.qmake.stash
|
||||
*.pro.user
|
||||
*.pro.user.*
|
||||
*.qbs.user
|
||||
*.qbs.user.*
|
||||
*.moc
|
||||
moc_*.cpp
|
||||
moc_*.h
|
||||
qrc_*.cpp
|
||||
ui_*.h
|
||||
*.qmlc
|
||||
*.jsc
|
||||
Makefile*
|
||||
*build-*
|
||||
*.qm
|
||||
*.prl
|
||||
|
||||
# Qt unit tests
|
||||
target_wrapper.*
|
||||
|
||||
# QtCreator
|
||||
*.autosave
|
||||
|
||||
# QtCreator Qml
|
||||
*.qmlproject.user
|
||||
*.qmlproject.user.*
|
||||
|
||||
# QtCreator CMake
|
||||
CMakeLists.txt.user*
|
||||
|
||||
# QtCreator 4.8< compilation database
|
||||
compile_commands.json
|
||||
|
||||
# QtCreator local machine specific files for imported projects
|
||||
*creator.user*
|
||||
|
||||
*_qmlcache.qrc
|
||||
|
||||
# ---> C++
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.obj
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
|
||||
# ---> C
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
|
||||
# Linker output
|
||||
*.ilk
|
||||
*.map
|
||||
*.exp
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
*.pdb
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
.tmp_versions/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
# ---> macOS
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) <year> <copyright holders>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,31 @@
|
|||
QT += core gui network sql
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
CONFIG += c++11
|
||||
|
||||
# You can make your code fail to compile if it uses deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
SOURCES += \
|
||||
code.cpp \
|
||||
database.cpp \
|
||||
datamanager.cpp \
|
||||
line.cpp \
|
||||
main.cpp \
|
||||
protocol.cpp \
|
||||
tcpserver.cpp
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
|
||||
HEADERS += \
|
||||
code.h \
|
||||
database.h \
|
||||
datamanager.h \
|
||||
line.h \
|
||||
protocol.h \
|
||||
tcpserver.h
|
|
@ -0,0 +1,172 @@
|
|||
#include "code.h"
|
||||
|
||||
|
||||
Code *Code::getInstance()
|
||||
{
|
||||
static Code codedb;
|
||||
return &codedb;
|
||||
}
|
||||
|
||||
Code::Code()
|
||||
{
|
||||
//先判断连接是否存在
|
||||
if(QSqlDatabase::contains("codesql"))
|
||||
{
|
||||
db_ = QSqlDatabase::addDatabase("codesql");
|
||||
}
|
||||
else
|
||||
{
|
||||
//1.加载数据库驱动
|
||||
db_ = QSqlDatabase::addDatabase("QSQLITE", "codesql");
|
||||
qDebug () << db_.connectionName();//打印连接名称
|
||||
|
||||
//2.设置数据库名
|
||||
db_.setDatabaseName("code.db");
|
||||
qDebug () << db_.databaseName();
|
||||
}
|
||||
|
||||
//3.打开数据库
|
||||
if(db_.open())
|
||||
{
|
||||
qDebug() << "open success";
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "open:" << db_.lastError().text();
|
||||
return;
|
||||
}
|
||||
|
||||
QString sql = "create table if not exists table_code(name varchar(30),parking_state varchar(5),number varchar(3));";
|
||||
QSqlQuery query(db_);
|
||||
if (query.exec(sql))
|
||||
{
|
||||
qDebug() << "codedb success.";
|
||||
}
|
||||
db_.close();
|
||||
}
|
||||
|
||||
bool Code::insertUsr(QString name, QString code, QString number)
|
||||
{
|
||||
QString sql = QString("insert into table_code values('%1', '%2', '%3')")
|
||||
.arg(name)
|
||||
.arg(code)
|
||||
.arg(number);
|
||||
|
||||
|
||||
// 1.打开数据
|
||||
if (!db_.open())
|
||||
{
|
||||
qDebug() << "open:" << db_.lastError().text();
|
||||
return false;
|
||||
}
|
||||
|
||||
// 2.执行sql
|
||||
QSqlQuery query(db_);
|
||||
if (!query.exec(sql))
|
||||
{
|
||||
qDebug() << "insert:" << query.lastError().text();
|
||||
return false;
|
||||
}
|
||||
|
||||
//关闭数据库
|
||||
db_.close();
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//根据name查找用户
|
||||
bool Code::findUsr(QString name,QString code)
|
||||
{
|
||||
QString sql = QString("select from table_code where name = :name;");
|
||||
//打开数据库
|
||||
if(!db_.open())
|
||||
{
|
||||
qDebug() << "open fail" << db_.lastError().text();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
//执行插入操作
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":name",QVariant(name));
|
||||
query.exec();
|
||||
|
||||
//查询成功
|
||||
if(query.next())
|
||||
{
|
||||
if(name == query.value(0).toString()) //用户存在
|
||||
{
|
||||
if(code == query.value(1).toString())
|
||||
{
|
||||
QString number = query.value(1).toString();
|
||||
Delete(name);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
db_.close();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Code::Delete(QString name)
|
||||
{
|
||||
QString sql = QString("delete from table_code where name = :name;");
|
||||
//打开数据库
|
||||
if(!db_.open())
|
||||
{
|
||||
qDebug() << "open fail" << db_.lastError().text();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
//执行删除操作
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":name",QVariant(name));
|
||||
if (!query.exec())
|
||||
{
|
||||
qDebug() << "delete" << query.lastError().text();
|
||||
return false;
|
||||
}
|
||||
|
||||
//关闭数据库
|
||||
db_.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
//匹配name和pwd
|
||||
bool Code::match(QString name, QString pwd)
|
||||
{
|
||||
QString sql = QString("select name, pwd from table_usr where name = :name;");
|
||||
//打开数据库
|
||||
if(!db_.open())
|
||||
{
|
||||
qDebug() << "open fail" << db_.lastError().text();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":name",QVariant(name));
|
||||
if(query.exec())
|
||||
{
|
||||
//匹配密码
|
||||
if(query.next())
|
||||
{
|
||||
qDebug() << query.value(1).toString();
|
||||
if(pwd == query.value(1).toString())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//关闭数据库
|
||||
db_.close();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
#ifndef CODE_H
|
||||
#define CODE_H
|
||||
|
||||
#include <QString>
|
||||
#include <QSqlDatabase>
|
||||
#include <QSqlError>
|
||||
#include <QSqlQuery>
|
||||
#include <QVector>
|
||||
|
||||
class Code
|
||||
{
|
||||
public:
|
||||
|
||||
Code();
|
||||
|
||||
static Code *getInstance(); //静态的获取数据库对象的函数
|
||||
|
||||
//插入一个用户的随机码信息
|
||||
bool insertUsr(QString name,QString code,QString number);
|
||||
|
||||
//根据name查找用户
|
||||
bool findUsr(QString name,QString code);
|
||||
|
||||
//匹配name和pwd
|
||||
bool match(QString name, QString pwd);
|
||||
|
||||
//删除用户信息
|
||||
bool Delete(QString name);
|
||||
|
||||
QSqlDatabase db_;
|
||||
};
|
||||
|
||||
#endif // CODE_H
|
|
@ -0,0 +1,259 @@
|
|||
#include <QSql>
|
||||
#include <QSqlDatabase>
|
||||
#include <QDebug>
|
||||
#include <QSqlError>
|
||||
#include <QSqlQuery>
|
||||
#include <QSqlRecord>
|
||||
#include "database.h"
|
||||
|
||||
DataBase *DataBase::getInstance()
|
||||
{
|
||||
static DataBase sqldb;
|
||||
return &sqldb;
|
||||
}
|
||||
|
||||
DataBase::DataBase()
|
||||
{
|
||||
//先判断连接是否存在
|
||||
if(QSqlDatabase::contains("testConnection"))
|
||||
{
|
||||
db_ = QSqlDatabase::addDatabase("testConnection");
|
||||
}
|
||||
else
|
||||
{
|
||||
//1.加载数据库驱动
|
||||
db_ = QSqlDatabase::addDatabase("QSQLITE", "testConnection");
|
||||
qDebug () << db_.connectionName();//打印连接名称
|
||||
|
||||
//2.设置数据库名
|
||||
db_.setDatabaseName("usr.db");
|
||||
qDebug () << db_.databaseName();
|
||||
}
|
||||
|
||||
//3.打开数据库
|
||||
if(db_.open())
|
||||
{
|
||||
qDebug() << "open success";
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "open:" << db_.lastError().text();
|
||||
return;
|
||||
}
|
||||
|
||||
QString sql = "create table if not exists table_usr(name varchar(30) primary key, pwd varchar(20),code varchar(10),number varchar(3));";
|
||||
QSqlQuery query(db_);
|
||||
if (query.exec(sql))
|
||||
{
|
||||
qDebug() << "create success.";
|
||||
}
|
||||
db_.close();
|
||||
}
|
||||
|
||||
|
||||
//插入一个用户信息
|
||||
bool DataBase::insertUsr(QString name, QString pwd)
|
||||
{
|
||||
QString sql = QString("insert into table_usr values('%1', '%2', '%3', '%4')")
|
||||
.arg(name)
|
||||
.arg(pwd)
|
||||
.arg("000")
|
||||
.arg("000");
|
||||
|
||||
|
||||
// 1.打开数据
|
||||
if (!db_.open())
|
||||
{
|
||||
qDebug() << "open:" << db_.lastError().text();
|
||||
return false;
|
||||
}
|
||||
|
||||
// 2.执行sql
|
||||
QSqlQuery query(db_);
|
||||
if (!query.exec(sql))
|
||||
{
|
||||
qDebug() << "insert:" << query.lastError().text();
|
||||
return false;
|
||||
}
|
||||
|
||||
//关闭数据库
|
||||
db_.close();
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//根据name查找用户
|
||||
bool DataBase::findUsr(QString name)
|
||||
{
|
||||
QString sql = QString("select from table_usr where name = :name;");
|
||||
//打开数据库
|
||||
if(!db_.open())
|
||||
{
|
||||
qDebug() << "open fail" << db_.lastError().text();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
//执行插入操作
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":name",QVariant(name));
|
||||
query.exec();
|
||||
|
||||
//查询成功
|
||||
if(query.next())
|
||||
{
|
||||
if(name == query.value(0).toString()) //用户存在
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
db_.close();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DataBase::Delete(QString name)
|
||||
{
|
||||
QString sql = QString("delete from table_usr where name = :name;");
|
||||
//打开数据库
|
||||
if(!db_.open())
|
||||
{
|
||||
qDebug() << "open fail" << db_.lastError().text();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
//执行删除操作
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":name",QVariant(name));
|
||||
if (!query.exec())
|
||||
{
|
||||
qDebug() << "delete" << query.lastError().text();
|
||||
return false;
|
||||
}
|
||||
|
||||
//关闭数据库
|
||||
db_.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
//匹配name和pwd
|
||||
bool DataBase::match(QString name, QString pwd)
|
||||
{
|
||||
QString sql = QString("select name, pwd from table_usr where name = :name;");
|
||||
//打开数据库
|
||||
if(!db_.open())
|
||||
{
|
||||
qDebug() << "open fail" << db_.lastError().text();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":name",QVariant(name));
|
||||
if(query.exec())
|
||||
{
|
||||
//匹配密码
|
||||
if(query.next())
|
||||
{
|
||||
qDebug() << query.value(1).toString();
|
||||
if(pwd == query.value(1).toString())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//关闭数据库
|
||||
db_.close();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void DataBase::insertCode(QString name, QString code, QString number)
|
||||
{
|
||||
|
||||
QString sql = QString("update table_usr set code=:code, number=:number where name=:name");
|
||||
|
||||
// 1.打开数据
|
||||
if (!db_.open())
|
||||
{
|
||||
qDebug() << "open:" << db_.lastError().text();
|
||||
}
|
||||
|
||||
// 2.执行sql
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":code",QVariant(code));
|
||||
query.bindValue(":number",QVariant(number));
|
||||
query.bindValue(":name",QVariant(name));
|
||||
|
||||
if (!query.exec(sql))
|
||||
{
|
||||
qDebug() << "insert:" << query.lastError().text();
|
||||
}
|
||||
|
||||
//关闭数据库
|
||||
db_.close();
|
||||
}
|
||||
|
||||
|
||||
//匹配完成后自动将code 和 number重置
|
||||
QString DataBase::matchCode(QString name, QString code)
|
||||
{
|
||||
|
||||
QString number;
|
||||
QString sql = QString("select name, pwd, code, number from table_usr where name = :name;");
|
||||
//打开数据库
|
||||
if(!db_.open())
|
||||
{
|
||||
qDebug() << "open fail" << db_.lastError().text();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":name",QVariant(name));
|
||||
if(query.exec())
|
||||
{
|
||||
//匹配密码
|
||||
if(query.next())
|
||||
{
|
||||
qDebug() << query.value(2).toString();
|
||||
if(code == query.value(2).toString())
|
||||
{
|
||||
number = query.value(3).toString();
|
||||
resetCode(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
db_.close();
|
||||
return number;
|
||||
}
|
||||
|
||||
void DataBase::resetCode(QString name)
|
||||
{
|
||||
QString sql = QString("update table_usr set code=:code, number=:number where name=:name");
|
||||
|
||||
// 1.打开数据
|
||||
if (!db_.open())
|
||||
{
|
||||
qDebug() << "open:" << db_.lastError().text();
|
||||
}
|
||||
|
||||
// 2.执行sql
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":code",QVariant("000"));
|
||||
query.bindValue(":number",QVariant("000"));
|
||||
query.bindValue(":name",QVariant(name));
|
||||
|
||||
if (!query.exec(sql))
|
||||
{
|
||||
qDebug() << "insert:" << query.lastError().text();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
#ifndef DATABASE_H
|
||||
#define DATABASE_H
|
||||
#include <QSqlDatabase>
|
||||
#include <QSqlError>
|
||||
#include <QSqlQuery>
|
||||
#include <QVector>
|
||||
#include <QString>
|
||||
|
||||
class DataBase
|
||||
{
|
||||
public:
|
||||
static DataBase *getInstance(); //静态的获取数据库对象的函数
|
||||
|
||||
//插入一个用户信息
|
||||
bool insertUsr(QString name,QString pwd);
|
||||
|
||||
//根据name查找用户
|
||||
bool findUsr(QString name);
|
||||
|
||||
//匹配name和pwd
|
||||
bool match(QString name, QString pwd);
|
||||
|
||||
//删除用户信息
|
||||
bool Delete(QString name);
|
||||
|
||||
void insertCode(QString name, QString code, QString number);
|
||||
|
||||
QString matchCode(QString name, QString code);
|
||||
|
||||
void resetCode(QString name);
|
||||
|
||||
DataBase();
|
||||
|
||||
QSqlDatabase db_;
|
||||
};
|
||||
|
||||
#endif // DATABASE_H
|
||||
|
|
@ -0,0 +1,205 @@
|
|||
#include "datamanager.h"
|
||||
DataManager *DataManager::p_this;
|
||||
DataManager::DataManager(QObject *parent)
|
||||
: QObject{parent}
|
||||
{
|
||||
p_this = this;
|
||||
database = DataBase::getInstance();
|
||||
protocol = Protocol::getInstance();
|
||||
linedb = Line::getInstance();
|
||||
server = TCPServer::getInstance();
|
||||
server->setTimeOut(500);
|
||||
server->configAndrun();
|
||||
server->setCallBack(disconnect_from_cln);
|
||||
server->setCallBack(recv_from_cln);
|
||||
}
|
||||
|
||||
void DataManager::disconnect_from_cln(QTcpSocket *sock)
|
||||
{
|
||||
qDebug() << "删除之前的数据" <<p_this->online_name_list;
|
||||
for (int i = 0; i < p_this->online_socket_list.length(); i++)
|
||||
{
|
||||
if (p_this->online_socket_list.at(i) == sock)
|
||||
{
|
||||
p_this->online_name_list.removeAt(i);
|
||||
p_this->online_socket_list.removeAt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
qDebug() << "删除之后的数据" << p_this->online_name_list;
|
||||
p_this->update_namelist(sock);
|
||||
}
|
||||
|
||||
void DataManager::recv_from_cln(QByteArray &data, QTcpSocket *sock)
|
||||
{
|
||||
QByteArray data_decrypt = p_this->protocol->data_decrypt(data);
|
||||
qDebug() << data_decrypt;
|
||||
QList<QByteArray> list = data_decrypt.split('\n');
|
||||
qDebug() << list;
|
||||
for (int i = 0; i < list.count(); i++)
|
||||
{
|
||||
QJsonDocument json_data = QJsonDocument::fromJson(list[i]);
|
||||
if (json_data["type"] == "message")
|
||||
{
|
||||
|
||||
}
|
||||
else if (json_data["type"] == "code")
|
||||
{
|
||||
if (json_data["action"] == "pick") //取车消息
|
||||
{
|
||||
QString name = json_data["user"].toString();
|
||||
QString code = json_data["data"].toString();
|
||||
QString number = p_this->database->matchCode(name,code);
|
||||
QString find_code = p_this->linedb->findCode(number);
|
||||
p_this->linedb->resetState(number);
|
||||
QByteArray data_build, data_encrypt;
|
||||
data_build = p_this->protocol->data_maker(Protocol::CODE, QString("pick"), QString("server"),find_code);
|
||||
qDebug() << data_build;
|
||||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||||
p_this->server->sendToclient(sock, data_encrypt);
|
||||
|
||||
}
|
||||
else if (json_data["action"] == "park") //存车消息
|
||||
{
|
||||
QString name = json_data["user"].toString();
|
||||
QString number = p_this->linedb->choose(); //获取一个可用的车位编号
|
||||
//随机生成取车码
|
||||
QString code = p_this->getRandomString(8);
|
||||
//更新取车码
|
||||
p_this->database->insertCode(name,code,number);
|
||||
p_this->linedb->setState(number);
|
||||
|
||||
QByteArray data_build, data_encrypt;
|
||||
data_build = p_this->protocol->data_maker(Protocol::CODE, QString("park"), QString("server"),code);
|
||||
qDebug() << data_build;
|
||||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||||
p_this->server->sendToclient(sock, data_encrypt);
|
||||
|
||||
}
|
||||
}
|
||||
else if (json_data["type"] == "request")
|
||||
{
|
||||
if (json_data["action"] == "register")
|
||||
{
|
||||
qDebug() << "收到注册类型的信息,将进行处理";
|
||||
QString username, password;
|
||||
QJsonObject json = json_data["content"].toObject();
|
||||
username = json["user"].toString();
|
||||
password = json["password"].toString();
|
||||
bool result = p_this->database->insertUsr(username, password);
|
||||
qDebug() << result;
|
||||
if (result == true)
|
||||
{
|
||||
QByteArray data_build, data_encrypt;
|
||||
data_build = p_this->protocol->data_maker(Protocol::RESPONSE, QString("register"), QList<QString>{"result", "true"});
|
||||
qDebug() << data_build;
|
||||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||||
p_this->server->sendToclient(sock, data_encrypt);
|
||||
}
|
||||
else
|
||||
{
|
||||
QByteArray data_build, data_encrypt;
|
||||
data_build = p_this->protocol->data_maker(Protocol::RESPONSE, QString("register"), QList<QString>{"result", "false"});
|
||||
qDebug() << data_build;
|
||||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||||
p_this->server->sendToclient(sock, data_encrypt);
|
||||
}
|
||||
}
|
||||
else if (json_data["action"] == "signin")
|
||||
{
|
||||
qDebug() << "收到登录类型的信息,将进行处理";
|
||||
QString username, password;
|
||||
QJsonObject json = json_data["content"].toObject();
|
||||
username = json["user"].toString();
|
||||
password = json["password"].toString();
|
||||
qDebug() << username <<password;
|
||||
bool result = p_this->database->match(username, password);
|
||||
qDebug() << result;
|
||||
if (result == true)
|
||||
{
|
||||
p_this->online_socket_list.append(sock);
|
||||
p_this->online_name_list.append(username);
|
||||
QByteArray data_build, data_encrypt;
|
||||
data_build = p_this->protocol->data_maker(Protocol::RESPONSE, QString("signin"), QList<QString>{"result", "true"});
|
||||
qDebug() << data_build;
|
||||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||||
p_this->server->sendToclient(sock, data_encrypt);
|
||||
p_this->update_namelist(sock);
|
||||
}
|
||||
else
|
||||
{
|
||||
QByteArray data_build, data_encrypt;
|
||||
data_build = p_this->protocol->data_maker(Protocol::RESPONSE, QString("signin"), QList<QString>{"result", "false"});
|
||||
qDebug() << data_build;
|
||||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||||
p_this->server->sendToclient(sock, data_encrypt);
|
||||
}
|
||||
}
|
||||
else if (json_data["action"] == "cancellation")
|
||||
{
|
||||
qDebug() << "收到注销类型的数据,将进行处理";
|
||||
QJsonObject json = json_data["content"].toObject();
|
||||
QString username = json["name"].toString();
|
||||
qDebug() << username;
|
||||
if (!p_this->database->Delete(username))
|
||||
{
|
||||
qDebug() << "用户注销失败";
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
else if (json_data["action"] == "update_namelist")
|
||||
{
|
||||
qDebug() << "接收到更新用户列表的请求";
|
||||
QJsonObject json = json_data["content"].toObject();
|
||||
QString username = json["name"].toString();
|
||||
for (int i = 0; i < p_this->online_name_list.length(); i++)
|
||||
{
|
||||
if (p_this->online_name_list.at(i) == username)
|
||||
{
|
||||
p_this->online_name_list.removeAt(i);
|
||||
p_this->online_socket_list.removeAt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
p_this->update_namelist(sock);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "服务端收到未知类型的数据" << list[i];
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DataManager::update_namelist(QTcpSocket *sock)
|
||||
{
|
||||
qDebug() << "发送更新用户在线列表信息";
|
||||
QByteArray data_build, data_encrypt;
|
||||
data_build = protocol->data_maker(Protocol::ONLINEUSERS, 4, online_name_list);
|
||||
qDebug() << online_name_list;
|
||||
data_encrypt = protocol->data_encrypt(data_build);
|
||||
for (auto &one_socket : online_socket_list)
|
||||
{
|
||||
server->sendToclient(one_socket, data_encrypt);
|
||||
}
|
||||
}
|
||||
|
||||
QString DataManager::getRandomString(int nLen)
|
||||
{
|
||||
srand(QDateTime::currentMSecsSinceEpoch());
|
||||
const char ch[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
int size = sizeof(ch);
|
||||
char* str = new char[nLen + 1];
|
||||
int num = 0;
|
||||
for (int nIndex = 0; nIndex < nLen; ++nIndex)
|
||||
{
|
||||
num = rand() % (size - 1);
|
||||
str[nIndex] = ch[num];
|
||||
}
|
||||
str[nLen] = '\0';
|
||||
QString res(str);
|
||||
return res;
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
#ifndef DATAMANAGER_H
|
||||
#define DATAMANAGER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QJsonDocument>
|
||||
#include <QRandomGenerator>
|
||||
#include <QChar>
|
||||
#include <QDateTime>
|
||||
#include <QtGlobal>>
|
||||
|
||||
#include "database.h"
|
||||
#include "tcpserver.h"
|
||||
#include "protocol.h"
|
||||
#include "code.h"
|
||||
#include "line.h"
|
||||
|
||||
class DataManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DataManager(QObject *parent = nullptr);
|
||||
static void disconnect_from_cln(QTcpSocket* sock);
|
||||
static void recv_from_cln(QByteArray &data, QTcpSocket* sock);
|
||||
QString getRandomString(int nLen);
|
||||
|
||||
signals:
|
||||
|
||||
private:
|
||||
|
||||
DataBase *database;
|
||||
Code *codedb;
|
||||
Line *linedb;
|
||||
Protocol *protocol;
|
||||
TCPServer *server;
|
||||
QList <QTcpSocket*> online_socket_list;
|
||||
QList <QString> online_name_list;
|
||||
static DataManager *p_this;
|
||||
void update_namelist(QTcpSocket *sock);
|
||||
};
|
||||
|
||||
#endif // DATAMANAGER_H
|
|
@ -0,0 +1,113 @@
|
|||
#include "line.h"
|
||||
|
||||
Line *Line::getInstance()
|
||||
{
|
||||
static Line linedb;
|
||||
return &linedb;
|
||||
}
|
||||
|
||||
Line::Line()
|
||||
{
|
||||
//先判断连接是否存在
|
||||
if(QSqlDatabase::contains("linesql"))
|
||||
{
|
||||
db_ = QSqlDatabase::addDatabase("linesql");
|
||||
}
|
||||
else
|
||||
{
|
||||
//1.加载数据库驱动
|
||||
db_ = QSqlDatabase::addDatabase("QSQLITE", "linesql");
|
||||
qDebug () << db_.connectionName();//打印连接名称
|
||||
|
||||
//2.设置数据库名
|
||||
db_.setDatabaseName("line.db");
|
||||
qDebug () << db_.databaseName();
|
||||
}
|
||||
|
||||
//3.打开数据库
|
||||
if(db_.open())
|
||||
{
|
||||
qDebug() << "open success";
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "open:" << db_.lastError().text();
|
||||
return;
|
||||
}
|
||||
|
||||
QString sql = "create table if not exists table_line(number varchar(10) primary key,state varchar(3));";
|
||||
|
||||
QSqlQuery query(db_);
|
||||
if (query.exec(sql))
|
||||
{
|
||||
qDebug() << "linedb success.";
|
||||
}
|
||||
db_.close();
|
||||
}
|
||||
|
||||
QString Line::findCode(QString number)
|
||||
{
|
||||
QString sql = QString("select from table_line where name = :name;");
|
||||
//打开数据库
|
||||
if(!db_.open())
|
||||
{
|
||||
qDebug() << "open fail" << db_.lastError().text();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
//执行插入操作
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":number",QVariant(number));
|
||||
query.exec();
|
||||
QString linecode;
|
||||
|
||||
//查询成功
|
||||
if(query.next())
|
||||
{
|
||||
linecode = query.value(1).toString();
|
||||
qDebug() << "linecode:" << linecode;
|
||||
|
||||
}
|
||||
|
||||
db_.close();
|
||||
|
||||
return linecode;
|
||||
|
||||
}
|
||||
|
||||
QString Line::choose()
|
||||
{
|
||||
QString sql = QString("select from table_line where state = :state limit 1;");
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":state",QVariant("000")); //选择未占用的车位
|
||||
query.exec();
|
||||
if(query.next())
|
||||
{
|
||||
QString number = query.value(0).toString();
|
||||
return number;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Line::setState(QString number)
|
||||
{
|
||||
QString sql = QString("update table_line set state=:state where number=:number");
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":number",QVariant(number));
|
||||
query.bindValue(":state",QVariant("111")); //已占用的话为111
|
||||
query.exec();
|
||||
}
|
||||
|
||||
void Line::resetState(QString number)
|
||||
{
|
||||
QString sql = QString("update table_line set state=:state where number=:number");
|
||||
QSqlQuery query(db_);
|
||||
query.prepare(sql);
|
||||
query.bindValue(":number",QVariant(number));
|
||||
query.bindValue(":state",QVariant("000")); //状态初始值为000
|
||||
query.exec();
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef LINE_H
|
||||
#define LINE_H
|
||||
|
||||
#include <QString>
|
||||
#include <QSqlDatabase>
|
||||
#include <QSqlError>
|
||||
#include <QSqlQuery>
|
||||
#include <QVector>
|
||||
|
||||
class Line
|
||||
{
|
||||
public:
|
||||
|
||||
Line();
|
||||
|
||||
static Line *getInstance(); //静态的获取数据库对象的函数
|
||||
|
||||
QString findCode(QString number);
|
||||
|
||||
QString choose();
|
||||
|
||||
void setState(QString number);
|
||||
|
||||
void resetState(QString number);
|
||||
|
||||
QSqlDatabase db_;
|
||||
};
|
||||
|
||||
#endif // LINE_H
|
|
@ -0,0 +1,10 @@
|
|||
#include <QCoreApplication>
|
||||
#include <datamanager.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication a(argc, argv);
|
||||
|
||||
DataManager datamanager;
|
||||
return a.exec();
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
#include "protocol.h"
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonArray>
|
||||
|
||||
Protocol Protocol::protocol_instance;
|
||||
Protocol::Protocol(QObject *parent)
|
||||
: QObject{parent}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Protocol::~Protocol()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Protocol* Protocol::getInstance()
|
||||
{
|
||||
return &protocol_instance;
|
||||
}
|
||||
|
||||
QByteArray Protocol::data_builder(QList<any_types> &args)
|
||||
{
|
||||
QJsonObject data;
|
||||
switch(args[0].get_data_types())
|
||||
{
|
||||
case MESSAGE:
|
||||
{
|
||||
data.insert("type","message");
|
||||
data.insert("sendname",args[1].get_string());
|
||||
data.insert("data",args[2].get_string());
|
||||
break;
|
||||
}
|
||||
case CODE:
|
||||
{
|
||||
data.insert("type","code");
|
||||
data.insert("action",args[1].get_string());
|
||||
data.insert("user",args[2].get_string());
|
||||
data.insert("data",args[3].get_string());
|
||||
}
|
||||
case REQUEST:
|
||||
{
|
||||
data.insert("type","request");
|
||||
data.insert("action",args[1].get_string());
|
||||
QList<QString> content = args[2].get_list();
|
||||
QJsonObject json_content;
|
||||
for (int i=0; i<content.length(); i+=2)
|
||||
json_content.insert(content[i],content[i+1]);
|
||||
data.insert("content",json_content);
|
||||
break;
|
||||
}
|
||||
case ONLINEUSERS:
|
||||
{
|
||||
data.insert("type","online_users");
|
||||
data.insert("count",args[1].get_int());
|
||||
QList<QString> users = args[2].get_list();
|
||||
QJsonArray json_users;
|
||||
for (auto &user:users)
|
||||
json_users.append(user);
|
||||
data.insert("users",json_users);
|
||||
break;
|
||||
}
|
||||
case RESPONSE:
|
||||
{
|
||||
data.insert("type","response");
|
||||
data.insert("action",args[1].get_string());
|
||||
QList<QString> content = args[2].get_list();
|
||||
QJsonObject json_content;
|
||||
for (int i=0; i<content.length(); i+=2)
|
||||
json_content.insert(content[i],content[i+1]);
|
||||
data.insert("content",json_content);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
QJsonDocument data_doc(data);
|
||||
return data_doc.toJson(QJsonDocument::Compact)+'\n';
|
||||
}
|
||||
|
||||
QPair<Protocol::data_types,QJsonObject> Protocol::data_parser(QByteArray data)
|
||||
{
|
||||
QJsonDocument json_data = QJsonDocument::fromJson(data);
|
||||
if (json_data["type"] == "message")
|
||||
return qMakePair(MESSAGE,json_data.object());
|
||||
else if (json_data["type"] == "code")
|
||||
return qMakePair(CODE,json_data.object());
|
||||
else if (json_data["type"] == "request")
|
||||
return qMakePair(REQUEST,json_data.object());
|
||||
else if (json_data["type"] == "online_users")
|
||||
return qMakePair(ONLINEUSERS,json_data.object());
|
||||
else if (json_data["type"] == "response")
|
||||
return qMakePair(RESPONSE,json_data.object());
|
||||
else
|
||||
return qMakePair(RESPONSE,json_data.object());
|
||||
}
|
||||
|
||||
|
||||
/******************************加解密部分************************************/
|
||||
QByteArray Protocol::XOR_En_Decrypt(QByteArray src)
|
||||
{
|
||||
QByteArray result;
|
||||
for(auto &i:src)
|
||||
result.append(i ^ cipher_word);
|
||||
return result;
|
||||
}
|
||||
|
||||
QByteArray Protocol::Upper_Lower_En_Decrypt(QString src)
|
||||
{
|
||||
QByteArray result;
|
||||
for(auto &i:src)
|
||||
{
|
||||
if(i.isUpper())
|
||||
{
|
||||
QChar word = i.toLower();
|
||||
result.append(word.toLatin1());
|
||||
}
|
||||
else if (i.isLower())
|
||||
{
|
||||
QChar word = i.toUpper();
|
||||
result.append(word.toLatin1());
|
||||
}
|
||||
else
|
||||
result.append(i.toLatin1());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
QByteArray Protocol::data_encrypt(QByteArray src)
|
||||
{
|
||||
QByteArray en_base64 = src.toBase64();
|
||||
QByteArray result = Upper_Lower_En_Decrypt(en_base64);
|
||||
return XOR_En_Decrypt(result);
|
||||
}
|
||||
|
||||
QByteArray Protocol::data_decrypt(QByteArray src)
|
||||
{
|
||||
QByteArray result = XOR_En_Decrypt(src);
|
||||
//qDebug() << result;
|
||||
result = Upper_Lower_En_Decrypt(result);
|
||||
//qDebug() << result;
|
||||
return QByteArray::fromBase64(result);
|
||||
}
|
||||
|
||||
void Protocol::set_data_cipher_word(char word)
|
||||
{
|
||||
cipher_word = word;
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
#ifndef PROTOCOL_H
|
||||
#define PROTOCOL_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QJsonObject>
|
||||
|
||||
class Protocol : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static Protocol* getInstance();
|
||||
template<typename Type, typename ...Args>
|
||||
QByteArray data_maker(Type type, Args ...args)
|
||||
{
|
||||
QList<any_types> args_list;
|
||||
args_list.append(any_types(type));
|
||||
(void)std::initializer_list <int> {(args_list.append(any_types(args)),0)...};
|
||||
return data_builder(args_list);
|
||||
};
|
||||
enum data_types {MESSAGE,CODE,REQUEST,ONLINEUSERS,RESPONSE};
|
||||
QPair<data_types,QJsonObject> data_parser(QByteArray data);
|
||||
QByteArray data_encrypt(QByteArray src);
|
||||
void set_data_cipher_word(char word);
|
||||
QByteArray data_decrypt(QByteArray src);
|
||||
private:
|
||||
char cipher_word = 'G';
|
||||
struct any_types {
|
||||
enum type {String, Bool, Int, Data_types, List};
|
||||
any_types(int e) { m_data.INT = e; m_type = Int;}
|
||||
any_types(QString e) { m_data.STRING = e; m_type = String;}
|
||||
any_types(QList<QString> e) { m_data.LIST = e; m_type = List;}
|
||||
any_types(bool e) { m_data.BOOL = e; m_type = Bool;}
|
||||
any_types(data_types e) { m_data.DATA_TYPES = e; m_type = Data_types;}
|
||||
type get_type() const { return m_type; }
|
||||
int get_int() const { return m_data.INT; }
|
||||
bool get_bool() const { return m_data.BOOL; }
|
||||
data_types get_data_types() const { return m_data.DATA_TYPES; }
|
||||
QString get_string() const { return m_data.STRING; }
|
||||
QList<QString> get_list() const { return m_data.LIST; }
|
||||
private:
|
||||
type m_type;
|
||||
struct {
|
||||
int INT;
|
||||
bool BOOL;
|
||||
QString STRING;
|
||||
QList<QString> LIST;
|
||||
data_types DATA_TYPES;
|
||||
} m_data;
|
||||
};
|
||||
static Protocol protocol_instance;
|
||||
explicit Protocol(QObject *parent = nullptr);
|
||||
~Protocol();
|
||||
QByteArray data_builder(QList<any_types> &args);
|
||||
QByteArray XOR_En_Decrypt(QByteArray src);
|
||||
QByteArray Upper_Lower_En_Decrypt(QString src);
|
||||
signals:
|
||||
|
||||
};
|
||||
#endif // PROTOCOL_H
|
|
@ -0,0 +1,134 @@
|
|||
#include "tcpserver.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
TCPServer TCPServer::tcpserver_instance;
|
||||
|
||||
TCPServer::TCPServer(QObject *parent)
|
||||
: QObject{parent}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
TCPServer::~TCPServer()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
TCPServer* TCPServer::getInstance()
|
||||
{
|
||||
return &tcpserver_instance;
|
||||
}
|
||||
|
||||
void TCPServer::configAndrun()
|
||||
{
|
||||
tcp_server.listen(QHostAddress(listen_addr), listen_port);
|
||||
connect(&tcp_server, &QTcpServer::newConnection, this, &TCPServer::acceptTCPConnection);
|
||||
QByteArray addr = listen_addr.toLocal8Bit();
|
||||
qDebug() << "successfully start server";
|
||||
printf("TCP Server Started at %.*s:%d.\n", addr.length(), addr.data(),listen_port);
|
||||
}
|
||||
|
||||
void TCPServer::setServer(QString IP, qint16 port)
|
||||
{
|
||||
listen_addr = IP;
|
||||
listen_port = port;
|
||||
}
|
||||
|
||||
void TCPServer::stopRun()
|
||||
{
|
||||
tcp_server.close();
|
||||
QByteArray addr = listen_addr.toLocal8Bit();
|
||||
printf("TCP Server Closed at %.*s:%d.\n",addr.length(), addr.data(),listen_port);
|
||||
}
|
||||
|
||||
void TCPServer::acceptTCPConnection()
|
||||
{
|
||||
QTcpSocket* clientConnection = tcp_server.nextPendingConnection();
|
||||
if(clientConnection!=nullptr)
|
||||
{
|
||||
qDebug() << "new conncection";
|
||||
clientConnection->setParent(this);
|
||||
tcp_socket_list.append(clientConnection);
|
||||
connect(clientConnection, &QTcpSocket::readyRead, this, &TCPServer::TCPReadPeer);
|
||||
connect(clientConnection,&QTcpSocket::disconnected,this,&TCPServer::discTCPConnection);
|
||||
QString ip = clientConnection->peerAddress().toString();
|
||||
string ip_t = ip.toStdString();
|
||||
printf("TCP: %.*s:%d connected.\n",ip_t.length(), ip_t.data(), clientConnection->peerPort());
|
||||
}
|
||||
}
|
||||
|
||||
void TCPServer::discTCPConnection()
|
||||
{
|
||||
for (int i=0;i<tcp_socket_list.length();i++)
|
||||
{
|
||||
if (tcp_socket_list[i] == dynamic_cast<QTcpSocket*>(sender()))//可以直接用sender()解决,此处为稳健起见还是采取遍历
|
||||
{
|
||||
QString ip = tcp_socket_list[i]->peerAddress().toString();
|
||||
string ip_t = ip.toStdString();
|
||||
printf("TCP: %.*s:%d Disconnected.\n",ip_t.length(), ip_t.data(), tcp_socket_list[i]->peerPort());
|
||||
if (disccallback != nullptr)
|
||||
disccallback(tcp_socket_list[i]);
|
||||
tcp_socket_list.removeAt(i);
|
||||
dynamic_cast<QTcpSocket*>(sender())->deleteLater();
|
||||
qDebug() << "disconnect";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TCPServer::TCPReadPeer()
|
||||
{
|
||||
sock =(QTcpSocket *)sender();
|
||||
QByteArray recv;
|
||||
while(sock->bytesAvailable())//循环接收
|
||||
{
|
||||
recv += sock->readAll();
|
||||
if (!sock->waitForReadyRead(_timeout))//超时停止接收
|
||||
{
|
||||
/*QString error = sock->errorString();
|
||||
string error_t = error.toStdString();
|
||||
log_w("error:%d: %.*s", sock->error(),error_t.length(), error_t.data());*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
QString ip = sock->peerAddress().toString();
|
||||
string ip_t = ip.toStdString();
|
||||
printf("TCPC: Recvd from %.*s:%d\n", ip_t.length(), ip_t.data(), sock->peerPort());
|
||||
printf("TCP Message:%.*s\n",recv.size(),(char *)recv.data());
|
||||
if (recvcallback != nullptr)
|
||||
recvcallback(recv,sock);
|
||||
}
|
||||
|
||||
void TCPServer::setTimeOut(int timeout)
|
||||
{
|
||||
_timeout = timeout;
|
||||
}
|
||||
|
||||
void TCPServer::setCallBack(void (*callback)(QByteArray &data, QTcpSocket* socket))
|
||||
{
|
||||
recvcallback = callback;
|
||||
}
|
||||
|
||||
void TCPServer::setCallBack(void (*callback)(QTcpSocket* socket))
|
||||
{
|
||||
disccallback = callback;
|
||||
}
|
||||
|
||||
void TCPServer::sendToclient(QTcpSocket *socket,QByteArray data)
|
||||
{
|
||||
socket->write(data);
|
||||
}
|
||||
|
||||
/*void TCPServer::sendToclient(QString ip, quint16 port, QByteArray data)
|
||||
{
|
||||
QHostAddress addr(ip);
|
||||
for (int i=0;i<tcp_socket_list.length();i++)
|
||||
{
|
||||
if (addr == tcp_socket_list[i]->peerAddress()&&tcp_socket_list[i]->peerPort()==port)
|
||||
{
|
||||
tcp_socket_list[i]->write(data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}*/
|
|
@ -0,0 +1,40 @@
|
|||
#ifndef TCPSERVER_H
|
||||
#define TCPSERVER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTcpServer>
|
||||
#include <QTcpSocket>
|
||||
#include <QDebug>
|
||||
|
||||
class TCPServer : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static TCPServer* getInstance();
|
||||
void configAndrun();
|
||||
void setServer(QString IP, qint16 port);
|
||||
void setCallBack(void (*callback)(QByteArray &data,QTcpSocket* socket));//Qt的信号-槽机制实际就是回调函数,
|
||||
void setCallBack(void (*callback)(QTcpSocket* socket)); //此处为练手,不使用该机制
|
||||
void sendToclient(QTcpSocket *socket,QByteArray data);
|
||||
void setTimeOut(int timeout);
|
||||
void stopRun();
|
||||
private:
|
||||
explicit TCPServer(QObject *parent = nullptr);
|
||||
~TCPServer();
|
||||
int _timeout = 20;
|
||||
QString listen_addr = "0.0.0.0";
|
||||
qint16 listen_port = 7890;
|
||||
QTcpServer tcp_server;
|
||||
QTcpSocket* sock;
|
||||
QList <QTcpSocket*> tcp_socket_list;
|
||||
void (*recvcallback) (QByteArray &data, QTcpSocket* socket)=nullptr;
|
||||
void (*disccallback) (QTcpSocket* socket)=nullptr;
|
||||
static TCPServer tcpserver_instance;
|
||||
private slots:
|
||||
void acceptTCPConnection();
|
||||
void TCPReadPeer();
|
||||
void discTCPConnection();
|
||||
signals:
|
||||
};
|
||||
|
||||
#endif // TCPSERVER_H
|
Loading…
Reference in New Issue