Qt网络编程-简易版TcpClient入门Demo(1)

11 篇文章 12 订阅

Qt网络编程-简易版TcpClient入门Demo(1)🖐

更多精彩内容
👉个人内容分类汇总 👈
简易版
👉Qt网络编程-简易版TcpClient入门Demo(1)👈
👉Qt网络编程-简易版TcpServer入门Demo(2)👈
👉Qt网络编程-简易版UDP单播通信入门Demo(3)👈
👉Qt网络编程-简易版UDP单播通信入门Demo(4)👈
👉Qt网络编程-简易版UDP组播通信入门Demo(5)👈
👉Qt网络编程-简易版UDP广播通信入门Demo(6)👈
进阶版
👉Qt网络编程-TcpClient入门Demo(1)👈
👉Qt网络编程-TcpServer入门Demo(2)👈

1、概述👨‍🎓

使用QTcpSocket实现TCP Client,十分简易的入门Demo

第一,绝对不意气用事;

第二,绝对不放过任何一个注释;

第三,绝对保证代码的简洁明了。🤘

为了便于学习,在这个Demo里会尽可能简单的实现TCP客户端功能,尽可能少的引入其它功能,只保留了基本功能,所以可能会有一些bug。

实现功能:

  • TCP连接/断开功能;
  • 数据接收功能;
  • 数据发送功能

2、TCP客户端流程图🏃‍♀️

在这里插入图片描述
)]

3、 关键信号🚶‍♂️

信号说明
connectedQTcpSocket连接成功后发出此信号
disconnectedQTcpSocket断开连接后发出此信号
readyRead有可读数据时发出此信号

4、 关键函数 🧍‍♂️

函数名说明
m_tcpClient->connectToHost(IP, 端口)TCP连接Server
m_tcpClient->abort()立即关闭套接字,丢弃写入缓冲区中的任何未决数据
m_tcpClient->state()判断QTcpSocket当前状态,UnconnectedState未连接、ConnectedState已连接
m_tcpClient->write(QByteArray)发送数据
m_tcpClient->readAll()读取所有数据

