当前位置:   article > 正文

QT之UDP通信_qudpsocket发送文件内容数据

qudpsocket发送文件内容数据

简介

UDP和TCP的区别:
Tcp协议在进行通信之前需要进行三次握手来建立连接,因此Tcp协议是可靠的传输,而udp协议不需要连接便可以传输数据,因此是不可靠的传输,但是udp的效率更高。因此在选择用哪种协议进行通信时可以根据自己的需求来选择,当对通信的安全性要求非常高时,应该采用Tcp协议;而对于安全性要求不是很高时,可以采用Udp通信。而现在大多数都是结合这两种协议使用。

UDP通信中分为三种通信方式,分别是单播,组播和广播,这里主要介绍单播通信。

首先要在工程的pro文件中加上网络模块

QT       +=network
  • 1

并且加上进行Udp通信需要的头文件

#include<QUdpSocket>
  • 1

然后进行ui界面的设计,由于是双向发送,发送和接收端的ui界面一样
在这里插入图片描述
其中ip为接收端的ip地址,端口为接收端的端口

发送数据

(1)创建套接字

QUdpSocket *socket1;
socket1=new QUdpSocket(this);
  • 1
  • 2

(2)发送数据到指定的ip地址和端口号,用信号和槽实现
writeDatagram()函数即为QT中发送数据报文函数,函数原型为:
qint64 writeDatagram(QByteArray &datagram, QHostAddress &host, quint16 port)
其中,第一个参数是要发送的消息;第二个参数是接收端的ip地址;第三个参数是接收端的端口号,一定要和接收端端口号一致,否则接收端接收不到消息

void MainWindow::on_pushButton_clicked()
{
    QString str=ui->lineEdit->text();
    //qint16 port=ui->lineEdit_2->text().toUInt();
    socket2->writeDatagram(ui->textEdit_2->toPlainText().toUtf8(),QHostAddress(str),6677);
    ui->textEdit_2->clear();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

接收数据

(1)创建套接字

QUdpSocket *socket2;
socket2=new QUdpSocket(this);
  • 1
  • 2

(2)绑定地址和端口号

socket1->bind(QHostAddress::AnyIPv4,port);
  • 1

(3)等待数据的到来

connect(socket1,&QUdpSocket::readyRead,this,&MainWindow::readData);
  • 1

(4)读取数据,利用信号和槽实现

void MainWindow::readData()
{
    QByteArray array;
    QHostAddress address;
    quint16 port;
    array.resize(socket1->bytesAvailable());
    //读取数据在array中
    socket1->readDatagram(array.data(),array.size(),&address,&port);
    //将发送的数据添加在原数据后面
    QString str=ui->textEdit->toPlainText().toUtf8();
    str+=array;
    ui->textEdit->setText(str);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

至此,发送和接受的基本步骤已经完成,实验的效果如下:
在这里插入图片描述

可以看出,两个端口之间实现了互相通信功能

需要注意的是端口1的端口号为:6679,因此端口2发送数据时,应该发送至6679,即如下所示:

socket1->writeDatagram(ui->textEdit_2->toPlainText().toUtf8(),QHostAddress(ip),6679);
  • 1

在实验的过程中,需要注意的几点:

(1)由于实现的是两个端口之间互相发送数据,因此对于每个端口都应该建立两个套接字 ,即socket1,socket2。一个用来接收数据,一个用来发送数据。
(2)端口1发送时的端口号,即writeDatagram()内写的端口号要和接收端绑定的端口号一致,否则数据发送出错。

源代码
端口1

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QUdpSocket>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void readData();

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QUdpSocket *socket1;  //用于接收数据
    QUdpSocket *socket2;  //用于发送数据

};
#endif // MAINWINDOW_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QString>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("端口1");
    socket1=new QUdpSocket(this);
    socket2=new QUdpSocket(this);
    ui->lineEdit_2->setText("6679");
    qint16 port=ui->lineEdit_2->text().toInt();
    bool result=socket1->bind(QHostAddress::AnyIPv4,port);
    if(!result)
    {
        qDebug()<<"绑定失败"<<endl;
    }
    connect(socket1,&QUdpSocket::readyRead,this,&MainWindow::readData);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::readData()
{
    QByteArray array;
    QHostAddress address;
    quint16 port;
    array.resize(socket1->bytesAvailable());
    //读取数据在array中
    socket1->readDatagram(array.data(),array.size(),&address,&port);
    //将发送的数据添加在原数据后面
    QString str=ui->textEdit->toPlainText().toUtf8();
    str+=array;
    ui->textEdit->setText(str);
}

void MainWindow::on_pushButton_clicked()
{
    QString str=ui->lineEdit->text();
    //qint16 port=ui->lineEdit_2->text().toUInt();
    socket2->writeDatagram(ui->textEdit_2->toPlainText().toUtf8(),QHostAddress(str),6677);
    ui->textEdit_2->clear();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

端口2
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QUdpSocket>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void readData();

private:
    Ui::MainWindow *ui;
    QUdpSocket *socket1;  //用于发送数据
    QUdpSocket *socket2;  //用于接收数据
};
#endif // MAINWINDOW_H

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QString>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("端口2");
    socket1=new QUdpSocket(this);
    socket2=new QUdpSocket(this);
    ui->lineEdit_2->setText("6677");
    qint16 port1=ui->lineEdit_2->text().toInt();
    socket2->bind(QHostAddress::AnyIPv4,port1);
    connect(socket2,&QUdpSocket::readyRead,this,&MainWindow::readData);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//发送数据
void MainWindow::on_pushButton_clicked()
{
    QString ip=ui->lineEdit->text();
    //qint16 port=ui->lineEdit_2->text().toInt();
    //QString str=ui->textEdit_2->toPlainText().toUtf8();
    //其中ui->textEdit_2->toPlainText()为要发送的数据,将其转换为toUtf8(),
    ///QHostAddress(ip)为接收端的ip地址
    ///port,端口号,要和接收端一致
    socket1->writeDatagram(ui->textEdit_2->toPlainText().toUtf8(),QHostAddress(ip),6679);
    ui->textEdit_2->clear();   //清空已经发送的数据
}

void MainWindow::readData()
{
    QByteArray array;
    QHostAddress address;
    qint16 port;
    array.resize(socket2->bytesAvailable());
    socket2->readDatagram(array.data(),array.size(),&address);
    QString str=ui->textEdit->toPlainText().toUtf8();
    str+=array;
    ui->textEdit->setText(str);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/305239
推荐阅读
相关标签
  

闽ICP备14008679号