目录
0.概述
- 要使用Qt中有关网络编程的API,需要添加
network
模块
1.UDP Socket
1.核心API概览
- 主要的类有两个:
QUdpSocket
和QNetworkDatagram
QUdpSocket
表⽰⼀个UDP的socket⽂件 -bind(const QHostAddress&, quint16)
:绑定指定的端口号 - 成员方法- 对应原生API:bind()
-receiveDatagram()
:返回QNetworkDatagram
,读取⼀个UDP数据报 - 成员方法- 对应原生API:recvfrom()
-writeDatagram(const QNetworkDatagram&)
:发送⼀个UDP数据报 - 成员方法- 对应原生API:sendto()
-readyRead()
:在收到数据并准备就绪后触发 - 信号- 类似于IO多路复用的通知机制QNetworkDatagram
表⽰⼀个UDP数据报 -QNetworkDatagram(const QByteArray&, const QHostAddress&, quint16)
: - 通过QByteArray
,⽬标IP地址,⽬标端⼝号构造⼀个UDP数据报- 通常⽤于发送数据时-data()
:获取数据报内部持有的数据,返回`QByteArray-senderAddress()
:获取数据报中包含的对端的IP地址-senderPort()
:获取数据报中包含的对端的端⼝号
2.回显服务器
- ⼀般来说,要先连接信号槽,再绑定端⼝ - 如果顺序反过来,可能会出现端⼝绑定好了之后,请求就过来了,此时还没来得及连接信号槽,那么这个请求就有可能错过了
- 示例:
// 构造函数中{ socket =newQUdpSocket(this);connect(socket,&QUdpSocket::readyRead,this,&Widget::ProcessRequest);// 绑定端口号.if(!socket->bind(QHostAddress::Any,2333)){// 绑定失败!QMessageBox::critical(this,"服务器启动出错", socket->errorString());return;}}voidWidget::ProcessRequest(){// 1. 读取请求并解析.const QNetworkDatagram& req = socket->receiveDatagram(); QString request = req.data();// 2. 根据请求计算响应const QString& response =Process(request);// 3. 把响应写回给客户端. QNetworkDatagram resp(response.toUtf8(), req.senderAddress(), req.senderPort()); socket->writeDatagram(resp);// 把这次交互的信息, 显示到界面上. QString log ="["+ req.senderAddress().toString()+":"+QString::number(req.senderPort())+"] req: "+ request +", resp: "+ response; ui->listWidget->addItem(log);}QString Widget::Process(const QString &request){return request;}
3.回显客户端
// 构造函数中{
socket =newQUdpSocket(this);// 通过信号槽, 来处理服务器返回的数据.connect(socket,&QUdpSocket::readyRead,this,&Widget::ProcessResponse);}voidWidget::on_pushButton_clicked(){// 1. 获取到输入框的内容const QString& text = ui->lineEdit->text();// 2. 构造 UDP 的请求数据
QNetworkDatagram req(text.toUtf8(),QHostAddress(SERVER_IP), SERVER_PORT);// 3. 发送请求数据
socket->writeDatagram(req);// 4. 把发送的请求也添加到列表框中.
ui->listWidget->addItem("客户端说: "+ text);// 5. 把输入框的内容也清空一下.
ui->lineEdit->setText("");}// 通过这个函数来处理收到的响应voidWidget::ProcessResponse(){// 1. 读取到响应数据const QNetworkDatagram& resp = socket->receiveDatagram();
QString response = resp.data();// 2. 把响应数据显示到界面上.
ui->listWidget->addItem("服务器说: "+ response);}
本文转载自: https://blog.csdn.net/qq_37281656/article/details/141263364
版权归原作者 DieSnowK 所有, 如有侵权,请联系我们删除。
版权归原作者 DieSnowK 所有, 如有侵权,请联系我们删除。