随笔 - 64  文章 - 3 评论 - 2 阅读 - 25694
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

写一个在x线程中管理的tcp

复制代码
#include <QThread>
#include <QTcpSocket>
#include <QObject>
#include <QNetworkProxy>

class TcpSocketController : public QTcpSocket
{
    Q_OBJECT
public:
    TcpSocketController(QObject* parent = nullptr) : QTcpSocket(parent)
    {
        connect(this, &TcpSocketController::readyRead, this, &TcpSocketController::onInCommingData);
        connect(this, &TcpSocketController::signal_SendData, this, &TcpSocketController::OnSendData);
    }
    ~TcpSocketController() {}

signals:
    void signal_ReadData(const QByteArray& d);
    void signal_SendData(const QByteArray& d);

public slots:
    void OnSendData(const QByteArray& d)
    {
        qint64 len = write(d);
    }
    void onInCommingData()
    {
        QByteArray data = readAll();
        if (data.length() > 0)
        {
            emit signal_ReadData(data);
        }
    }
};

/*
使用方式:
TcpSocketEx 创建一个对象
  InitTcp(QString ip, int port)初始化链接
WriteData(QByteArray d)发送tcp数据
signal_ReadData(const QByteArray&) 信号曹返回tcp数据
****************************/

class TcpSocketEx : public QObject
{
    Q_OBJECT
public:
    TcpSocketEx(QObject* parent = nullptr) : QObject(parent)
    {
        m_tcp_client = new TcpSocketController;
    }

    ~TcpSocketEx()
    {
        if (workerThread.isRunning())
        {
            workerThread.quit();
            workerThread.wait();
        }
    }
    bool InitTcp(QString ip, int port)
    {

        m_tcp_client->setProxy(QNetworkProxy::NoProxy);
        m_tcp_client->connectToHost(QHostAddress(ip), port);
        if (!m_tcp_client->waitForConnected(3000))
        {
            // connection failed
            qDebug() << "connection failed " << ip << ":" << port;
            m_isConnect = false;
            return false;
        }
        // connection success

        m_tcp_client->moveToThread(&workerThread);
        connect(&workerThread, &QThread::finished, m_tcp_client, &QObject::deleteLater);
        connect(m_tcp_client, &TcpSocketController::signal_ReadData, this, &TcpSocketEx::signal_ReadData, Qt::DirectConnection);
        connect(m_tcp_client, &TcpSocketController::connected, this, [=]() {
            m_isConnect = true;
            emit signal_connected();
        });
        connect(m_tcp_client, &TcpSocketController::disconnected, this, [=]() {
            m_isConnect = false;
            emit signal_disconnected();
        });
        connect(m_tcp_client, &TcpSocketController::stateChanged, this, &TcpSocketEx::signal_stateChanged);
        workerThread.start();
        m_isConnect = true;
        return true;
    }

    void WriteData(QByteArray d)
    {
        emit m_tcp_client->signal_SendData(d);
    }
    void WriteData(QString d)
    {
        WriteData(d.toLatin1());
    }
    // 链接状态
    bool isConnect()
    {
        return m_isConnect;
    }

signals:
    void signal_ReadData(const QByteArray& d);  // 接受数据信号
    void signal_connected();                    // 信号
    void signal_disconnected();                 // 信号
    void signal_stateChanged(QAbstractSocket::SocketState);

private:
    QThread              workerThread;
    TcpSocketController* m_tcp_client = nullptr;
    bool                 m_isConnect  = false;
};
复制代码

 

posted on   七星落地  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示