QT TCP客户端网络通信

  1. 在工程文件.pro中添加以下代码
QT       += network
  1. TCP客户端实现
    2.1 .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

2.2 .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();
    }
}
  1. TCP客户端初始化
    3.1 .h文件
#include <tcpclient.h>

public:
    TCPClient *tcpClient = nullptr;

3.2 .cpp文件

// 打开网络客户端
void MainWindow::on_toolButton_OpenClient_clicked()
{
    try {
        if(tcpClient == NULL) {
            tcpClient = new TCPClient();
        }
        if(tcpClient->openTcpClient("192.168.10.108", 9999)) {
            // 自定义信号/槽函数绑定处理(异步处理)
            connect(tcpClient, &TCPClient::pushClient_singal, this,  &MainWindow::processHandleBySingal, Qt::QueuedConnection);
        } else {
            QMessageBox::warning(NULL, "Title", "打开网络客户端失败", QMessageBox::Yes, QMessageBox::Yes);
        }
    } catch (std::exception ex) {
        QMessageBox::information(NULL, "Title", ex.what(), QMessageBox::Yes, QMessageBox::Yes);
    }
}
// 关闭网络客户端
void MainWindow::on_toolButton_CloseClient_clicked()
{
    if(tcpClient != nullptr &&tcpClient->getConnectStatus()) {
        tcpClient->closeTcpClient();
        delete tcpClient;
        tcpClient = NULL;
    }
}
  1. 参考文档
    https://blog.csdn.net/weixin_49730048/article/details/124645711
    https://www.cnblogs.com/xyf327/p/15191403.html
    https://blog.csdn.net/u014252478/article/details/80377103
Qt是一个跨平台的C++应用程序框架,它提供了丰富的库和工具来帮助开发者创建各种类型的应用程序,包括网络通信应用。 在Qt中实现TCP服务端和客户端的通信非常简单。首先,我们需要创建一个QTcpServer对象来作为服务端,该对象负责监听客户端的连接请求。接下来,我们需要为QTcpServer对象绑定一个IP地址和端口号,以便客户端能够连接到该地址和端口。当有新的客户端连接时,QTcpServer对象会发出newConnection()信号。 在服务端的槽函数中,我们可以使用QTcpServer的nextPendingConnection()函数获取新连接的QTcpSocket对象,该对象用于和客户端进行通信。我们可以在该对象上发送和接收数据,以实现服务端和客户端之间的数据交互。 接下来,我们需要创建一个QTcpSocket对象作为客户端,该对象负责和服务端建立连接。我们需要使用connectToHost()函数来指定要连接的服务端的IP地址和端口号。一旦连接成功,QTcpSocket对象会发出connected()信号。 在客户端的槽函数中,我们可以使用QTcpSocket对象发送和接收数据。我们可以使用write()函数发送数据,使用readyRead()信号和read()函数接收数据。 通过这种方式,我们可以在服务端和客户端之间进行双向的数据通信。服务端可以同时接受多个客户端的连接,每个客户端都可以和服务端进行独立的数据交互。 总的来说,使用Qt实现TCP服务端和客户端通信非常方便。通过使用QTcpServer和QTcpSocket类,我们可以轻松地建立连接,发送和接收数据。这种通信方式可以应用于多种场景,如实时聊天、远程控制等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值