5、主要代码🧎

  • 注意:.pro文件里添加QT += network,否则编译失败。

  • .h文件

    /******************************************************************************
     * @文件名     simpletcpclient.h
     * @功能       简易的TCP客户端功能Demo,只保留TCP连接/断开、数据发送、接收功能
     *
     * @开发者     mhf
     * @邮箱       1603291350@qq.com
     * @时间       2022/04/17
     * @备注
     *****************************************************************************/
    #ifndef SIMPLETCPCLIENT_H
    #define SIMPLETCPCLIENT_H
    
    #include <QWidget>
    #include <QTcpSocket>
    
    namespace Ui {
    class SimpleTcpClient;
    }
    
    class SimpleTcpClient : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit SimpleTcpClient(QWidget *parent = nullptr);
        ~SimpleTcpClient();
    
    private slots:
        void on_connected();
        void on_disconnected();
        void on_readyRead();
        void on_but_connect_clicked();
    
        void on_but_send_clicked();
    
    private:
        Ui::SimpleTcpClient *ui;
    
        QTcpSocket* m_tcpClient = nullptr;
    };
    
    #endif // SIMPLETCPCLIENT_H
    
    
  • .cpp文件

    #include "simpletcpclient.h"
    #include "ui_simpletcpclient.h"
    
    #include <qhostaddress.h>
    
    SimpleTcpClient::SimpleTcpClient(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::SimpleTcpClient)
    {
        ui->setupUi(this);
    
        this->setWindowTitle("简易版本TCP 客户端Demo");
    
        m_tcpClient = new QTcpSocket(this);
        connect(m_tcpClient, &QTcpSocket::connected, this, &SimpleTcpClient::on_connected);         // TCP连接成功后发出connected信号
        connect(m_tcpClient, &QTcpSocket::disconnected, this, &SimpleTcpClient::on_disconnected);   // TCP断开连接后发出disconnected信号
        connect(m_tcpClient, &QTcpSocket::readyRead, this, &SimpleTcpClient::on_readyRead);         // 当有可读数据时发出readyRead信号
    }
    
    SimpleTcpClient::~SimpleTcpClient()
    {
        if(m_tcpClient->state() != QAbstractSocket::UnconnectedState)
        {
          m_tcpClient->abort();   // 因为再关闭时会修改but_connect文本,所以如果由系统再析构时自动释放则会出现的错误,再这里关闭了就不会出现了
        }
        delete ui;
    }
    
    /**
     * @brief TCP连接/断开控制,不需要指定本地端口,默认自动分配一个端口
     */
    void SimpleTcpClient::on_but_connect_clicked()
    {
        if(m_tcpClient->state() == QAbstractSocket::UnconnectedState)         // 判断连接状态,如果未连接则开始连接
        {
            m_tcpClient->connectToHost(ui->line_peerAddress->text(),          // 目标IP地址
                                       ui->spin_peerPort->value());           // 目标端口号
        }
        else      // 如果不是未连接则断开连接
        {
            m_tcpClient->abort();
        }
    }
    
    /**
     * @brief TCP连接成功,修改按键状态
     */
    void SimpleTcpClient::on_connected()
    {
        ui->but_connect->setText("断开连接");
    }
    
    /**
     * @brief TCP断开连接,修改按键状态
     */
    void SimpleTcpClient::on_disconnected()
    {
        ui->but_connect->setText("连接");
    }
    
    /**
     * @brief TCP读取数据并显示
     */
    void SimpleTcpClient::on_readyRead()
    {
        QByteArray dataArr = m_tcpClient->readAll();        // 一次性读取缓存中所有数据
        if(dataArr.count() <= 0)   // 没有读取到数据
        {
            return;
        }
    
        ui->text_recv->append(dataArr);        // 显示读取到的数据
    }
    
    /**
     * @brief 发送数据
     */
    void SimpleTcpClient::on_but_send_clicked()
    {
        if(m_tcpClient->state() != QAbstractSocket::ConnectedState) return;  // 判断TCP是否已连接,如果没有连接则不发送数据
    
        QString str = ui->text_send->toPlainText();         // 获取输入框的内容
        qint64 len = m_tcpClient->write(str.toUtf8());      // 发送数据,toUtf8()是为了支持发送中文,但是如果接收端编码方式不同则中文可能显示乱码
        if(len < 0)
        {
            qWarning() <<"发送失败!";
        }
    }
    
    

6、实现效果🏄

在这里插入图片描述

7、源代码🤸

gitee
github
🤏🤏🤏🤏🤏🤏🤏🤏🤏🤏🤏🤏🤏

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
您好!对于STM32F407和ETH LWIP,我可以为您提供一些关于TCP client客户端的开发方面的信息。 首先,您需要使用STM32CubeMX软件来配置STM32F407的ETH和LWIP库。在STM32CubeMX中,您可以配置以太网接口和选择使用LWIP协议栈。确保在配置期间启用TCP/IP协议。 一旦配置完成并生成代码,您可以在生成的代码中找到LWIP库的API函数以及以太网驱动程序的相关函数。在这里,您将能够设置和管理TCP连接。 以下是一个简单TCP客户端示例代码,用于向服务器发送数据: ```c #include "lwip/api.h" #define SERVER_IP "192.168.0.100" #define SERVER_PORT 8080 void tcp_client_task(void *arg) { struct netconn *conn; err_t err; // 创建TCP连接 conn = netconn_new(NETCONN_TCP); if (conn != NULL) { ip_addr_t server_addr; // 设置服务器IP地址和端口 IP4_ADDR(&server_addr, 192, 168, 0, 100); // 连接服务器 err = netconn_connect(conn, &server_addr, SERVER_PORT); if (err == ERR_OK) { const char *data = "Hello, server!"; struct netbuf *send_buf; // 创建发送数据包 send_buf = netbuf_new(); if (send_buf != NULL) { // 将数据添加到发送数据包中 netbuf_ref(send_buf, data, strlen(data)); // 发送数据包 err = netconn_send(conn, send_buf); // 释放发送数据包 netbuf_delete(send_buf); } } // 关闭连接 netconn_close(conn); netconn_delete(conn); } vTaskDelete(NULL); } ``` 请注意,此示例代码仅用于演示目的,您可能需要根据您的具体需求进行修改。另外,还要确保正确初始化LWIP协议栈和以太网接口。 希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mahuifa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值