首页 > 其他分享 >【QT】TCP网络通信

【QT】TCP网络通信

时间:2024-05-30 09:04:58浏览次数:29  
标签:网络通信 QByteArray QT void nullptr TcpServer tcp TCP include

第一步:.pro工程文件添加
QT += network
第二步:.h文件添加

#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QException>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>

class TcpServer: public QObject
{
    Q_OBJECT
public:
    TcpServer();
    bool openNetWork(qint16 port);
    void closeNetWork();
    bool getNetWorkStatus();
    void sendData(QString msg);
private:
    void connection();
    void disConnected(QTcpSocket tcp);
private:
    QTcpServer *m_s = nullptr;
    QTcpSocket *m_tcp = nullptr;

signals:
    //信号没有返回值,可以有参数,信号函数不需要定义,只需要声明
    void pushNetwork_singal(QByteArray buffer, qint64 length);
};

#endif // TCPSERVER_H

第三步:.cpp文件添加

#include "tcpserver.h"

TcpServer::TcpServer()
{
}

// 开启网络监听
bool TcpServer::openNetWork(qint16 port)
{
    try {
        closeNetWork();
        // 创建监听的套接字
        m_s = new QTcpServer(this);
        // 信号/槽绑定监听客户端接入
        connect(m_s, &QTcpServer::newConnection, this, &TcpServer::connection, Qt::QueuedConnection);
        // 开启监听
        m_s->listen(QHostAddress::Any, port);
        return m_s->isListening();
    } catch (std::exception ex) {
        qDebug() << "打开网络监听失败:" << ex.what();
    }
    return false;
}
// 关闭网络监听
void TcpServer::closeNetWork()
{
    if(m_tcp != NULL && m_tcp->isOpen()) {
        m_tcp->close();
        m_tcp->deleteLater();
        m_tcp = nullptr;
    }
    if(m_s != NULL && m_s->isListening()) {
        m_s->close();
        m_s->deleteLater();
        m_s = nullptr;
    }
}
// 获取网络状态
bool TcpServer::getNetWorkStatus()
{
    return m_s->isListening();
}

// 客户端接入
void TcpServer::connection()
{
    try {
        qDebug() << "客户端接入";
        // 创建用于通信的套接字
        m_tcp = m_s->nextPendingConnection();
        // 检测是否可以接受数据
        connect(m_tcp, &QTcpSocket::readyRead, this, [ = ]() {
            try {
                QByteArray data = m_tcp->readAll();
                pushNetwork_singal(data, data.count());
            } catch (std::exception ex) {
                qDebug() << "读取数据失败:" << ex.what();
            }
        });
        // 断开连接
        connect(m_tcp, &QTcpSocket::disconnected, this, [ = ]() {
            try {
                qDebug() << "客户端断开";
                m_tcp->close();
                m_tcp->deleteLater();
                m_tcp = nullptr;
            } catch (std::exception ex) {
                qDebug() << "客户端连接断开处理失败:" << ex.what();
            }
        });
    } catch (std::exception ex) {
        qDebug() << "客户端接入失败:" << ex.what();
    }
}

// 发送数据
void TcpServer::sendData(QString msg)
{
    if(m_tcp != nullptr && m_tcp->isOpen()) {
        // (msg.toUtf8();//转换成utf8格式的字节流发送
        // 按十六进制编码发送
        QByteArray byte = QByteArray::fromHex (msg.toLatin1().data());//按十六进制编码发送
        m_tcp->write(byte);
    }
}

标签:网络通信,QByteArray,QT,void,nullptr,TcpServer,tcp,TCP,include
From: https://www.cnblogs.com/qiutian-hao/p/18221513

相关文章

  • 基于QT的TCP本地与不同局域网(使用公网)的简易聊天工具
    1.前言本文包含了目前平台上大多数的文章所采取的本地tcp构建的聊天室项目,也就是同一局域网通信。同时,我在这里提供不同局域网下实现通信的方法,这里用到的方法是客户端发送消息给服务器,然后服务器再发送给另一个局域网的客户,为了减少工作量,我采取的是用群聊的方式同一接收信息......
  • 存储器和CPU的连接与TCP的流量控制
    存储器与CPU的连接存储容量的拓展(1)位拓展:增加存储字长 (2)字拓展增加存储器字的数量     例题:设CPU有16根地址线,8根数据线,并用MREQ作为访问存储控制信号(低电平有效),WR作为读写控制信号,(高电平读,低电平写)。   现有以下存储芯片:1k*4位RAM,4K*8位RAM,8K......
  • 为QT程序增加版本等属性信息
    1.在pro文件中增加VERSION=1.0.0.0,编译后,会在debug或release目录下生成xxx_resource.rc文件,使用编辑器打开进行编辑;2.在pro文件中增加RC_FILE=xxx_resource.rc,VERSION自动失效,编译后,即可增加属性信息。注意:由QT自动生成的RC文件默认使用UTF-8编码,属性信息中若含中文,windows......
  • 使用qtranslator遇到的坑
    需求:使用Qt+C++的项目支持中/英文界面Qt:QTranslator类头文件:#include<qtranslator.h>要翻译的语句都要加上tr("待翻译的内容")不属于Qt部分的类需要继承QObject后使用tr();classCGlobalVariant:QObject{ Q_OBJECT}生成ts文件网上找到生成ts文件的一种方法是使......
  • pyqt Qtreeview分层控件
    pyqtQtreeview分层控件介绍效果代码介绍QTreeView是PyQt中的一个控件,它用于展示分层数据,如目录结构、文件系统等。QTreeView通常与模型(如QStandardItemModel、QFileSystemModel或自定义模型)一起使用,以管理数据和提供视图如何显示数据的规则。效果代码from......
  • MQTT和kafka搭配使用 集成 emq iot 物联网
    MQTT历史MQTT协议于1999年发明,用于石油和天然气行业。工程师需要一种协议来实现最小带宽和最小电池损耗,以通过卫星监控石油管道。最初,该协议被称为MessageQueuingTelemetryTransport(消息队列遥测传输),得名于首先支持其初始阶段的IBM产品MQ系列。2010年,IBM发布了......
  • QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥
    前言  使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车、无人船、无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇:上半部分:主要是安装好后,使用QtCreator可以使用QGIs的apps下的Qt使用对应的编译器编译不带qgis的空工程。下半部分:在上半......
  • Qt的延时函数 实现精准延时(转)
    voidQUIHelper::delay(intmsec){//这个最准/*非阻塞方式延时,现在很多人推荐的方法*/QEventLooploop;QTimer::singleShot(msec,&loop,SLOT(quit()));loop.exec();}voidQUIHelper::deferred(intmsec){//这个最准QTimertimer;timer.setTim......
  • QT C++实现表头添加组件
    QTableWidget在表头添加组件QTableWidget的表头有一个类QHeaderView是专门处理表头的类,要在表头添加一个类似QCheckBox的组件需要重写一个类并继承QHeaderView。QTableWidget中添加复选框并实现全选居中:自定义类MyHeaderView并继承QHeaderView自定义类MyTableWidget并继承QTa......
  • 【Qt秘籍】[005]-Qt第一次实战-运行
    一、如何创建文件?        当我们打开QtCreator,你会发现整个界面类目繁多。现在,让我们直接开始新建一个项目。1.点击左上角的“文件”==>点击“新建文件或项目”2.如图,选择“Application”==>“QtWifgetsapplication”==>“Choose...” 3.如图,选择填写名称和......