Qt網絡通信服務端與客戶端學習

Qt網絡通信服務端與客戶端學習

一、項目概述

本項目基于Qt框架實現了TCP服務端與客戶端的基本通信,涵蓋連接、消息收發、斷開管理等功能,適合初學者系統學習Qt網絡模塊的實際用法。

二、項目結構

  • 52/ 服務端:main.cpp、widget.cpp、widget.h
  • 53/ 客戶端:main.cpp、widget.cpp、widget.h

三、環境配置

  • Qt 5.x及以上
  • 啟用network、widgets模塊
  • C++11支持

四、服務端核心代碼詳解(52目錄)

1. main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

2. widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
private:Ui::Widget *ui;           // UI指針QTcpServer *tcpServer;    // TCP服務端對象
private slots:void mNewConnetion();     // 新連接處理槽void receiveMessages();   // 接收消息槽void mStateChanged(QAbstractSocket::SocketState); // 連接狀態變化槽void on_pushButton_3_clicked(); // 發送消息按鈕槽void on_pushButton_clicked();   // 開始監聽按鈕槽void on_pushButton_2_clicked(); // 停止監聽按鈕槽
};
#endif // WIDGET_H

3. widget.cpp

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);tcpServer = new QTcpServer(this);this->setWindowTitle("服務端");connect(tcpServer, SIGNAL(newConnection()), this, SLOT(mNewConnetion()));ui->pushButton_2->setEnabled(false);
}
Widget::~Widget()
{delete ui;
}
void Widget::mNewConnetion()
{QTcpSocket *tmpTcpSocket = tcpServer->nextPendingConnection();QString ipaddr = tmpTcpSocket->peerAddress().toString();quint16 port = tmpTcpSocket->peerPort();ui->textBrowser->append("服務端:客戶端的ip地址:" + ipaddr);ui->textBrowser->append("服務端:客戶端的端口:" + QString::number(port));connect(tmpTcpSocket, SIGNAL(readyRead()), this, SLOT(receiveMessages()));connect(tmpTcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),this, SLOT(mStateChanged(QAbstractSocket::SocketState)));
}
void Widget::receiveMessages()
{QTcpSocket *tmpTcpSocket = (QTcpSocket *)sender();ui->textBrowser->append("客戶端:" + tmpTcpSocket->readAll());
}
void Widget::mStateChanged(QAbstractSocket::SocketState state)
{QTcpSocket *tmpTcpSocket = (QTcpSocket *)sender();switch (state) {case QAbstractSocket::UnconnectedState:ui->textBrowser->append("服務端:客戶端斷開連接");tmpTcpSocket->deleteLater();break;case QAbstractSocket::ConnectedState:ui->textBrowser->append("服務端:客戶端已連接");break;default:break;}
}
void Widget::on_pushButton_3_clicked()
{QList <QTcpSocket *> socketList = tcpServer->findChildren<QTcpSocket *>();qDebug() << "tcpSocket 數量:" << socketList.count() << endl;if (socketList.count() == 0) {ui->textBrowser->append("當前沒有客戶端連接,請先與客戶端連接!");return;}foreach (QTcpSocket *tmpTcpSocket, socketList) {tmpTcpSocket->write(ui->lineEdit->text().toUtf8());}ui->textBrowser->append("服務端:" + ui->lineEdit->text());
}
void Widget::on_pushButton_clicked()
{tcpServer->listen(QHostAddress("192.168.1.59"), 9999);ui->textBrowser->append("服務端:監聽的ip地址和端口:192.168.1.59,9999");ui->pushButton_2->setEnabled(true);ui->pushButton->setEnabled(false);
}
void Widget::on_pushButton_2_clicked()
{tcpServer->close();ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(false);
}

五、客戶端核心代碼詳解(53目錄)

1. main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

2. widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QHostAddress>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
private:Ui::Widget *ui;           // UI指針QTcpSocket *tcpSocket;    // TCP客戶端對象
private slots:void receiveMessages();   // 接收消息槽void mStateChanged(QAbstractSocket::SocketState); // 連接狀態變化槽void on_pushButton_3_clicked(); // 發送消息按鈕槽void on_pushButton_clicked();   // 連接服務端按鈕槽void on_pushButton_2_clicked(); // 斷開連接按鈕槽
};
#endif // WIDGET_H

