gpt4 book ai didi

qt - 使用 Qt 的服务器发送事件 (SSE)

转载 作者:行者123 更新时间:2023-12-02 17:01:00 25 4
gpt4 key购买 nike

我已经看到了几个用于服务器发送事件的库,不幸的是,不是用于 Qt 的。我还查看了 SSE 的规范(只是简单的 HTTP),似乎在 Qt 中实现 SSE 需要:

  • 在流模式下使用 QNetworkAccessManager(下载)
  • 接受SSE的内容类型头:application/events-stream
  • 连接丢失或关闭时重新连接
  • 当接收到新字节时,将一个插槽附加到 QNAM(检查 data : {...})

不知道是不是这么“简单”?我错过了什么吗?

最佳答案

我用 Qt 和服务器发送的事件创建了一个小演示。该演示连接到给定的 EventSource URL(第一个参数)并将每个事件打印到命令行。

Qt 开箱即用地支持 SSE,因为 SSE 是纯 HTTP,其上有一个重新连接层。

  1. 准备请求:设置 text/event-stream 接受 header ,允许重定向,禁用缓存。
QNetworkRequest Network::Manager::prepareRequest(const QUrl &url)
{
QNetworkRequest request(url);
request.setRawHeader(QByteArray("Accept"), QByteArray(ACCEPT_HEADER));
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); // Events shouldn't be cached
return request;
}
  1. readyRead 信号连接到插槽。
void Network::Manager::getResource(const QUrl &url)
{
qDebug() << "GET resource:" << url;
QNetworkRequest request = this->prepareRequest(url);
m_reply = this->QNAM()->get(request);
connect(m_reply, SIGNAL(readyRead()), this, SLOT(streamReceived()));
}
  1. 每次 QNetworkAccessManager 接收到新事件时,您都可以使用 readAll 读取它。我们会在每次成功的事件后重置重试计数器。
void Network::Manager::streamReceived()
{
qDebug() << "Received event from stream";
qDebug() << QString(m_reply->readAll()).simplified().replace("data: ", "");
qDebug() << "-----------------------------------------------------";
m_retries = 0;
}
  1. 万一我们丢失连接或连接超时,finished() 信号将被 QNetworkAccessManager 触发。我们尝试重新连接到事件源(我们在创建 QNetworkAccessManager 实例时将此插槽连接到信号):
void Network::Manager::streamFinished(QNetworkReply *reply)
{
qDebug() << "Stream finished:" << reply->url();
qDebug() << "Reconnecting...";
if(m_retries < MAX_RETRIES) {
m_retries++;
this->getResource(reply->url());
}
else {
qCritical() << "Unable to reconnect, max retries reached";
}
}

您可以在此处找到演示:https://github.com/DylanVanAssche/Qt-Server-Sent-Events-Demo

关于qt - 使用 Qt 的服务器发送事件 (SSE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54170742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com