首页 > 其他分享 >【QT】TCP客户端网络连接

【QT】TCP客户端网络连接

时间:2024-05-30 15:33:04浏览次数:14  
标签:TCPClient QByteArray QT TCP receiveByte QTcpSocket 网络连接 include socket

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

#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include <QException>
#include <QDebug>
#include <QTcpSocket>
#include <QHostAddress>

class TCPClient: public QObject
{
    Q_OBJECT
public:
    TCPClient();
    bool openTcpClient(QString ip, qint16 port);
    void closeTcpClient();
    bool sendData(QString msg);
    bool getConnectStatus();
private:
    void readData();
private:
    QTcpSocket *socket = nullptr;
    qint32 MAX_BUFFER = 1024 * 10;
signals:
    //信号没有返回值,可以有参数,信号函数不需要定义,只需要声明
    void pushClient_singal(QByteArray buffer, qint64 length);
};

#endif // TCPCLIENT_H

第三步:.cpp文件添加代码

#include "tcpclient.h"

TCPClient::TCPClient()
{
}

// 打开网络连接
bool TCPClient::openTcpClient(QString ip, qint16 port)
{
    try {
        closeTcpClient();
        // 创建通信的套接字
        socket = new QTcpSocket(this);
        socket->abort();                 //取消原有连接
        // 接受到服务端消息
        connect(socket, &QTcpSocket::readyRead, this, [ = ]() {
            readData();
        });
        // 服务器端断开连接
        connect(socket, &QTcpSocket::disconnected, this, [ = ]() {
            closeTcpClient();
        });
        // 检测连接状态
        connect(socket, &QTcpSocket::connected, this, [ = ]() {
        });
        socket->connectToHost(QHostAddress(ip), port);
        // 等待连接成功
        if(socket->waitForConnected()) {
            return true;
        }
    } catch (std::exception ex) {
        qCritical() << "打开网络连接失败:" << ex.what();
    }
    return false;
}
// 关闭网络
void TCPClient::closeTcpClient()
{
    try {
        if(socket != NULL&&socket->state()) {
            socket->disconnectFromHost();
            socket->abort();
            socket->close();
            socket->deleteLater();
            socket = nullptr;
        }
    } catch (std::exception ex) {
        qCritical() << "关闭网络连接失败:" << ex.what();
    }
}
// 发送数据
bool TCPClient::sendData(QString msg)
{
    try {
        if(socket != nullptr && socket->isOpen()) {
            // (msg.toUtf8();//转换成utf8格式的字节流发送
            // 按十六进制编码发送
            QByteArray byte = QByteArray::fromHex (msg.toLatin1().data());//按十六进制编码发送
            socket->write(byte);
            //判断是否写入成功
            bool iswrite = socket->waitForBytesWritten();
            if (iswrite) {
                //写入成功
                return true;
            } else {
                //没有写入成功
                return false;
            }
        }
    } catch (std::exception ex) {
        qCritical() << "客户端发送失败:" << ex.what();
    }
    return false;
}

// 获取连接状态
bool TCPClient::getConnectStatus()
{
    return socket->state();
}
// 接收数据
void TCPClient::readData()
{
    try {
        // 设置每次读取最大缓存数据
        QByteArray receiveByte = socket->read(MAX_BUFFER);
        // 一次读取全部缓存数据
        //QByteArray receiveByte = m_socket->readAll();
        if(receiveByte.count() > 0) {
            pushClient_singal(receiveByte, receiveByte.count());
        } else {
            qInfo() << "读取不到数据";
        }
    } catch (std::exception ex) {
        qCritical() << "读取数据失败:" << ex.what();
    }
}

标签:TCPClient,QByteArray,QT,TCP,receiveByte,QTcpSocket,网络连接,include,socket
From: https://www.cnblogs.com/qiutian-hao/p/18222462

相关文章

  • 【QT】QHash键值对记录QTcpSocket客户端句柄
    第一步:.h文件代码#ifndefSOCKETMAP_H#defineSOCKETMAP_H#include<QHash>#include<QDebug>#include<QTcpSocket>#include<QException>classSocketMap:publicQObject{Q_OBJECTpublic:SocketMap();public:staticboolupd......
  • TCP协议的特点
    1.TCP是面向连接的传输层的协议(物理层-数据链路层-网络层-传输层-会话层-应用层)。也就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。数据传输完毕以后,必须释放已经建立的TCP的连接2.每一条TCP连接必须是(一对一)的3.TCP提供可靠交付的服务。通过TCP连接传输的数据,不丢失......
  • Qt window和Linux通过进程名称判断是否有进程存在
    boolCommFunction::isProcessRunning(constQString&processName){QProcessprocess;#ifdefWIN32process.start("tasklist",QStringList()<<"/FI"<<"IMAGENAMEeq"+processName);process.waitForF......
  • c#使用Modbus TCP
    c#使用ModbusTCP在C#中,使用第三方库来实现ModbusTCP通讯。其中比较常用的是EasyModbusTCP库。以下是使用EasyModbusTCP库进行ModbusTCP通讯的示例代码:首先需要安装EasyModbusTCP库,可以通过NuGet包管理器来安装。1.创建一个ModbusClient对象,并设置连接参数:usingEasy......
  • 【QT】TCP网络通信
    第一步:.pro工程文件添加QT+=network第二步:.h文件添加#ifndefTCPSERVER_H#defineTCPSERVER_H#include<QException>#include<QDebug>#include<QTcpServer>#include<QTcpSocket>classTcpServer:publicQObject{Q_OBJECTpublic:T......
  • 基于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......