最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt TCP實現(xiàn)簡單通信功能

 更新時間:2022年08月22日 09:41:26   作者:xundao_803817  
這篇文章主要為大家詳細介紹了Qt TCP實現(xiàn)簡單通信功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Qt TCP實現(xiàn)簡單通信的具體代碼,供大家參考,具體內(nèi)容如下

在.pro文件中添加網(wǎng)絡(luò)模塊 Qt += network

服務(wù)端:

1. 創(chuàng)建QTcpServer 對象,用于監(jiān)聽,創(chuàng)建套接字等;

QTcpServer * serverSocket = new QTcpServer(this);

2.進行監(jiān)聽,通過QTcpServer對象 QTcpServer::listen();

bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);

例子:

// 獲取單行輸入框輸入的數(shù)為端口號
short port = ui->lineEdit->text().toInt();
tcpServer->listen(QHostAddress::Any, port); // QHostAddress::Any表示自動綁定

3.使用信號槽,connect(), 判斷是否有客戶端來連接,QTcpServer::newConnection();

[signal] void QTcpServer::newConnection()

例子:

// 3.基于 QTcpServer::newConnection() 信號檢測是否有新客戶端連接
connect(tcpServer, &QTcpServer::newConnection, this, [=]()
? ? {
? ? ? ? // 創(chuàng)建用于通信的套接字
? ? ? ? // 4.如果有新的客戶端連接調(diào)用 QTcpSocket* QTcpServer::nextPendingConnection()
? ? ? ? // 在通信編輯框中顯示成功與客戶端取得連接
? ? ? ? // 5.準(zhǔn)備與客戶端通信
? ? ? ? // 6.判斷客戶端是否斷開連接 ? ?
? ? });

4.在步驟3的基礎(chǔ)上,創(chuàng)建套接字,QTcpSocket socketServer = QTcpServer::nextPendingConnection();

5.在步驟3的基礎(chǔ)上,使用信號槽connect(),判斷是否接收客戶端發(fā)了 的信息QTcpSocket::readyRead();

6. 在步驟5的基礎(chǔ)上,通過套接字調(diào)用readAll() ,讀取客戶端發(fā)來的信息;

7.在步驟3的基礎(chǔ)上,通過套接字判斷客戶端是否下線,關(guān)閉套接字;

客戶端:

1. 創(chuàng)建套接字對象,用于通信 QTcpSocket *clientSocket = new QTcpSocket(this);

2. 調(diào)用信號槽,connect() ,判斷是否成功連接服務(wù)端connected;

3. 調(diào)用信號槽,connect() , 判斷是否接受來著服務(wù)端發(fā)來的信息 readyRead();

4. 在步驟3的基礎(chǔ)上,利用套接字對象調(diào)用readAll() 方法,讀取服務(wù)端發(fā)來的消息;

5. 利用套接字調(diào)用write() 方法,將消息發(fā)送給服務(wù)端;

6. 調(diào)用信號槽,connect() , 判斷是否斷開連接,釋放套接字;

