1. 程式人生 > >WebSocket簡單的斷開重連線--Qt

WebSocket簡單的斷開重連線--Qt

前言

WebSocket 是一個基於 Web 的協議,旨在使 client 應用程式和遠端主機之間進行雙向通訊。如果最初的握手成功,則兩個實體可以來回傳送資料。WebSocket 是通過用更少的網路延遲和最小資料交換來努力獲取實時資料的應用程式解決方案。

在專案中使用WebSocket,一般建立的是長連結,而為了實現實時資料的交流,則需要雙方一直連線,即使中途發生意外,也需再次連線。故在此介紹一下自動連線的思路。

思路介紹

為了實現自動連線,我通過一個定時器,當斷開一小段時間,然後再次嘗試連線;如果成功則結束,若失敗則重複上述步驟。若長時間沒連線上,可停止嘗試,通知服務檯,當可以時,可請求主動連線。。只不過我考慮到如果頻繁的請求連線,可能誤認為攻擊,故我將其每次失敗後再次嘗試連線的時間段加長。

程式碼示例

.h檔案

private slots:
    void onConnected();
    void onDisconnected();
    void reconnect();
    void on_disconnectButton_clicked();
    void on_connectButton_clicked();

private:
    QWebSocket* m_pWebSocket;
    QTimer* m_pTimer;

.cpp檔案

構建函式中初始化,並連線

    m_pTimer=new QTimer(this);

    m_pWebSocket=new QWebSocket;
    QUrl url("ws://121.40.165.18:8800");
    m_pWebSocket->open(url);

    connect(m_pWebSocket,SIGNAL(connected()),this,SLOT(onConnected()));
    connect(m_pWebSocket,SIGNAL(disconnected()),this,SLOT(onDisconnected()));
    connect(m_pTimer,SIGNAL(timeout()),this,SLOT(reconnect()));

一系列連線、斷開、重連 訊號槽

void MainWindow::onConnected()
{
    QString text=ui->textBrowser->toPlainText();
    text+="connect successful\n";
    ui->textBrowser->setText(text);
    delaySec=1;
    m_pTimer->stop();
}

void MainWindow::onDisconnected()
{
    QString text=ui->textBrowser->toPlainText();
    text+="disconnected\n";
    ui->textBrowser->setText(text);

    m_pTimer->start(delaySec*1000);
    delaySec<<=1;
    if(delaySec>60){
        m_pTimer->stop();
        delaySec=1;
        QMessageBox::information(this,QStringLiteral("websocket連線狀態"),
                                 QStringLiteral("無法連線webscoket,請聯絡後臺!"));

    }
}

void MainWindow::reconnect()
{
    QString text=ui->textBrowser->toPlainText();
    text+="reconnect\n";
    ui->textBrowser->setText(text);

    m_pWebSocket->abort();
    m_pWebSocket->open(QUrl("ws://121.40.165.18:8800"));
}

void MainWindow::on_disconnectButton_clicked()
{
    QString text=ui->textBrowser->toPlainText();
    text+="request disconnect\n";
    ui->textBrowser->setText(text);

    m_pWebSocket->close();
}

void MainWindow::on_connectButton_clicked()
{
    reconnect();
}

效果圖

由於,網上給的websocket的介面,肯定沒問題,所以這個效果也不是很明顯,但流程很清晰。

結束語

處於不同的境界,看到不同的層面,我現在就是這個感覺。加油ヾ(◍°∇°◍)ノ゙