QT的TCP与UDP通信
1.TCP
TCP通信是基于握手实现的,数据传输相对较为可靠,但实时性较UDP差一些。
2.UDP
UDP通信是基于不可靠实现的,数据传输没有TCP那么靠谱,尽最大能力交付,实时性较好。
两者各有优点和不足,废话不多说,上代码
下面是重点 工程的结构如下。 工程中的UI文件如下
1.在QT的工程文件[.pro]里面加入network,如下所示。整个工程文件就改变这一处,其它代码为自动生成,此处不贴出占据版面
QT += core gui network
2.widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QUdpSocket>
#include <QHostAddress>
#include <QDebug>
#include <QTimer>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QUdpSocket *USocket;
QTcpSocket *TSocket;
QTimer *myTimer;
void dealUdpData(QByteArray array);
public slots:
void readTcpData();
void readUdpData();
private slots:
void on_sendData_clicked();
void timerSend();
void on_sendData_2_clicked();
private:
Ui::Widget *ui;
};
#endif
2.widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
myTimer = new QTimer(this);
TSocket = new QTcpSocket(this);
TSocket->connectToHost("127.0.0.1", 3081);
USocket = new QUdpSocket(this);
USocket->bind(QHostAddress::AnyIPv4, 3080);
connect(TSocket, &QTcpSocket::readyRead, this, &Widget::readTcpData);
connect(USocket, &QUdpSocket::readyRead, this, &Widget::readUdpData);
connect(myTimer, &QTimer::timeout, this, &Widget::timerSend);
myTimer->start(1000);
}
Widget::~Widget()
{
delete ui;
}
void Widget::dealUdpData(QByteArray array)
{
if(array[0]==0xFD && array[1]==0x2A)
{
qDebug()<<"接收正确";
}
else
{
qDebug()<<"接收错误";
}
}
void Widget::readTcpData()
{
QByteArray tcpData = TSocket->readAll();
if(tcpData.at(0)==0x01 && tcpData.at(1)==0x02)
{
qDebug()<<"报文1段";
if(tcpData.at(2)==0x03)
{
qDebug()<<"接收";
}
else if(tcpData.at(2)==0x04)
{
qDebug()<<"发送";
}
}
else if(tcpData.at(0)==0x01 && tcpData.at(1)==0x03)
{
qDebug()<<"报文2段";
}
}
void Widget::readUdpData()
{
QByteArray array;
while(USocket->hasPendingDatagrams())
{
array.resize(USocket->pendingDatagramSize());
USocket->readDatagram(array.data(), array.size());
if(array.size()>0)dealUdpData(array);
}
}
void Widget::on_sendData_clicked()
{
QString msg = "ABC-123";
QByteArray array1;
array1.resize(4);
array1[0]=0xFD;array1[1]=0x2C;array1[2]=0x02;array1[3]=0x02;
QByteArray bytes = msg.toUtf8();
if(TSocket->waitForConnected()) {
TSocket->write(array1);
}
}
void Widget::timerSend()
{
QByteArray array;
array.resize(4);
for(int i=0;i<array.size();i++)
array[i]=0;
array[0]=0xFD;array[1]=0x2C;array[2]=0x01;array[3]=0x01;
if(TSocket->waitForConnected()) {
TSocket->write(array);
}
}
void Widget::on_sendData_2_clicked()
{
QByteArray array;
array.resize(5);
for(int i=0;i<array.size();i++)
array[i]=0x09+i;
USocket->writeDatagram(array, QHostAddress("127.0.0.1"), 3082);
}
3.main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
整个界面非常简单,就是两个消息发送按钮。 如果不想自己新建项目,也可以直接用我的,下面就是下载链接,设置了两个积分,没有积分的联系我免费发送。 https://download.csdn.net/download/weixin_43552197/82743548
|