日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【QT实现TCP和UDP协议通信(一)】

發(fā)布時間:2024/3/12 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【QT实现TCP和UDP协议通信(一)】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

QT實現(xiàn)TCP和UDP協(xié)議通信(一)

編程環(huán)境 :Windows10 x64 下 QtCreator
語言 :C++
作者 :wddkxg
時間 :2022.4.24
項目 :Server + Client

**Server(服務器端)**

1.創(chuàng)建新項目 選擇Qt Widget Application即可 。

2.項目工程文件中(.pro)加入 QT += network

3.引入頭文件<QTcpServer> , <QTcpSocket> , <QUdpSocket>

4.ui界面設計 可以設計的相對簡單 。 一個lineEdit 用于輸入端口號,一個lineEdit 用于顯示連接狀態(tài),兩個RadioButton為選擇協(xié)議, 一個PushButton 為偵聽按鈕 ,再加上一個TextEdit用于顯示信息文本 ![Server的ui設計圖](https://img-blog.csdnimg.cn/bb11ee85d58b4ad4939c91197222af98.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YeR5puc5pel44Gu5paw5oGS,size_12,color_FFFFFF,t_70,g_se,x_16#pic_center)

5.Server需要的幾個功能:偵聽端口、創(chuàng)建連接、讀取數(shù)據(jù)(分為TCP和UDP協(xié)議) 對應的槽函數(shù)為: void on_pushButton_listen_clicked();//TCP偵聽 void server_new_connect(); //創(chuàng)建新連接 void socket_read_data();//TCP讀取緩沖區(qū)數(shù)據(jù) void read_data();//UDP讀取緩沖區(qū)數(shù)據(jù)

6.創(chuàng)建對象: QUdpSocket *uServer;//UDP套接字對象 QTcpServer *mServer; QTcpSocket *mSocket;//TCP套接字對象

7.源碼: server.h #ifndef SERVER_H #define SERVER_H#include <QMainWindow> #include<QTcpServer> #include<QTcpSocket> #include<QUdpSocket>namespace Ui { class Server; }class Server : public QMainWindow {Q_OBJECTpublic:Server(QWidget *parent = nullptr);~Server();private slots:void on_pushButton_listen_clicked();//TCP偵聽void server_new_connect(); //創(chuàng)建新連接void socket_read_data();//TCP讀取緩沖區(qū)數(shù)據(jù)void read_data();//UDP讀取緩沖區(qū)數(shù)據(jù)void on_comboBox_currentIndexChanged();//界面轉(zhuǎn)換private:Ui::Server *ui;QUdpSocket *uServer;//UDP套接字對象QTcpServer *mServer;QTcpSocket *mSocket;//TCP套接字對象int i1,i2;int j1,j2; }; #endif // SERVER_H

server.cpp

/******************************************************************************************/ /* 服務端 */ /* 2022.03.02 */ /* wddkxg */ /* v1.0 */ /******************************************************************************************/#include "server.h" #include "ui_server.h"/*構造函數(shù)*/ Server::Server(QWidget *parent): QMainWindow(parent), ui(new Ui::Server) {ui->setupUi(this);ui->portEdit->setText("8080");//默認端口號為8080mServer = new QTcpServer();//初始化TCP對象connect(mServer,&QTcpServer::newConnection,this,&Server::server_new_connect);//初始化表格行列計數(shù)變量i1 = 0;j1 = 0;i2 = 0;j2 = 0;uServer = new QUdpSocket(this); //初始化UDP對象uServer->bind(QHostAddress("10.0.0.58"),8080);//綁定ip地址和端口號connect(uServer,SIGNAL(readyRead()),this,SLOT(read_data()));//連接信號槽 }/*UDP讀取緩沖數(shù)據(jù)*/ void Server::read_data() {if(ui->radioButton_UDP->isChecked())//判斷是否勾選UDP協(xié)議{qDebug()<<"recv_UDP";QByteArray arr;//創(chuàng)建QByteArray對象存儲緩沖區(qū)數(shù)據(jù)arr.resize(uServer->bytesAvailable());//設置字符串大小uServer->readDatagram(arr.data(),arr.size());//讀取緩沖區(qū)數(shù)據(jù)qDebug()<<uServer->readDatagram(arr.data(),arr.size());QString str ;//創(chuàng)建QString對象用于進行緩沖數(shù)據(jù)的處理str.prepend(arr);//QByteArray轉(zhuǎn)QStringqDebug()<<"str="<<str;if(ui->comboBox->currentText() == "DataA")//處理為DataA數(shù)據(jù)類型{ui->stackedWidget->setCurrentIndex(0);qDebug()<<str.section(' ',0,0);ui->table_output_A->item(i2,j2)->setText(str.section(' ',0,j2));j2++;qDebug()<<str.section(' ',1,1);ui->table_output_A->item(i2,j2)->setText(str.section(' ',1,j2));j2++;qDebug()<<str.section(' ',2,2);ui->table_output_A->item(i2,j2)->setText(str.section(' ',2,j2));i2++;j2=0;}else//處理為DataB數(shù)據(jù)類型{ui->stackedWidget->setCurrentIndex(1);ui->table_output_B->item(i2,j2++)->setText(str.section(' ',0,0));ui->table_output_B->item(i2,j2++)->setText(str.section(' ',1,1));i2++;j2=0;}}}/*析構函數(shù)*/ Server::~Server() {uServer->close();uServer->deleteLater();mServer->close();mServer->deleteLater();delete ui; } /*TCP偵聽*/ void Server::on_pushButton_listen_clicked() {if(ui->pushButton_listen->text() == QString::fromLocal8Bit("偵聽")){int port = ui->portEdit->text().toInt();if(!mServer->listen(QHostAddress("10.0.0.58"),port))//判斷偵聽本機端口和地址是否成功{ui->portEdit_state->setText(QString::fromLocal8Bit("偵聽失敗!"));//偵聽失敗qDebug()<<mServer->errorString();return;}ui->pushButton_listen->setText(QString::fromLocal8Bit("取消偵聽"));//改變按鍵功能ui->portEdit_state->setText(QString::fromLocal8Bit("偵聽成功!"));//偵聽成功qDebug()<<"Listen successful!";}else//偵聽失敗{mSocket->abort();//銷毀TCP套接字對象mServer->close();ui->portEdit_state->setText(QString::fromLocal8Bit("偵聽失敗!"));//返回偵聽失敗ui->pushButton_listen->setText(QString::fromLocal8Bit("偵聽"));//改變按鍵功能} }/*連接新用戶*/ void Server::server_new_connect() {mSocket = mServer->nextPendingConnection();QObject::connect(mSocket,&QTcpSocket::readyRead,this,&Server::socket_read_data);//連接函數(shù)槽ui->portEdit_state->setText(QString::fromLocal8Bit("連接成功!")); // ui->table_output_A->clear(); // ui->table_output_B->clear();qDebug()<<"A client connect!"; }/*接收數(shù)據(jù)*/ void Server::socket_read_data() {if(ui->radioButton_TCP->isChecked()){QString str= mSocket->readAll();qDebug()<<"recv_TCP";if(ui->comboBox->currentText() == "DataA")//判斷下拉選項的數(shù)據(jù)類型{ui->stackedWidget->setCurrentIndex(0);//切換為dataA數(shù)據(jù)格式表ui->table_output_A->item(i1,j1++)->setText(str.section(' ',0,0));ui->table_output_A->item(i1,j1++)->setText(str.section(' ',1,1));ui->table_output_A->item(i1,j1++)->setText(str.section(' ',2,2));i1++;j1=0;}else{ui->stackedWidget->setCurrentIndex(1);//切換為data數(shù)據(jù)格式表ui->table_output_B->item(i1,j1++)->setText(str.section(' ',0,0));ui->table_output_B->item(i1,j1++)->setText(str.section(' ',1,1));i1++;j1=0;}}} /*下拉框?qū)崿F(xiàn)dataA與dataB數(shù)據(jù)結(jié)構表的切換*/ void Server::on_comboBox_currentIndexChanged() {if(ui->comboBox->currentText() == "DataA")//判斷選定數(shù)據(jù)類型ui->stackedWidget->setCurrentIndex(0);elseui->stackedWidget->setCurrentIndex(1); }

mian2.cpp

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

8.以上為接收端(服務器端)設計方案。

總結(jié)

以上是生活随笔為你收集整理的【QT实现TCP和UDP协议通信(一)】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。