QT---day5,通信

1、思維導圖

?2、TCp

服務器
?

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
#include <QTcpServer>
#include <QList>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDebug>
#include <QTcpServer>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
 
class MyWidget : public QWidget
{
    Q_OBJECT
 
public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
 
private slots:
    //void on_pButton_clicked();
 
    void on_startbtn_clicked();
 
    void newConnect_slot();
 
    void readyRead_slot();
 
private:
    Ui::MyWidget *ui;
    QTcpServer *ser;
    QList<QTcpSocket *> cliList;      //客戶端容器鏈表
 
};
#endif // MYWIDGET_H
#include "mywidget.h"
#include "ui_mywidget.h"
 
 
 
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
 
 
    //1、給服務器指針實例化對象
    ser = new QTcpServer(this);
 
 
}
 
 
MyWidget::~MyWidget()
{
    delete ui;
}
 
 
//啟動按鈕對應的槽函數
void MyWidget::on_startbtn_clicked()
{
    if(ui->startbtn->text() == "啟動")
    {
        //獲取ui界面上的端口號
        quint16 port = ui->portEdit->text().toUInt();
 
 
 
 
        //啟動服務器
        //2、將服務器設置成被動監聽狀態
        if(ser->listen(QHostAddress::Any, port) == true)
        //參數1:監聽的ip地址,如果設置成Any,表示監聽所有類型的主機地址,也可以指定特定的主機地址進行監聽
        //參數2:端口號,如果設置為0,則讓系統自動分配一個端口號,如果使用具體的端口號,則需要指定
        {
            QMessageBox::information(this, "成功", "服務器啟動成功");
        }else
        {
            QMessageBox::information(this, "成功", "服務器啟動失敗");
        }
 
 
        //當啟動服務器后,如果有客戶端發來連接請求,那么該服務器就會自動發射一個newConnection信號
        //我們可以將該信號,連接到對應的槽函數中處理相關邏輯
        connect(ser, &QTcpServer::newConnection, this, &MyWidget::newConnect_slot);
 
 
 
 
        //將文本內容更改成 關閉
        ui->startbtn->setText("關閉");
    }else
    {
        //關閉服務器
        ser->close();        //關閉監聽
 
 
        //將文件內容更改成 啟動
        ui->startbtn->setText("啟動");
    }
}
 
 
//處理nY
void MyWidget::newConnect_slot()
{
    qDebug () <<"有新客戶端發來連接請求了,請盡快處理";
    //獲取最新連接的客戶端套接字,并將最新連接的套接字地址返回
    QTcpSocket* socket = ser->nextPendingConnection();
 
 
    //將該客戶端套接字放入到客戶端容器中
    cliList.append(socket);
 
 
    //當有客戶端向服務器發來數據時,當前這個客戶端套接字就會自動發射一個readyRead信號
    //我們可以將該信號連接到對應的信號處理函數中,處理相關數據
    connect(socket, &QTcpSocket::readyRead, this, &MyWidget::readyRead_slot);
 
 
}
 
 
//關于readyRead信號對應的槽函數的定義
void MyWidget::readyRead_slot()
{
    //判斷客戶端容器中,是否有已經退出的客戶端,或無效的客戶端,如果有,將其進行移除
    for(int i=0; i<cliList.length(); i++)
    {
        if(cliList[i]->state() == QTcpSocket::UnconnectedState)
        {//功能:判斷當前套接字的狀態
           //參數:無
           //返回值:readyRead_slot表示無效的套接字
           cliList.removeAt(i);           //將下標為i的客戶端套接字從容器中移除
        }
    }
 
 
    //再將客戶端容器遍歷一遍,判斷哪個客戶端中有數據待讀
    for(int i=0; i<cliList.length(); i++)
    {
        if(cliList[i]->bytesAvailable() != 0)
        {
            //功能:獲取當前套接字中待讀數據的個數
            //參數:無
            //返回值:返回套接字中待讀數據的個數,如果為0,表示沒有數據可讀
            //如果不等于0,表示有數據可讀,可以使用readAll讀取數據
            QByteArray msg = cliList[i]->readAll();
 
 
            //將該消息,展示到ui界面上
            ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
 
 
            //將該消息轉發給所有客戶端
            for(int j=0; j<cliList.length(); j++)
            {
                if(i!=j)        //不轉發給自己
                {
                    cliList[j]->write(msg);
                }
            }
        }
    }
}
 
 

?客戶端

?

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
 
class MyWidget : public QWidget
{
    Q_OBJECT
 
public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
 
private slots:
    void on_pushButton_clicked();
    void connnected_slot();
    void readyRead_slot();
 
 
private:
    Ui::MyWidget *ui;
    QTcpSocket *cli;          //定義客戶端指針
     QString userName;          //用戶名
};
#endif // MYWIDGET_H
 

?