服務(wù)端代碼:

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
?
#include "QDebug"
#include <QMessageBox>
?
MainWindow::MainWindow(QWidget *parent) :
? ? QMainWindow(parent),
? ? ui(new Ui::MainWindow)
{
? ? ui->setupUi(this);
?
? ? // 設(shè)置窗口名稱
? ? setWindowTitle(QString("Server-TCP"));
? ? setWindowIcon(QIcon(QPixmap("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本.png")));
?
? ? // 剛進來是將連接狀態(tài)圖片置成灰色的
? ? m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本_副本.png"));
?
? ? // 2.socket 通信
? ? //tcpSocket = new QTcpSocket();
? ? // 獲取套接字
? ? // 服務(wù)端通信流程
? ? // 1.創(chuàng)建套接字服務(wù)器 QTcpServer對象
? ? tcpServer = new QTcpServer(this);
? ? // 2.通過QTcpServer對象設(shè)置監(jiān)聽,即QTcpServer::listen()
? ? // 3.基于 QTcpServer::newConnection() 信號檢測是否有新客戶端連接
? ? connect(tcpServer, &QTcpServer::newConnection, this, [=]()
? ? {
? ? ? ? // 成功連接則切換圖片顏色
? ? ? ? m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本.png"));
?
? ? ? ? // 創(chuàng)建用于通信的套接字
? ? ? ? // 4.如果有新的客戶端連接調(diào)用 QTcpSocket* QTcpServer::nextPendingConnection()
? ? ? ? tcpSocket = tcpServer->nextPendingConnection();
? ? ? ? // 在通信編輯框中顯示成功與客戶端取得連接
? ? ? ? ui->textEdit->append("成功與客戶端取得連接!!!");
? ? ? ? // 5.準(zhǔn)備與客戶端通信
? ? ? ? connect(tcpSocket, &QTcpSocket::readyRead, this, [=]()
? ? ? ? {
? ? ? ? ? ? // 調(diào)用套接字讀取客戶端發(fā)的數(shù)據(jù)
? ? ? ? ? ? QString acceptText = tcpSocket->readAll(); // QByteArray 可以強制轉(zhuǎn)成 QString
? ? ? ? ? ? // 將讀取到的數(shù)據(jù)寫到通信編輯框中
? ? ? ? ? ? ui->textEdit->append("客戶端say:" + acceptText);
? ? ? ? });
?
? ? ? ? // 6.判斷客戶端是否斷開連接
? ? ? ? connect(tcpSocket, &QTcpSocket::disconnected, this, [=]()
? ? ? ? {
? ? ? ? ? ? //QMessageBox(, QMessageBox::Warning, );
? ? ? ? ? ? QMessageBox::warning(this, "連接狀態(tài)", "客戶端已斷開連接");
? ? ? ? ? ? tcpSocket->deleteLater();
? ? ? ? ? ? // 將連接狀態(tài)圖片置成灰色的
? ? ? ? ? ? m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本_副本.png"));
?
? ? ? ? ? ? //tcpServer->deleteLater();
? ? ? ? });
?
? ? });
?
? ? // 1.狀態(tài)欄顯示信息
? ? showMessageStatusBar();
}
?
MainWindow::~MainWindow()
{
? ? delete ui;
}
?
// 狀態(tài)欄添加提示信息
void MainWindow::showMessageStatusBar()
{
? ? // 設(shè)置窗口名稱
? ? //QWidget::windowTitleChanged("Server-TCP");
? ? //ui->statusBar->setWindowTitle();
?
? ? // 通過加載QLable給狀態(tài)欄顯示文本
? ? QLabel *pLable = new QLabel();
? ? QLabel *lableText = new QLabel(QString::fromUtf8("連接狀態(tài):"));
?
? ? //lableText->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
? ? //pLable->setMinimumWidth(this->width()/2);
?
? ? //= new QLabel(QString::fromUtf8("連接狀態(tài):"));
? ? // 設(shè)置lable標(biāo)簽的大小
? ? //pLable->setMinimumSize(pLable->sizeHint());
? ? pLable->setFixedSize(30, 30);
?
? ? m_pixmap.scaled(pLable->width(), pLable->height());
? ? // 顯示圖片
? ? pLable->setPixmap(m_pixmap);
? ? // 按比例縮小圖片
?
? ? //pLable->setFixedSize(QSize(50,50));
? ? // 設(shè)置狀態(tài)欄樣式
? ? //ui->statusBar->setStyleSheet(QString("QString::item{border:0px")); ?// 不顯示邊框
? ? // 將標(biāo)簽加入到狀態(tài)欄中
? ? ui->statusBar->addWidget(lableText);
? ? ui->statusBar->addPermanentWidget(pLable);//
}
?
// 處理點擊啟動服務(wù)器,進行監(jiān)聽
void MainWindow::on_pushButton_clicked()
{
? ? //qDebug() << "點擊了 啟動服務(wù)器按鈕\n";
? ? // 獲取輸入框輸入的數(shù)為端口號
? ? short port = ui->lineEdit->text().toInt();
? ? tcpServer->listen(QHostAddress::Any, port);
}
?
// 將數(shù)據(jù)發(fā)生給客戶端
void MainWindow::on_pushButton_2_clicked()
{
? ? // 將發(fā)送數(shù)據(jù)編輯欄的文本通過套接字發(fā)生給客戶端
? ? tcpSocket->write(ui->textEdit_2->toPlainText().toUtf8());
? ? // 需要將要發(fā)生的數(shù)據(jù)寫到通信編輯欄中
? ? ui->textEdit->append("服務(wù)端say:" + ui->textEdit_2->toPlainText().toUtf8());
? ? // 清空發(fā)送消息編輯框
? ? ui->textEdit_2->clear();
}

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
?
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
?
?
namespace Ui {
class MainWindow;
}
?
class MainWindow : public QMainWindow
{
? ? Q_OBJECT
?
public:
? ? explicit MainWindow(QWidget *parent = nullptr);
? ? ~MainWindow();
?
? ? // 在狀態(tài)欄中設(shè)置文本+圖標(biāo)
? ? void showMessageStatusBar();
?
? ? QTcpServer* tcpServer;
? ? QTcpSocket* tcpSocket;
?
private slots:
? ? void on_pushButton_clicked();
?
? ? void on_pushButton_2_clicked();
?
private:
? ? Ui::MainWindow *ui;
? ? // 用于加載圖片路徑
? ? QPixmap m_pixmap;
};
?
#endif // MAINWINDOW_H

