一个简单的项目
该项目涉及tcp服务端客户端通信,数据库操作,Log4Qt日志打印,不过是关于工业与上位机的一个简单项目处理,过程不一定容易理解,附上通讯协议。
Qt5.12, MinGw32位即可运行。
整个项目代码量较少,也就几百到一千行左右,介意的就不要下载。
https://download.youkuaiyun.com/download/qq_34183232/85464676
部分代码如下:
#ifndef TCPCLIENTSOCKET_H
#define TCPCLIENTSOCKET_H
#include <QObject>
#include <QtNetwork>
#include <QTcpSocket>
class TcpClientSocket : public QObject
{
Q_OBJECT
public:
explicit TcpClientSocket(QObject* parent = nullptr);
bool connectTcp(QString ip, int portNum);
void disConnect();
bool write(QByteArray str);
signals:
void disConnect_signal();
void receiveData(QByteArray data);
public slots:
private:
QTcpSocket* m_socket;
void receivData();
};
#endif // TCPCLIENTSOCKET_H
#ifndef TCPSERVERSOCKET_H
#define TCPSERVERSOCKET_H
#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QNetworkInterface>
class TcpServerSocket : public QObject
{
Q_OBJECT
public:
explicit TcpServerSocket(QObject* parent = nullptr);
bool listen(int port);
void close();
QList<QHostAddress> getAllAddress()const;
QString getIpAddress()const;
void write(QString data);
void write(QString ip, int port, QString data);
signals:
void readData_signal(QString);
void disConnect_signal();
void newConnectIPportInfo_signal(QString ip, int port);
public slots:
void newConnect_slot();
void disConnect_slot();
void readData_slot();
private:
QTcpServer* m_server;
QTcpSocket* m_currentClient;
QVector<QTcpSocket*> m_tcpClientVec;
};
#endif // TCPSERVERSOCKET_H
#ifndef LOGSERVICE_H
#define LOGSERVICE_H
#include <log4qt/logger.h>
#include <log4qt/ttcclayout.h>
#include <log4qt/patternlayout.h>
#include <log4qt/dailyrollingfileappender.h>
#include <log4qt/loggerrepository.h>
#include <log4qt/logmanager.h>
#include <log4qt/propertyconfigurator.h>
#include <QString>
#include "define.h"
class MyLogger
{
public:
static MyLogger* instance()
{
static MyLogger* loggerIns = nullptr;
if(!loggerIns)
{
loggerIns = new MyLogger();
}
return loggerIns;
}
MyLogger()
{
m_logger = Log4Qt::Logger::rootLogger();
// 创建一个 TTCCLayout(输出时间、线程、Logger 以及消息内容)
// layout->setThreadPrinting(false);
Log4Qt::PatternLayout* layout = new Log4Qt::PatternLayout();
layout->setConversionPattern("%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n");
layout->setName("My Layout");
layout->activateOptions();
// 创建一个 DailyRollingFileAppender(以指定的频率滚动)
Log4Qt::DailyRollingFileAppender* appender = new Log4Qt::DailyRollingFileAppender();
appender->setName("My Appender");
appender->setLayout(layout);
appender->setFile(LOG_PATH + "log.txt");
appender->setImmediateFlush(true); // 立即刷新
appender->setThreshold(Log4Qt::Level::NULL_INT); // 设置阈值级别
appender->setAppendFile(true); // 追加的方式
// 等价于 appender->setDatePattern("'.'yyyy-MM-dd-hh");
appender->setDatePattern(Log4Qt::DailyRollingFileAppender::HOURLY_ROLLOVER);
appender->activateOptions();
// 在 logger 上添加 appender
m_logger->addAppender(appender);
// 设置级别
//m_logger->setLevel(Log4Qt::Level::DEBUG_INT);
//Log4Qt::LogManager::setHandleQtMessages(true);
}
~MyLogger()
{
m_logger->removeAllAppenders();
m_logger->loggerRepository()->shutdown();
}
void debug(const QString& msg)
{
m_logger->debug(msg);
}
void info(const QString& msg)
{
m_logger->info(msg);
}
void error(const QString& msg)
{
m_logger->error(msg);
}
Log4Qt::Logger* m_logger;
};
#endif // LOGSERVICE_H
虽然我是菜鸡,考虑到我要失业了,把仅有的资源弄弄,希望能补贴点钱财。如果写的不好,各位海涵。