3. widget.cpp

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("客戶端");ui->pushButton_2->setEnabled(false);tcpSocket = new QTcpSocket(this);connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveMessages()));connect(tcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(mStateChanged(QAbstractSocket::SocketState)));
}
Widget::~Widget()
{delete ui;
}
void Widget::receiveMessages()
{ui->textBrowser->append("服務端:" + tcpSocket->readAll());
}
void Widget::mStateChanged(QAbstractSocket::SocketState state)
{switch (state) {case QAbstractSocket::UnconnectedState:ui->textBrowser->append("客戶端:與服務端斷開連接");ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(false);break;case QAbstractSocket::ConnectedState:ui->textBrowser->append("客戶端:已連接服務端");ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(true);break;default:break;}
}
void Widget::on_pushButton_3_clicked()
{if (tcpSocket->state() == QAbstractSocket::ConnectedState) {tcpSocket->write(ui->lineEdit->text().toUtf8());ui->textBrowser->append("客戶端:" + ui->lineEdit->text());} elseui->textBrowser->append("請先與服務端連接!");
}
void Widget::on_pushButton_clicked()
{ui->textBrowser->append("客戶端:監聽的ip地址和端口:192.168.1.59,9999");tcpSocket->connectToHost(QHostAddress("192.168.1.59"), 9999);
}
void Widget::on_pushButton_2_clicked()
{tcpSocket->disconnectFromHost();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95979.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神馬 M60S++ 238T礦機參數解析:高效SHA-256算法比拼

1. 算法與適用幣種神馬 M60S 238T采用SHA-256算法&#xff0c;適用于挖掘主流的加密貨幣&#xff0c;包括比特幣&#xff08;BTC&#xff09;和比特幣現金&#xff08;BCH&#xff09;。SHA-256&#xff08;安全哈希算法256位&#xff09;是一種廣泛應用于比特幣等加密貨幣挖礦…

[特殊字符] 深入理解操作系統核心特性:從并發到分布式,從單核到多核的全面解析

&#x1f680; 深入理解操作系統核心特性&#xff1a;從并發到分布式&#xff0c;從單核到多核的全面解析&#x1f4a1; 前言&#xff1a;操作系統是計算機的靈魂&#xff0c;它就像一個優秀的管家&#xff0c;協調著硬件和軟件之間的關系。今天&#xff0c;我們將深入探討操作…

人工智能機器學習——聚類

一、無監督學習(Unsupervised Learning)機器學習的一種方法&#xff0c;沒有給定事先標記過的訓練示例&#xff0c;自動對輸入的數據進行分類或分群。優點&#xff1a; 算法不受監督信息&#xff08;偏見&#xff09;的約束&#xff0c;可能考慮到新的信息不需要標簽數據&#…

優化MySQL分區表備份流程詳解

在大型數據驅動應用中&#xff0c;MySQL分區表是優化查詢和維護歷史的常見選擇。但隨之而來的數據備份問題卻讓許多開發者頭疼&#xff1a;如何確保分散在不同分區的數據能完整、一致地被備份&#xff0c;并在需要時快速恢復&#xff1f;手動處理不僅繁瑣&#xff0c;而且極易出…

用 Go + HTML 實現 OpenHarmony 投屏(hdckit-go + WebSocket + Canvas 實戰)

本文帶你用 Go HTML/WebSocket 從零實現一個 OpenHarmony 設備投屏 Demo&#xff1a;Go 側用 hdckit-go 連接設備并抓取屏幕幀&#xff08;UiDriver&#xff09;&#xff0c;通過 WebSocket 二進制實時推送到瀏覽器&#xff0c;前端用 Canvas 渲染&#xff0c;并根據設備分辨率…

運籌學——求解線性規劃的單純形法

單純形法的原理 先來舉個例子&#xff1a; 用單純形法求解下面線性規劃問題的最優解&#xff1a;注釋&#xff1a;解的過程是反復迭代的過程&#xff0c;如果第一次迭代沒有理解也沒關系&#xff0c;再繼續看第二次迭代&#xff0c;和第三次迭代&#xff0c;每次迭代的流程都是…

Python GUI 框架 -- DearPyGui 簡易入門

DearPyGui 關于 DPG 是一個簡單且功能強大的 Python 圖形用戶界面框架。 與其他Python圖形用戶界面庫相比&#xff0c;DPG具有以下獨特之處&#xff1a; GPU 渲染多線程高度可定制內置開發人員工具&#xff1a;主題檢查、資源檢查、運行時指標帶有數百種小部件組合的 70 多…

gcloud cli 使用 impersonate模擬 服務帳號

什么是模擬服務帳號 眾所周知&#xff0c; gcloud 登陸的方式有兩種 使用個人帳號&#xff0c; 通常是1個郵箱地址使用一個service account 通常是1個 json key 文件 所謂模式服務帳號意思就是&#xff0c; 讓操作人員用個人帳號登陸&#xff0c; 但是登陸后所有的操作都是基于…

idf--esp32的看門狗menuconfig

1.Interrupt Watchdog Timeout (ms)&#xff1a;意思是中斷看門狗&#xff0c;也就是專門監管中斷響應時間的看門狗&#xff0c;如果某個中斷服務程序超過了這個運行時間&#xff0c;就會導致程序重啟。2.紅框是任務看門狗的最大看門時間&#xff0c;超過時間就會警告&#xff…

git在Linux中的使用

git-Linux中的使用一、下載git二、https方式上傳三、ssh秘鑰方式上傳一、下載git 版本信息 [rootrocky ~]# cat /etc/rocky-release Rocky Linux release 9.4 (Blue Onyx) [rootrocky ~]# cat /etc/rocky-release-upstream Derived from Red Hat Enterprise Linux 9.4 [rootro…

HMI(人機界面)

新晉碼農一枚&#xff0c;小編定期整理一些寫的比較好的代碼&#xff0c;作為自己的學習筆記&#xff0c;會試著做一下批注和補充&#xff0c;轉載或者參考他人文獻會標明出處&#xff0c;非商用&#xff0c;如有侵權會刪改&#xff01;歡迎大家斧正和討論&#xff01;一、核心…

嵌入式解謎日志—多路I/O復用

多路 I/O復用&#xff08;Multiplexed I/O&#xff09;&#xff1a;1.定義&#xff1a;系統提供的I/O事件通知機制2.應用&#xff1a;是一種 I/O 編程模型&#xff0c;用于在單線程中同時處理多個&#xff08;阻塞&#xff09; I/O 操作&#xff0c;避免因等待某個 I/O 操作完成…

關于嵌入式學習——單片機4

ds18b20溫度傳感器的使用一、傳感器分類&#xff1a;數字溫度傳感器&#xff0c;實現簡單&#xff0c;不需要額外轉換電路&#xff0c;采集過來的就是數字溫度值模擬溫度傳感器->熱敏電阻->AD轉換電路->數字值二、傳感器接口&#xff1a;GPIO接口&#xff1a;&#xf…

Kali搭建sqli-labs靶場

1.輸入apt-get install docker.io即可下載靶場鏡像。 下載好后&#xff0c;我們輸入docker search sqli-labs搜索sqli-labs靶場。2.我們選擇第一個&#xff0c;輸入docker pull acgpiano/sqli-labs&#xff0c;將該靶場裝到本地。此時輸入docker images&#xff0c;發現本地有s…

電腦外接顯示屏字體和圖標過大

當外接顯示屏的分辨率過高時&#xff0c;可以調整顯示器設置來解決字體和圖標過大的問題。具體操作包括在桌面右擊選擇顯示設置&#xff0c;切換到外接顯示器&#xff0c;將分辨率調至推薦的1920x1080&#xff0c;或根據個人偏好進行適當調節&#xff0c;然后保存更改。 原因&a…

Linux 網絡流量監控 Shell 腳本詳解(支持郵件告警)

前言 一、腳本功能 二、實現原理 三、Shell 腳本實現 四、關鍵知識點解析 1. Bash 關聯數組 2. 命令組 { } 與子 Shell ( ) 3. 字符串拼接換行 4. 流量計算邏輯 五、測試方法 六、優化建議 七、總結 前言 在生產環境中&#xff0c;監控服務器的 網絡流量 非常重要…

【牛客刷題-劍指Offer】BM18 二維數組中的查找:一題四解,從暴力到最優

文章目錄 一、題目介紹 1.1 描述 1.2 示例1 1.3 示例2 1.4 給的部分代碼 二、題解 方法一:暴力遍歷 方法二:二分查找(逐行) 方法三:Z字形查找(最優解) 方法四:遞歸分治(拓展思路) 三、總結 心得體會 一、題目介紹 原題鏈接:https://www.nowcoder.com/practice/abc3…

使用pyspark對上百億行的hive表生成稀疏向量

背景&#xff1a;一張上百億行的hive表&#xff0c;只有id和app兩列&#xff0c;其中app的去重量是8w多個&#xff08;原app有上百萬枚舉值&#xff0c;此處已經用id數量進行過篩選&#xff0c;只留下有一定規模的app&#xff09;&#xff0c;id的去重量大概有八九億&#xff0…

【設計模式】關于學習《重學Java設計模式》的一些成長筆記

【設計模式】關于學習《重學Java設計模式》的一些成長筆記 沒有幾個人是一說就會的,掌握一些技能,不僅要用心,而且還需要從溫故中知新。 為此,好記性不如爛筆頭,我干脆一步一腳印地系統學習一遍設計模式! (關注不迷路哈!!!) 文章目錄 【設計模式】關于學習《重學Jav…

【基礎-判斷】@Entry裝飾的自定義組件將作為頁面的入口。在單個頁面中可以使用多個@Entry裝飾不同自定義組件。

@Entry裝飾的自定義組件將作為頁面的入口。在單個頁面中可以使用多個@Entry裝飾不同自定義組件。 解釋: @Entry 的核心作用與唯一性:@Entry 裝飾器用于明確聲明該組件是一個頁面的入口組件,即整個頁面的“根”和“起點”。當UIAbility實例加載并顯示頁面時,系統需要明確知道…