程序UI

客戶端:

client.cpp

#include "client.h"
#include "ui_client.h"
?
Client::Client(QWidget *parent) :
? ? QMainWindow(parent),
? ? ui(new Ui::Client)
{
? ? ui->setupUi(this);
?
? ? // 通信流程
? ? //1、創(chuàng)建套接字對象
? ? clientSocket = new QTcpSocket(this);
? ? //2、調(diào)用QTcpSocket::connectToHost() 綁定服務(wù)端IP和端口
?
? ? //3、通過套接字與服務(wù)端進行通信 收發(fā)
? ? // 判斷是否成功連接服務(wù)端 開始讀取服務(wù)端發(fā)來的信息
? ? connect(clientSocket, &QTcpSocket::readyRead, this, [=]()
? ? {
? ? ? ? // 通過套接字讀取發(fā)來的信息
? ? ? ? QByteArray receiveAll = clientSocket->readAll();
? ? ? ? // 將獲取到的信息顯示到通信編輯欄中
? ? ? ? ui->textEdit_Record->append("服務(wù)端say:" + receiveAll);
? ? });
?
? ? // 開始的時候斷開連接按鈕置成不可用狀態(tài)
? ? ui->disConBtn->setEnabled(false);
?
? ? // 判斷是否連接成功
? ? connect(clientSocket, &QTcpSocket::connected, this, [=]()
? ? {
? ? ? ? // 將成功連接顯示到通信記錄編輯欄中
? ? ? ? ui->textEdit_Record->append("成功與服務(wù)端取得連接!!!");
? ? ? ? // 將斷開連接置成可用狀態(tài)
? ? ? ? ui->disConBtn->setEnabled(true);
? ? });
?
? ? // 判斷是否斷開連接
? ? connect(clientSocket, &QTcpSocket::disconnected, this, [=]()
? ? {
? ? ? ? // 將服務(wù)端斷開連接顯示到通信編輯框中
? ? ? ? ui->textEdit_Record->append("注意服務(wù)端已斷開連接!!!");
? ? ? ? // 將連接服務(wù)端按鈕置成不可用狀態(tài)
? ? ? ? ui->conBtn->setEnabled(false);
? ? });
?
}
?
Client::~Client()
{
? ? delete ui;
}
?
// 點擊按鈕連接服務(wù)器,綁定地址與端口
void Client::on_conBtn_clicked()
{
? ? // 獲取編輯框中的ip和端口
? ? unsigned short port = ui->lineEdit_port->text().toUShort();
? ? QString addr = ui->lineEdit_add->text();
? ? clientSocket->connectToHost(addr, port);
? ? // 需要將按鈕置成不可用狀態(tài)
? ? ui->conBtn->setEnabled(false);
}
?
// 斷開連接
void Client::on_disConBtn_clicked()
{
? ? //clientSocket->disconnected();
? ? // 關(guān)閉套接字
? ? clientSocket->close();
? ? // 將客戶端斷開連接提示顯示到通信編輯框中
? ? ui->textEdit_Record->append("注意客戶端已斷開連接!!!");
? ? // 將連接服務(wù)端按鈕置成可用狀態(tài)
? ? ui->conBtn->setEnabled(true);
}
?
// 點擊按鈕發(fā)送數(shù)據(jù)
void Client::on_sendBtn_clicked()
{
? ? // 獲取發(fā)送信息編輯框的文本
? ? //ui->textEdit_Send->toPlainText().toUtf8();
?
? ? // 將獲取到的信息發(fā)送給服務(wù)端
? ? clientSocket->write(ui->textEdit_Send->toPlainText().toUtf8());
? ? // 將發(fā)送的信息顯示到通信記錄編輯框中
? ? ui->textEdit_Record->append(ui->textEdit_Send->toPlainText().toUtf8());
? ? // 需要將發(fā)送編輯框清空緩存
? ? ui->textEdit_Send->clear();
}

client.h

