IVA/app/HxUtils.h

156 lines
3.4 KiB
C
Raw Normal View History

2023-10-20 23:36:22 +08:00
#ifndef HXUTILS_H
#define HXUTILS_H
#include <QMutex>
#include <QHostInfo>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDateTime>
#include <QCoreApplication>
#include <QProcess>
/**
* @brief SocketUtils socket
*/
class HxSocketUtils : public QObject
{
Q_OBJECT
public:
HxSocketUtils(quint16 port)
{
connect(&server, &QTcpServer::newConnection, this, &HxSocketUtils::new_connection);
server.listen(QHostAddress::Any, port);
}
HxSocketUtils(QString address, int port)
{
is_reconnect = true;
socket = new QTcpSocket();
connect(socket, &QTcpSocket::readyRead, this, &HxSocketUtils::ready_read);
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()), Qt::QueuedConnection);
connect(this, &HxSocketUtils::reconnection_event, this, &HxSocketUtils::reconnection);
/* 域名解析 */
QHostInfo info = QHostInfo::fromName(address);
this->port = port;
this->address = info.addresses().at(0).toString();
reconnection();
}
signals:
void data_receive_event(QByteArray data);
void reconnection_event(void);
public slots:
void new_connection()
{
if (socket != nullptr)
socket->abort();
socket = server.nextPendingConnection();
connect(socket, &QTcpSocket::readyRead, this, &HxSocketUtils::ready_read);
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()), Qt::QueuedConnection);
}
void write(QByteArray data)
{
if (socket == nullptr || socket->state() != QTcpSocket::ConnectedState)
return;
data.append('\n');
socket->write(data);
socket->flush();
}
void ready_read()
{
QByteArray msg = socket->readAll();
emit data_receive_event(msg.data());
}
void disconnected()
{
qDebug("socket disconnect");
if (is_reconnect)
{
qDebug("socket will be reconnected... ");
emit reconnection_event();
}
}
2023-10-21 23:39:10 +08:00
/**
* @brief
*/
2023-10-20 23:36:22 +08:00
void reconnection()
{
/* 取消已有的连接 */
if (socket != nullptr)
{
socket->disconnectFromHost();
qDebug("socket release");
}
qDebug("socket connecting......");
/* 连接服务器 */
socket->connectToHost(address, port);
/* 等待连接 */
if (socket->waitForConnected(500))
{
qDebug("socket connect success");
}
else
{
qDebug("socket connect failed");
/* 使用 QThread::msleep 延时,会使 Socket 出现接收不到事件信息 (槽无法响应) */
auto time = QTime::currentTime().addMSecs(10000);
while (QTime::currentTime() < time)
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
emit reconnection_event();
}
}
private:
int port;
QString address;
bool is_reconnect = false;
QTcpServer server;
2023-10-21 23:39:10 +08:00
QTcpSocket* socket = nullptr;
2023-10-20 23:36:22 +08:00
};
class HxProcessUtils
{
public:
2023-10-21 23:39:10 +08:00
/**
*
*/
2023-10-20 23:36:22 +08:00
static int execute(QString command)
{
auto array = command.split(" ");
QString program = array.at(0);
QStringList arguments;
for (int i = 1; i < array.count(); i++)
arguments << array.at(i);
return QProcess::execute(program, arguments);
}
};
#endif // HXUTILS_H