QT的网络编程:TCP、UDP

TCP

TCP套接字操作流程,图片来源

TCP编程需要用到俩个类:QTcpServer和QTcpSocket

目标:完成一个TCP服务器和一个客户端。

要使用一个类,一个是需要添加配置文件,一个是添加头文件

实现效果

服务器

1、监听端口等待连接、断开连接

连接成功时会自动触发newConnection()信号

复制代码
tcpServer:这是一个指向QTcpServer对象的指针,用于监听和接受来自客户端的连接。
listen(QHostAddress::Any, ui->portEdit->text().toUInt()):这个函数调用使tcpServer开始监听所有可用的网络接口(QHostAddress::Any)上的指定端口
c 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    tcpServer=new QTcpServer(this);
    tcpScoket=new QTcpSocket(this);

    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_SLOT()));
}
复制代码
tcpScoket=tcpServer->nextPendingConnection():当有新的客户端连接时,nextPendingConnection()函数返回一个指向新连接的QTcpSocket
对象的指针,并将其赋值给tcpScoket成员变量。这样,你就可以使用这个QTcpSocket对象与客户端进行通信了。

connect(tcpScoket, SIGNAL(readyRead()), this, SLOT(readyRead_SLOT())):这个函数调用建立了一个信号和槽之间的连接。当tcpScoket有
数据可读时(即客户端发送了数据),它会发出readyRead()信号。这个信号被连接到Widget类的readyRead_SLOT()槽函数上,所以当信号发
出时,readyRead_SLOT()函数会被调用以处理接收到的数据。
c 复制代码
//监听端口等待连接 、关闭连接
void Widget::on_openBt_clicked()
{
    tcpServer->listen(QHostAddress::Any,ui->portEdit->text().toUInt());
}
void Widget::newConnection_SLOT()
{
    tcpScoket=tcpServer->nextPendingConnection();
    connect(tcpScoket,SIGNAL(readyRead()),this,SLOT(readyRead_SLOT()));
}

断开连接

c 复制代码
void Widget::on_closeBt_clicked()
{
    tcpServer->close();
    QMessageBox::information(this,"连接","关闭");
}
2、接收数据
c 复制代码
void Widget::readyRead_SLOT()
{
    QString Buf=tcpScoket->readAll();
    ui->receiveEdit->appendPlainText(Buf);
}
3、发送数据
c 复制代码
void Widget::on_sendBt_clicked()
{
    tcpScoket->write(ui->SendEdit->text().toLocal8Bit().data());
}

客户端

1、连接和断开

连接至主机,连接成功会自动触发connected()信号,断开则会触发disconnected() 信号

c 复制代码
//连接
void Widget::on_openBT_clicked()
{
    tcpSocket->connectToHost(ui->ipEdit->text(),ui->portEDIT->text().toUInt());
    connect(tcpSocket,SIGNAL(connected()), SLOT(connected_SLOT()));
}
//断开
void Widget::on_closeBT_clicked()
{
   tcpSocket->close();
}
2、接收数据

连接成功后后关联readyRead()信号,一旦触发,接收数据并显示

c 复制代码
void Widget::connected_SLOT()
{
    connect(tcpSocket,SIGNAL(readyRead()), SLOT(readyRead_SLOT()));
}
//接收数据
void Widget::readyRead_SLOT()
{
    QString Buf= tcpSocket->readAll();
    ui->receiveEDIT->appendPlainText(Buf);
}
3、发送数据

注意数据转换

复制代码
ui->sendEdit->text():这个函数调用获取了 sendEdit 组件中的文本内容,类型为  QString 。
toLocal8Bit():这个函数将  QString  对象转换为 QByteArray 对象,使用本地编码(通常是UTF-8)。这是因为网络传输需要字节数据,而不是文本字符串。
data():QByteArray 的 data() 函数返回一个指向字节数组数据的指针,这个指针可以直接被 QTcpSocket 的 write 函数使用。
c 复制代码
void Widget::on_sendBT_clicked()
{
    tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}

UDP

网络调试助手

利用网络调试助手检查程序有无问题

1、绑定端口、断开

c 复制代码
void Widget::on_openBt_clicked()
{
    if(udpScoket->bind(ui->localportEdit->text().toUInt())==true){
        QMessageBox::information(this,"连接","成功");//绑定端口
    }else {
        QMessageBox::information(this,"连接","失败");
    }
    connect(udpScoket,SIGNAL(readyRead()), SLOT(readyRead_SLOT()));
}

void Widget::on_closeBt_clicked()
{
    udpScoket->close();
    QMessageBox::information(this,"连接","断开");
}

2、接收数据

c 复制代码
void Widget::readyRead_SLOT()
{
    while (udpScoket->hasPendingDatagrams()) {
        QByteArray array;
        array.resize(udpScoket->pendingDatagramSize());
        udpScoket->readDatagram(array.data(),array.size());

        QString Buf;
        Buf=array.data();
        ui->receiveEdit->appendPlainText(Buf);
    }
}

3、发送数据

c 复制代码
void Widget::on_sendBt_clicked()
{
    quint16 port;
    QString sendBuff;
    QHostAddress address;

    port=ui->aimportEdit->text().toUInt();
    sendBuff=ui->sendEdit->text();
    address.setAddress(ui->ipEdit->text());

    udpScoket->writeDatagram(sendBuff.toLocal8Bit().data(),sendBuff.length(),address,port);
}
相关推荐
fiveym43 分钟前
二层核心网络技术通俗解析(VLAN/Access/Trunk/LACP/ARP)
服务器·网络·网络协议
草木深雨纷纷1 小时前
mt管理器手机版下载2026最新版更新下载分享
linux·运维·网络·智能手机
lifejump1 小时前
Dede(织梦)CMS渗透测试(all)
前端·网络·安全·web安全
SEO_juper1 小时前
谷歌本地 GEO 权重拆解,全域 SEO 落地实操
大数据·网络·ai·seo·跨境电商·geo·跨境电商独立站
BY组态1 小时前
Ricon组态系统实战:从0到1搭建工业监控平台
网络·物联网·iot·web组态·组态
专注VB编程开发20年2 小时前
Vscode调试是真不方便
网络·网络协议
Yang96112 小时前
鼎讯 CM-K60 光缆普查仪:铁路高速光缆识别利器
网络
Qt程序员3 小时前
突破I/O天花板:Linux零拷贝技术
网络·linux内核·io·linq·零拷贝·mmap
HackTwoHub3 小时前
AI提示词注入绕过工具:一键绕过Codex/Claude安全限制,CTF夺旗与渗透测试必备神器
网络·人工智能·安全·web安全·系统安全·网络攻击模型·安全架构
sensen_kiss3 小时前
CAN302 Technologies for E-Commerce 电子商务技术 Pt.8 网络安全(Secure the Web)
网络·学习·安全·web安全