#ifndef CLIENT_H
#define CLIENT_H
?
#include <QMainWindow>
#include <QTcpSocket>
?
namespace Ui {
class Client;
}
?
class Client : public QMainWindow
{
? ? Q_OBJECT
?
public:
? ? explicit Client(QWidget *parent = nullptr);
? ? ~Client();
?
private slots:
? ? void on_conBtn_clicked();
?
? ? void on_disConBtn_clicked();
?
? ? void on_sendBtn_clicked();
?
private:
? ? Ui::Client *ui;
?
? ? // 創(chuàng)建套接字
? ? QTcpSocket * clientSocket;
};
?
#endif // CLIENT_H

程序UI

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++運算符重載規(guī)則詳解

    C++運算符重載規(guī)則詳解

    這篇文章主要介紹了C++運算符重載規(guī)則詳解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)之?dāng)U展字符詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之?dāng)U展字符詳解

    掌握C語言數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵在于理解其核心概念,擴展字符作為其中的重要一環(huán),對于編程人員來說至關(guān)重要,本指南將為您深入剖析擴展字符的相關(guān)知識,帶您輕松掌握C語言數(shù)據(jù)結(jié)構(gòu),讓我們一起探索這個令人著迷的領(lǐng)域吧!
    2024-03-03
  • Qt中QZXing 的編譯與使用

    Qt中QZXing 的編譯與使用

    本文主要介紹了Qt中QZXing 的編譯與使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Linux中使用C語言實現(xiàn)基于UDP協(xié)議的Socket通信示例

    Linux中使用C語言實現(xiàn)基于UDP協(xié)議的Socket通信示例

    這篇文章主要介紹了Linux中使用C語言實現(xiàn)基于UDP協(xié)議的socket通信示例,服務(wù)器端與客戶端的功能都非常基礎(chǔ),需要的朋友可以參考下
    2016-03-03
  • C++控制臺繪圖頭文件實例代碼

    C++控制臺繪圖頭文件實例代碼

    控制臺(console)是電腦的最基本交互接口,通常包括鍵盤(keyboard)和屏幕(screen),下面這篇文章主要給大家介紹了關(guān)于C++控制臺繪圖頭文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • 如何用C++實現(xiàn)A*尋路算法

    如何用C++實現(xiàn)A*尋路算法

    尋路是游戲比較重要的一個組成部分。因為不僅AI還有很多地方(例如RTS游戲里操控人物點到地圖某個點,然后人物自動尋路走過去)都需要用到自動尋路的功能。本文將介紹一個經(jīng)常被使用且效率理想的尋路方法-A*尋路算法,并且提供額外的優(yōu)化思路
    2021-06-06
  • C++實現(xiàn)多線程并發(fā)場景下的同步方法

    C++實現(xiàn)多線程并發(fā)場景下的同步方法

    在C++中實現(xiàn)多線程并發(fā)場景下的同步方法,包括使用互斥鎖、獨占鎖、共享鎖和原子操作的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • C++實現(xiàn)停車場管理系統(tǒng)的示例代碼

    C++實現(xiàn)停車場管理系統(tǒng)的示例代碼

    停車場管理系統(tǒng)就是模擬停車場進行車輛管理的系統(tǒng),該系統(tǒng)分為汽車信息模塊,用戶使用模塊和管理員用戶模塊,本文將用C++實現(xiàn)這一簡單的系統(tǒng),希望對大家有所幫助
    2023-04-04
  • C++?opencv圖像處理實現(xiàn)圖片邊緣檢測示例

    C++?opencv圖像處理實現(xiàn)圖片邊緣檢測示例

    這篇文章主要為大家介紹了C++?opencv實現(xiàn)圖片邊緣檢測示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • C++實現(xiàn)LeetCode(67.二進制數(shù)相加)

    C++實現(xiàn)LeetCode(67.二進制數(shù)相加)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(67.二進制數(shù)相加),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

札达县| 宜城市| 常宁市| 福清市| 独山县| 秦皇岛市| 新丰县| 澎湖县| 乌拉特中旗| 盘锦市| 临沭县| 于都县| 日喀则市| 襄汾县| 七台河市| 定州市| 石阡县| 正安县| 神农架林区| 金昌市| 嘉祥县| 龙口市| 贵德县| 江西省| 谢通门县| 宜州市| 上饶市| 嵊州市| 丁青县| 凤阳县| 藁城市| 潜江市| 永修县| 德格县| 宣化县| 沂南县| 江孜县| 临泉县| 都昌县| 原阳县| 贺州市|