#include "mywidget.h"
#include "ui_mywidget.h"
 
 
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
 
 
    //實例化一個客戶端對象
    cli = new QTcpSocket(this);
 
    connect(cli,&QTcpSocket::connected,this,&MyWidget::connnected_slot);
 
    connect(cli,&QTcpSocket::readyRead,this,&MyWidget::readyRead_slot);
 
    //將客戶端的connected信號連接到自定義的槽函數中
    connect(cli, &QTcpSocket::connected, this, &MyWidget::connnected_slot);
}
 
MyWidget::~MyWidget()
{
    delete ui;
}
 
 
 
 
 
//連接服務器按鈕對應的槽函數
void MyWidget::on_pushButton_clicked()
{
    if(ui->intobtn->text() == "連接服務器")
    {
        //執行連接服務器的工作
        //獲取ui界面上的數據
        userName = ui->userNameEdit->text();         //用戶名
        QString ip = ui->ipEdit_2->text();            //ip地址
        quint16 port = ui->portEdit->text().toUInt();   //端口號
 
 
        //向服務器發送連接請求
        cli->connectToHost(ip, port);
        //功能:向指定的服務器發送連接請求
        //參數1:服務器ip地址
        //參數2:服務器端口號
 
 
        //當成功連接服務器后,當前客戶端會自動發射一個connected的信號,我們可以將該信號連接到對應的槽函數中處理邏輯
        //由于該操作只需進行一次即可,所以寫在構造函數中即可
 
 
        //將按鈕內容更成 斷開服務器
        ui->intobtn->setText("斷開服務器");
    }else
    {
 
       QString msg = userName+":離開聊天室";
       cli->write(msg.toLocal8Bit());
 
        //執行斷開服務器工作
        cli->disconnectFromHost();
 
        //將按鈕內容更改成 連接服務器
         ui->intobtn->setText("連接服務器");
    }
}
 
//處理readyRead信號對應的槽函數的是實現
void MyWidget::readyRead_slot()
{
    QByteArray msg =cli->readAll();
 
    ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}
 
//自定義處理connnected信號的槽函數的實現
void MyWidget::connnected_slot()
{
    QMessageBox::information(this, "連接", "連接服務器成功!!!");
}
 

?

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

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

相關文章

鐳速實現利用Libarchive實現高效、智能的文件傳輸和管理

在前一篇報道中&#xff0c;我們闡述了Libarchive這一開源庫的強大功能&#xff0c;它專門用于處理歸檔文件。通過整合Libarchive&#xff0c;鐳速在包括Windows和Linux在內的多個操作系統上提供了在線解壓縮服務&#xff0c;為企業構建了一個既強大又安全的文件傳輸系統&#…

【代碼分享】使用HTML5的Canvas繪制編碼說明圖片

最急在工作中遇到一個需求&#xff0c;根據給定的編碼生成編碼說明&#xff0c;像下面這樣的效果。 不同含義的編碼用橫杠分割&#xff0c;然后每個編碼下面用箭頭指明具體的含義。下面是我使用canvas實現的代碼。具體的編碼寬度大家可以根據實際情況進行調整&#xff0c;目前…

Ranger 面試題及答案整理,最新面試題

Ranger 的安全模型是如何設計的&#xff1f; Ranger的安全模型設計主要基于訪問控制和安全策略的管理&#xff0c;它通過以下幾個關鍵組件實現&#xff1a; 1、策略管理&#xff1a; Ranger 提供了一個中央管理平臺&#xff0c;用于定義、更新和管理安全策略。這些策略根據資…

基于RT-Thread的HC-SR04超聲波驅動

前言 本次驅動用的是這款超聲波&#xff0c;超聲波的驅動大同小異&#xff0c;均可參考 一、引腳定義 引腳功能VCC接直流5V電TRIG接外部電路的TRIG端&#xff0c;向此引腳輸入10us以上的高電平可觸發超聲波測距ECHO接外部電路的ECHO端&#xff0c;測距結束時該引腳會輸出一…

Python框架Django入門教程

Django 是一個使用 Python 編程語言開發的、免費且開源的 Web 應用框架。它遵循 "DRY&#xff08;Dont Repeat Yourself&#xff09;" 原則&#xff0c;旨在簡化創建功能豐富的、高效率的 Web 網站。Django 提供了模型-視圖-控制器&#xff08;MVC&#xff09;架構的…

時尚圈的節制美學 — 奧柔拉 AVRALA的獨特設計理念

在這個多元化的時代&#xff0c;女性正在經歷一場前所未有的角色變革。她們不再僅僅滿足于傳統的社會角色&#xff0c;而是勇敢地追求個人職業發展和自我實現。在這樣的背景下&#xff0c;服飾不僅僅是外在的裝飾&#xff0c;更是內心故事的講述者、個性自我的表達者、身份歸屬…

KaiOS Data PDN 數據建立流程

代碼邏輯 APN創建 在 DataCallManager.jsm中,會對所有apnsetting創建一個datacall,其中會包含dataprofile的成員(通過apn參數來創建),在之后的流程用于直接發送到modem建立PDN。 PDN建立 1、DataCallManager.jsm -dcInterface.setupDataCall //RILNetworkInterface.c…

C語言內存泄漏及檢測方法

