[英]Server Sent Events (SSE) with Qt
不幸的是,我已經看到了幾個用於服務器發送事件的庫,而不是Qt。 我還查看了SSE(僅是純HTTP)的規范,似乎在Qt中實現SSE需要:
application/events-stream
data : {...}
) 我不確定它是否那么“簡單”? 我錯過了什么?
我使用Qt和服務器發送事件創建了一個小型演示。 該演示連接到給定的EventSource URL(第一個參數),並將每個事件打印到命令行。
Qt開箱即用地支持SSE,因為SSE是純HTTP,並在其頂部具有重新連接層。
text/event-stream
接受標頭,允許重定向,禁用緩存。 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;
}
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()));
}
readAll
讀取它。 每個成功事件后,我們都會重試重試計數器。 void Network::Manager::streamReceived()
{
qDebug() << "Received event from stream";
qDebug() << QString(m_reply->readAll()).simplified().replace("data: ", "");
qDebug() << "-----------------------------------------------------";
m_retries = 0;
}
finished()
信號。 我們嘗試重新連接到事件源(在創建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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.