Qt网络编程-简易版TcpClient入门Demo(1)
生活随笔
收集整理的這篇文章主要介紹了
Qt网络编程-简易版TcpClient入门Demo(1)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Qt網(wǎng)絡(luò)編程-簡易版TcpClient入門Demo(1)🖐
文章目錄
- Qt網(wǎng)絡(luò)編程-簡易版TcpClient入門Demo(1)🖐
- 1、概述👨?🎓
- 2、TCP客戶端流程圖🏃?♀?
- 3、 關(guān)鍵信號(hào)🚶?♂?
- 4、 關(guān)鍵函數(shù) 🧍?♂?
- 5、主要代碼🧎
- 6、實(shí)現(xiàn)效果🏄
- 7、源代碼🤸
| 👉個(gè)人內(nèi)容分類匯總 👈 |
| 👉Qt網(wǎng)絡(luò)編程-簡易版TcpClient入門Demo(1)👈 |
| 👉Qt網(wǎng)絡(luò)編程-簡易版TcpServer入門Demo(2)👈 |
| 👉Qt網(wǎng)絡(luò)編程-簡易版UDP單播通信入門Demo(3)👈 |
| 👉Qt網(wǎng)絡(luò)編程-簡易版UDP單播通信入門Demo(4)👈 |
| 👉Qt網(wǎng)絡(luò)編程-簡易版UDP組播通信入門Demo(5)👈 |
| 👉Qt網(wǎng)絡(luò)編程-簡易版UDP廣播通信入門Demo(6)👈 |
| 👉Qt網(wǎng)絡(luò)編程-TcpClient入門Demo(1)👈 |
| 👉Qt網(wǎng)絡(luò)編程-TcpServer入門Demo(2)👈 |
1、概述👨?🎓
| 使用QTcpSocket實(shí)現(xiàn)TCP Client,十分簡易的入門Demo |
第一,絕對(duì)不意氣用事;
第二,絕對(duì)不放過任何一個(gè)注釋;
第三,絕對(duì)保證代碼的簡潔明了。🤘
為了便于學(xué)習(xí),在這個(gè)Demo里會(huì)盡可能簡單的實(shí)現(xiàn)TCP客戶端功能,盡可能少的引入其它功能,只保留了基本功能,所以可能會(huì)有一些bug。
實(shí)現(xiàn)功能:
- TCP連接/斷開功能;
- 數(shù)據(jù)接收功能;
- 數(shù)據(jù)發(fā)送功能
2、TCP客戶端流程圖🏃?♀?
)]
3、 關(guān)鍵信號(hào)🚶?♂?
| connected | QTcpSocket連接成功后發(fā)出此信號(hào) |
| disconnected | QTcpSocket斷開連接后發(fā)出此信號(hào) |
| readyRead | 有可讀數(shù)據(jù)時(shí)發(fā)出此信號(hào) |
4、 關(guān)鍵函數(shù) 🧍?♂?
| m_tcpClient->connectToHost(IP, 端口) | TCP連接Server |
| m_tcpClient->abort() | 立即關(guān)閉套接字,丟棄寫入緩沖區(qū)中的任何未決數(shù)據(jù) |
| m_tcpClient->state() | 判斷QTcpSocket當(dāng)前狀態(tài),UnconnectedState未連接、ConnectedState已連接 |
| m_tcpClient->write(QByteArray) | 發(fā)送數(shù)據(jù) |
| m_tcpClient->readAll() | 讀取所有數(shù)據(jù) |
5、主要代碼🧎
-
注意:在.pro文件里添加QT += network,否則編譯失敗。
-
.h文件
/******************************************************************************* @文件名 simpletcpclient.h* @功能 簡易的TCP客戶端功能Demo,只保留TCP連接/斷開、數(shù)據(jù)發(fā)送、接收功能** @開發(fā)者 mhf* @郵箱 1603291350@qq.com* @時(shí)間 2022/04/17* @備注*****************************************************************************/ #ifndef SIMPLETCPCLIENT_H #define SIMPLETCPCLIENT_H#include <QWidget> #include <QTcpSocket>namespace Ui { class SimpleTcpClient; }class SimpleTcpClient : public QWidget {Q_OBJECTpublic: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連接成功后發(fā)出connected信號(hào)connect(m_tcpClient, &QTcpSocket::disconnected, this, &SimpleTcpClient::on_disconnected); // TCP斷開連接后發(fā)出disconnected信號(hào)connect(m_tcpClient, &QTcpSocket::readyRead, this, &SimpleTcpClient::on_readyRead); // 當(dāng)有可讀數(shù)據(jù)時(shí)發(fā)出readyRead信號(hào) }SimpleTcpClient::~SimpleTcpClient() {if(m_tcpClient->state() != QAbstractSocket::UnconnectedState){m_tcpClient->abort(); // 因?yàn)樵訇P(guān)閉時(shí)會(huì)修改but_connect文本,所以如果由系統(tǒng)再析構(gòu)時(shí)自動(dòng)釋放則會(huì)出現(xiàn)的錯(cuò)誤,再這里關(guān)閉了就不會(huì)出現(xiàn)了}delete ui; }/*** @brief TCP連接/斷開控制,不需要指定本地端口,默認(rèn)自動(dòng)分配一個(gè)端口*/ void SimpleTcpClient::on_but_connect_clicked() {if(m_tcpClient->state() == QAbstractSocket::UnconnectedState) // 判斷連接狀態(tài),如果未連接則開始連接{m_tcpClient->connectToHost(ui->line_peerAddress->text(), // 目標(biāo)IP地址ui->spin_peerPort->value()); // 目標(biāo)端口號(hào)}else // 如果不是未連接則斷開連接{m_tcpClient->abort();} }/*** @brief TCP連接成功,修改按鍵狀態(tài)*/ void SimpleTcpClient::on_connected() {ui->but_connect->setText("斷開連接"); }/*** @brief TCP斷開連接,修改按鍵狀態(tài)*/ void SimpleTcpClient::on_disconnected() {ui->but_connect->setText("連接"); }/*** @brief TCP讀取數(shù)據(jù)并顯示*/ void SimpleTcpClient::on_readyRead() {QByteArray dataArr = m_tcpClient->readAll(); // 一次性讀取緩存中所有數(shù)據(jù)if(dataArr.count() <= 0) // 沒有讀取到數(shù)據(jù){return;}ui->text_recv->append(dataArr); // 顯示讀取到的數(shù)據(jù) }/*** @brief 發(fā)送數(shù)據(jù)*/ void SimpleTcpClient::on_but_send_clicked() {if(m_tcpClient->state() != QAbstractSocket::ConnectedState) return; // 判斷TCP是否已連接,如果沒有連接則不發(fā)送數(shù)據(jù)QString str = ui->text_send->toPlainText(); // 獲取輸入框的內(nèi)容qint64 len = m_tcpClient->write(str.toUtf8()); // 發(fā)送數(shù)據(jù),toUtf8()是為了支持發(fā)送中文,但是如果接收端編碼方式不同則中文可能顯示亂碼if(len < 0){qWarning() <<"發(fā)送失敗!";} }
6、實(shí)現(xiàn)效果🏄
7、源代碼🤸
gitee
github
🤏🤏🤏🤏🤏🤏🤏🤏🤏🤏🤏🤏🤏
總結(jié)
以上是生活随笔為你收集整理的Qt网络编程-简易版TcpClient入门Demo(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Taro+react开发(92):tar
- 下一篇: 花花省淘宝客APP源码带淘宝京东拼多多唯