目錄 1. 內存泄漏概述 1.1 內存泄漏定義 1.2 內存泄漏的危害 1.3 內促泄漏的原因 2. C語言中的內存管理 2.1 C語言內存分配方式 2.2 C語言內存管理函數 2.3 動態內存管理注意事項 3. 內存泄漏的檢測與定位 3.1 內存泄漏檢測工具 3.2 內存泄漏定位方法 3.3 內存泄漏…

NX/UG二次開發—3D幾何—多邊形內部最大圓

多邊形內部最大圓&#xff0c;為什么不能說最大內切圓&#xff1f;如果正方形或正凸多邊形&#xff0c;最大內部圓是與邊相切的&#xff0c;但對于不規則多邊形&#xff0c;很多情況是正好經過一些凹點。 本次介紹在NX中計算封閉邊界內部最大圓&#xff1a; 1、首先按順序排序…

Spring、SpringMVC

一、Spring框架中的單例Bean是線程安全的嗎&#xff1f; 【默認單例的情況下】Spring Bean并沒有可變的狀態&#xff08;如Service類和DAO類&#xff09;&#xff0c;即只能查不能改&#xff0c;所以沒有并發問題&#xff0c;所以某種程度上來說Spring的單例Bean是線程安全的。…

【ZZULI數據結構實驗】壓縮與解碼的鑰匙:赫夫曼編碼應用

&#x1f4c3;博客主頁&#xff1a; 小鎮敲碼人 &#x1f49a;代碼倉庫&#xff0c;歡迎訪問 &#x1f680; 歡迎關注&#xff1a;&#x1f44d;點贊 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任爾江湖滿血骨&#xff0c;我自踏雪尋梅香。 萬千浮云遮碧…

Faiss原理及使用總結

Faiss&#xff08;Facebook AI Similarity Search&#xff09;是一個用于高效相似性搜索和密集向量聚類的庫。 一、原理 向量表示與相似度度量&#xff1a;在Faiss中&#xff0c;數據通常被表示為高維向量&#xff0c;這些向量可以來自深度學習模型的特征提取&#xff0c;也可…

2024-05-11 問AI:在深度學習中,學習率是什么

文心一言 在深度學習中&#xff0c;**學習率&#xff08;Learning Rate&#xff09;**是一個非常重要的超參數&#xff0c;它控制著模型在訓練過程中參數更新的步長。具體來說&#xff0c;學習率決定了在每次迭代&#xff08;或稱為一個epoch&#xff09;中&#xff0c;模型根…

前端工程化之包管理器

這里寫目錄標題 什么是包包管理工具常用的包管理工具npmnpm 基本使用初始化搜索工具包下載安裝包導入 npm 包基本流程生產依賴與開發依賴全局安裝安裝全部依賴安裝指定版本的包刪除依賴包 cnpm全局安裝nrm 的使用 yarn全局安裝yarn 常用命令 pnpm 【推薦使用】全局安裝 什么是包…

我國吻合器市場規模不斷擴大 國產化率有所增長

我國吻合器市場規模不斷擴大 國產化率有所增長 吻合器是替代手工切除或縫合的一種醫療器械&#xff0c;其工作原理與訂書機十分相似&#xff0c;可利用鈦釘對組織進行離斷或吻合。經過多年發展&#xff0c;吻合器種類逐漸增多&#xff0c;根據手術方式不同&#xff0c;吻合器大…

【JavaEE 初階(三)】多線程代碼案例

?博主主頁: 33的博客? ??文章專欄分類:JavaEE?? &#x1f69a;我的代碼倉庫: 33的代碼倉庫&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;關注我帶你了解更多線程知識 目錄 1.前言2.單例模式2.1餓漢方式2.2餓漢方式 3.阻塞隊列3.1概念3.2實現 4.定時器4.1概念4.…

支付寶小程序如何去除頁面下拉回彈

描述&#xff1a;支付寶小程序頁面下拉時會產生回彈&#xff0c;如果頁面上有拖拽功能&#xff0c;會有影響 解決方法&#xff1a; 頁面xx.config.js中設置&#xff1a;allowsBounceVertical: “NO” 官方文檔&#xff1a;https://opensupport.alipay.com/support/FAQ/7110b5d…

WT32-ETH01作為TCP Client進行通訊

目錄 模塊簡介WT32-ETH01作為TCP Client設置電腦作為TCP Server設置連接并進行通訊總結 模塊簡介 WT32-ETH01網關主要功能特點: 采用雙核Xtensa⑧32-bit LX6 MCU.集成SPI flash 32Mbit\ SRAM 520KB 支持TCP Server. TCP Client, UDP Server. UDP Client工作模式 支持串口、wif…

鴻蒙OpenHarmony技術:【Docker編譯環境】

Docker環境介紹 OpenHarmony為開發者提供了兩種Docker環境&#xff0c;以幫助開發者快速完成復雜的開發環境準備工作。兩種Docker環境及適用場景如下&#xff1a; 獨立Docker環境&#xff1a;適用于直接基于Ubuntu、Windows操作系統平臺進行版本編譯的場景。基于HPM的Docker環…