#include "CWebsocketProc.h" #include #include #include #include "CCommonTools.h" #include "CAppInfo.h" #include "logproc.h" std::shared_ptr g_websocketPtr; CWebsocketProc::CWebsocketProc() { m_sToken = ""; m_nTimeOutTimes = 0; m_nTimeOutLimit = 4; m_nTimeOutSecord = 30; m_bConnected = false; m_pWebsocket = new QWebSocket; m_isExitClosed = false; QSslConfiguration config = m_pWebsocket->sslConfiguration(); config.setPeerVerifyMode(QSslSocket::VerifyNone); config.setProtocol(QSsl::TlsV1SslV3); m_pWebsocket->setSslConfiguration(config); m_pTime = new QTimer; connect(m_pTime, &QTimer::timeout, this, &CWebsocketProc::reconnect); connect(m_pWebsocket, &QWebSocket::disconnected, this, &CWebsocketProc::onDisconnected); bool ret = connect(m_pWebsocket, &QWebSocket::textMessageReceived, this, &CWebsocketProc::onTextReceived); ret = connect(m_pWebsocket, &QWebSocket::connected, this, &CWebsocketProc::onConnected); } CWebsocketProc::~CWebsocketProc() { m_pWebsocket->errorString(); m_pWebsocket->close(); RELEASE_PTR(m_pWebsocket); m_pTime->stop(); RELEASE_PTR(m_pTime); } void CWebsocketProc::setUrl(QString sUrl, QString sToken, QString sKey) { m_sUrl = sUrl; m_sToken = sToken; m_sKey = sKey; } void CWebsocketProc::open() { m_isExitClosed = false; if(!m_sUrl.isEmpty()) { QUrl url(m_sUrl); QUrlQuery urlQuery; urlQuery.addQueryItem("key", m_sKey); urlQuery.addQueryItem("token", m_sToken); url.setQuery(urlQuery); qDebug()<open(url); m_pTime->start(m_nTimeOutSecord*1000); myServerLog()<stop(); m_bConnected = false; // m_pWebsocket->abort(); m_pWebsocket->close(); } bool CWebsocketProc::isConnected() { return m_bConnected; } qint64 CWebsocketProc::sendText(QString sText) { if(m_bConnected) { // QByteArray data = sText.remove(QRegExp("\\s")).toLatin1(); qDebug()<sendTextMessage(sText); } else { return 0; } } //断开连接会触发这个槽函数 void CWebsocketProc::onDisconnected() { qDebug() << m_pWebsocket->errorString(); m_bConnected = false; if(!m_isExitClosed) { m_pTime->start(m_nTimeOutSecord*1000); emit networkWeak(); } qDebug()<<"Websocket Disconnected"; myServerLog() <<"Websocket Disconnected"; } //连接成功会触发这个槽函数 void CWebsocketProc::onConnected() { m_bConnected = true; m_nTimeOutTimes = 0; m_pTime->stop(); emit connected(); qDebug()<<"Websocket Connected"; myServerLog()<<"Websocket Connected"; } //收到服务发来的消息会触发这个槽函数 void CWebsocketProc::onTextReceived(QString msg) { try { qDebug()<<"recv:"<stop(); } catch (std::exception &e) { emit websocketError(QString::fromLocal8Bit("接收数据出错:%1").arg(e.what())); } } //断开连接会启动定时器,触发这个槽函数重新连接 void CWebsocketProc::reconnect() { m_nTimeOutTimes++; if(m_nTimeOutTimes > m_nTimeOutLimit) { emit clientOffLine(); return; } else { emit networkWeak(); } m_bConnected = false; m_pWebsocket->abort(); open(); }