簡體   English   中英

Qt服務器發送事件(SSE)

[英]Server Sent Events (SSE) with Qt

不幸的是,我已經看到了幾個用於服務器發送事件的庫,而不是Qt。 我還查看了SSE(僅是純HTTP)的規范,似乎在Qt中實現SSE需要:

  • 在流模式下使用QNetworkAccessManager(下載)
  • 接受SSE的內容類型標頭: application/events-stream
  • 連接斷開或關閉時重新連接
  • 收到新的字節后,將插槽附加到QNAM(檢查data : {...}

我不確定它是否那么“簡單”? 我錯過了什么?

我使用Qt和服務器發送事件創建了一個小型演示。 該演示連接到給定的EventSource URL(第一個參數),並將每個事件打印到命令行。

Qt開箱即用地支持SSE,因為SSE是純HTTP,並在其頂部具有重新連接層。

  1. 准備請求:設置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;
}
  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. 如果我們丟失了連接或連接超時,則將觸發QNetworkAccessManager的finish 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM