【QT】TCP、UDP通信

简介: 【QT】TCP、UDP通信

UDP、TCP

UDP

  • UDP(User Datagram Protocol,用户数据报协议)

UDP是一个轻量级、不可靠、面向数据报的、无连接的协议,多用与可靠性不严格,不是非常重要的传输。

QUdpSocket类继承自QAbstractSocket,用来发送和接收UDP数据报。

“Socket”即套接字,即IP地址+端口号。其中IP地址指定了网络中的一台主机,端口号则指定了该主机上的一个网络程序,使用套接字即可实现网络上的两个应用程序之间的通信。

QUdpSocket支持IPv4广播,要广播数据报,则只需要发送到一个特殊的地址,QHostAddress::Broadcast(255.255.255.255),数据报一般建议发送字节数小于512字节。端口号选择1024~65535(1024一下的常用作保留端口号,如FTP常用端口号21,Telnet常用端口号23,DNS域名服务器常用端口号53等)。


示例:

发送端

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_sender = new QUdpSocket(this);

}

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

void Widget::on_pushButton_clicked()
{
    QByteArray dataGram = ui->lineEdit->text().toUtf8();
    m_sender->writeDatagram(dataGram.data(),
                                dataGram.size(),
                                QHostAddress::Broadcast,
                                6666);
}

接收端

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_receiver = new QUdpSocket(this);
    //绑定
    m_receiver->bind(6666,QUdpSocket::ShareAddress);
    //有数据来了,就处理。
    connect(m_receiver,&QUdpSocket::readyRead,this,&Widget::processData);
}

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

void Widget::processData()
{
   //有未处理的数据报
   while(m_receiver->hasPendingDatagrams()){

        QByteArray dataGram;

        dataGram.resize(m_receiver->pendingDatagramSize());

        m_receiver->readDatagram(dataGram.data(),dataGram.size());

        ui->label_2->setText(dataGram);
     }
}
    

image-20220323121512761


TCP

  • TCP(Transmission Control Protocol,传输控制协议)

多个网络协议包括HTTP和FTP都是基于TCP协议,TCP是面向数据流和连接的可靠的传输协议。

QTcpSocket继承自QAbstractSocket,与QUdpSocket传输的数据报不同的是,QTcpSocket传输的是连续的数据流,尤其适合连续的数据传输,TCP一般分为客户端和服务端,即C/S(Client/Server)模型。

QTcpSocket代表了两个独立的数据流,一个用来读取数据,一个用来写入数据,分别采用QTcpSocket::read()及QTcpSocket::write()操作,读取数据前先调用QTcpSocket::bytesAvaliable来确定已有足够的数据可用。

QTcpServer处理客户端的连接,可通过QTcpServer::listen()监听客户端发来的连接请求,每当有客户端连接时会发射newConnection()信号,QTcpSocket可用于读取客户端发来的数据报,亦可以发送数据报。

示例:

客户端

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

const int gTcpPort = 8888;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_tcpSocket = new QTcpSocket(this);
    //收到数据开始处理
    connect(m_tcpSocket,&QTcpSocket::readyRead,
            this,&Widget::onReadMessage);

    connect(m_tcpSocket,SIGNAL(SocketError),
            this,SLOT(onDisplayError(QAbstractSocket::SocketError)));

    ui->hostLineEdit->setText("127.0.0.1");

    ui->portLineEdit->setText(QString::number(gTcpPort));
}

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

void Widget::onReadMessage(){
    QByteArray bt;

    bt.resize(m_tcpSocket->bytesAvailable());
    m_tcpSocket->read(bt.data(),bt.size());//读取到bt中

    ui->msgLabel->setText(bt);
}

void Widget::onDisplayError(QAbstractSocket::SocketError e){
    qDebug()<<"SocketError:"<<e<<endl
           <<m_tcpSocket->errorString();
}

void Widget::on_connectBtn_clicked()
{
    m_tcpSocket->abort();//终止
    //ip地址,端口
    m_tcpSocket->connectToHost(ui->hostLineEdit->text(),gTcpPort);//链接到主机

}

void Widget::on_sendBtn_clicked()
{
    m_tcpSocket->write(ui->sendLineEdit->text().toUtf8());
    m_tcpSocket->flush();//清空缓冲区
}

服务端

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_tcpServer = new QTcpServer(this);
    m_tcpSocket = new QTcpSocket(this);//保存链接进来的客户端

    //监听指定客户端发来的请求
    if(!m_tcpServer->listen(QHostAddress::Any,8888)){
        qDebug()<<m_tcpServer->errorString();
        close();
    }

    //有新的链接请求
    connect(m_tcpServer,&QTcpServer::newConnection,this,&Widget::onNewConnect);

    // 给链接的客户端反馈信息
    connect(m_tcpServer,&QTcpServer::newConnection,this,&Widget::onSendMessage);


}

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

void Widget::onNewConnect()
{

    m_tcpSocket = m_tcpServer->nextPendingConnection();//获取当前新来的链接

    //断开链接——销毁
    connect(m_tcpSocket,&QTcpSocket::disconnected,m_tcpServer,&QTcpSocket::deleteLater);

    //来消息后发送readyRead信号,与读取数据方法进行链接
    connect(m_tcpSocket,&QTcpSocket::readyRead,this,&Widget::onReadMessage);
}

void Widget::onSendMessage()
{
    QString str = "你好,client";
    m_tcpSocket->write(str.toUtf8());//写入socket
    ui->label->setText("发送数据成功!");


}

void Widget::onReadMessage()
{
    QByteArray bt = m_tcpSocket->readAll();
    ui->readLabel->setText(bt);
}

image-20220323215110060

相关文章
|
2月前
|
监控 网络协议 网络性能优化
不再困惑!一文搞懂TCP与UDP的所有区别
本文介绍网络基础中TCP与UDP的区别及其应用场景。TCP是面向连接、可靠传输的协议,适用于HTTP、FTP等需要保证数据完整性的场景;UDP是无连接、不可靠但速度快的协议,适合DNS、RIP等对实时性要求高的应用。文章通过对比两者在连接方式、可靠性、速度、流量控制和数据包大小等方面的差异,帮助读者理解其各自特点与适用场景。
|
2月前
|
存储 网络协议 安全
用于 syslog 收集的协议:TCP、UDP、RELP
系统日志是从Linux/Unix设备及网络设备生成的日志,可通过syslog服务器集中管理。日志传输支持UDP、TCP和RELP协议。UDP无连接且不可靠,不推荐使用;TCP可靠,常用于rsyslog和syslog-ng;RELP提供可靠传输和反向确认。集中管理日志有助于故障排除和安全审计,EventLog Analyzer等工具可自动收集、解析和分析日志。
175 2
|
3月前
|
网络协议 网络性能优化 数据处理
深入解析:TCP与UDP的核心技术差异
在网络通信的世界里,TCP(传输控制协议)和UDP(用户数据报协议)是两种核心的传输层协议,它们在确保数据传输的可靠性、效率和实时性方面扮演着不同的角色。本文将深入探讨这两种协议的技术差异,并探讨它们在不同应用场景下的适用性。
117 4
|
3月前
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
102 3
|
3月前
|
网络协议 算法 网络性能优化
|
3月前
|
网络协议 SEO
TCP连接管理与UDP协议IP协议与ethernet协议
TCP、UDP、IP和Ethernet协议是网络通信的基石,各自负责不同的功能和层次。TCP通过三次握手和四次挥手实现可靠的连接管理,适用于需要数据完整性的场景;UDP提供不可靠的传输服务,适用于低延迟要求的实时通信;IP协议负责数据包的寻址和路由,是网络层的重要协议;Ethernet协议定义了局域网的数据帧传输方式,广泛应用于局域网设备之间的通信。理解这些协议的工作原理和应用场景,有助于设计和维护高效可靠的网络系统。
74 4
|
3月前
|
缓存 负载均衡 网络协议
面试:TCP、UDP如何解决丢包问题
TCP、UDP如何解决丢包问题。TCP:基于数据块传输/数据分片、对失序数据包重新排序以及去重、流量控制(滑动窗口)、拥塞控制、自主重传ARQ;UDP:程序执行后马上开始监听、控制报文大小、每个分割块的长度小于MTU
|
9月前
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
163 4
|
监控 网络协议 网络架构
IP协议【图解TCP/IP(笔记九)】
IP协议【图解TCP/IP(笔记九)】
185 0
|
域名解析 网络协议
IP协议, TCP协议 和DNS 服务分别是干什么的?
大家好,我是阿萨。昨天讲解了网络四层协议[TCP/IP协议族分为哪4层?]今天我们学习下IP 协议, TCP 协议和DNS 协议分别是干什么的。
343 0
IP协议, TCP协议 和DNS 服务分别是干什么的?