【QT实现TCP和UDP协议通信(一)】
生活随笔
收集整理的這篇文章主要介紹了
【QT实现TCP和UDP协议通信(一)】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
QT實現TCP和UDP協議通信(一)
編程環境 :Windows10 x64 下 QtCreator
語言 :C++
作者 :wddkxg
時間 :2022.4.24
項目 :Server + Client
server.cpp
/******************************************************************************************/ /* 服務端 */ /* 2022.03.02 */ /* wddkxg */ /* v1.0 */ /******************************************************************************************/#include "server.h" #include "ui_server.h"/*構造函數*/ 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);//初始化表格行列計數變量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讀取緩沖數據*/ void Server::read_data() {if(ui->radioButton_UDP->isChecked())//判斷是否勾選UDP協議{qDebug()<<"recv_UDP";QByteArray arr;//創建QByteArray對象存儲緩沖區數據arr.resize(uServer->bytesAvailable());//設置字符串大小uServer->readDatagram(arr.data(),arr.size());//讀取緩沖區數據qDebug()<<uServer->readDatagram(arr.data(),arr.size());QString str ;//創建QString對象用于進行緩沖數據的處理str.prepend(arr);//QByteArray轉QStringqDebug()<<"str="<<str;if(ui->comboBox->currentText() == "DataA")//處理為DataA數據類型{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數據類型{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;}}}/*析構函數*/ 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);//連接函數槽ui->portEdit_state->setText(QString::fromLocal8Bit("連接成功!")); // ui->table_output_A->clear(); // ui->table_output_B->clear();qDebug()<<"A client connect!"; }/*接收數據*/ void Server::socket_read_data() {if(ui->radioButton_TCP->isChecked()){QString str= mSocket->readAll();qDebug()<<"recv_TCP";if(ui->comboBox->currentText() == "DataA")//判斷下拉選項的數據類型{ui->stackedWidget->setCurrentIndex(0);//切換為dataA數據格式表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數據格式表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;}}} /*下拉框實現dataA與dataB數據結構表的切換*/ void Server::on_comboBox_currentIndexChanged() {if(ui->comboBox->currentText() == "DataA")//判斷選定數據類型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.以上為接收端(服務器端)設計方案。
總結
以上是生活随笔為你收集整理的【QT实现TCP和UDP协议通信(一)】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hive Later View用法
- 下一篇: STM32之UART