首页 > 其他分享 >qt一个线程管理的tcp

qt一个线程管理的tcp

时间:2024-05-25 11:40:46浏览次数:19  
标签:QByteArray qt signal tcp client 线程 TcpSocketController void

写一个在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;
};

 

标签:QByteArray,qt,signal,tcp,client,线程,TcpSocketController,void
From: https://www.cnblogs.com/dwx-bzdcxy/p/18212223

相关文章

  • qt一个在线程管理的串口
    qt一个在线程管理的串口 #include<QObject>#include<QSerialPort>#include<QSerialPortInfo>#include<QDebug>#include<QFile>#include<QTextStream>#include<QThread>#include<QTimer>#include<QEventLoop>......
  • 在4核心8线程开发板上显示德国国旗
    *name;GemanyColor*function:德国国国旗*parameter;*ReValue;*author;小北blog*attention;none*date;2024.05.25*Copyright(c)[email protected]*************************************************************......
  • 深入解析Python并发的多线程和异步编程
    在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别是在处理I/O密集型任务时。Python提供了threading模块,使得多线程编程变得相对简单。本文将深入探讨threading模块的基础知识,并通过实例演示多线程的应用。1.多线程基础概念在开始之前,让我们......
  • 线程的概念和控制
    文章目录线程概念线程的优点线程的缺点线程异常线程用途理解虚拟地址线程控制线程的创建线程终止线程等待线程分离封装线程库线程概念什么是线程?在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列一切进程至少都有一个......
  • WinSock 的多线程编程
    目录概述Winsock为什么需要多线程阻塞模式和非阻塞模式单线程和多线程的优缺点Win32系统下的多进程多线程机制进程和线程线程创建线程同步线程通信  VC++对多线程网络编程的支持MFC中的多线程支持ATL中的多线程支持多线程FTP客户端实例头文件包含线......
  • 【阿里前端面试题】客户端和服务器交互,为什么选用tcp协议建立链接?超详细,建议关注收藏
    大家好,我是“寻找DX3906”。每天进步一点。日积月累,有朝一日定会厚积薄发前言        在上一篇文章中《【阿里前端面试题】浏览器的加载渲染过程,超详细》中描述:浏览器使用IP地址与服务器建立连接,通常是通过TCP(传输控制协议)。那为什么要使用TCP协议建立链接呢......
  • 基于Python的性能优化--多线程、协程、多进程
    合集-Python(1) 1.基于Python的性能优化05-24收起 一、多线程在CPU不密集、IO密集的任务下,多线程可以一定程度的提升运行效率。importthreadingimporttimeimportrequestsdeffetch_url(url:str)->None:'''根据地址发起请求,获取响应-url:......
  • Qt moc系统的黑魔法?
    Qt的元对象系统(Meta-ObjectSystem)是Qt框架的核心功能之一,为C++语言增加了一些动态特性,借助元对象系统Qt可以实现以下功能信号与槽机制(SignalsandSlots)运行时类型信息(Run-TimeTypeInformation,RTTI)属性系统(PropertySystem)动态对象创建(DynamicObjectCreation)动态方法调......
  • QTreeView中item节点任意拖拽移动,添加,删除与自绘指示器
    文章目录效果图主要功能点概要遇到的问题指示器拖拽总结效果图主要功能点节点自由拖拽移动自绘树的指示器可拖拽添加节点概要整体还是对于model-view这一套的使用,左侧的实现可看我的这篇文章,本文具体讲讲这个树QTreeView的拖拽与自绘指示器。关于树......
  • C++/Qt桌面应用学习路线参考
    ......