You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
2.6 KiB
C++
121 lines
2.6 KiB
C++
#include "WebServer.h"
|
|
#include <QtWebSockets/QWebSocketServer>
|
|
#include <QtWebSockets/QWebSocket>
|
|
#include <QDebug>
|
|
|
|
WebServer::WebServer(QObject *parent /*= nullptr*/)
|
|
{
|
|
qRegisterMetaType<QWebSocket*>("QWebSocket*");
|
|
m_pWebSocketServer = new QWebSocketServer(QStringLiteral("WebServer"), QWebSocketServer::NonSecureMode, this);
|
|
connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &WebServer::onNewConnection);
|
|
connect(m_pWebSocketServer, &QWebSocketServer::closed, this, &WebServer::closed);
|
|
}
|
|
|
|
WebServer::~WebServer()
|
|
{
|
|
m_pWebSocketServer->close();
|
|
qDeleteAll(m_clients.begin(), m_clients.end());
|
|
}
|
|
|
|
bool WebServer::openServer(int port, RecvFunc func)
|
|
{
|
|
if (!m_pWebSocketServer) {
|
|
return false;
|
|
}
|
|
if (func)
|
|
{
|
|
m_func = func;
|
|
}
|
|
if (m_pWebSocketServer->listen(QHostAddress::Any, port)) {
|
|
emit sgConnected(true);
|
|
return true;
|
|
}
|
|
else {
|
|
emit sgConnected(false);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool WebServer::closeServer()
|
|
{
|
|
if (m_pWebSocketServer)
|
|
{
|
|
m_pWebSocketServer->close();
|
|
emit sgConnected(false);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void WebServer::sendData(QByteArray data)
|
|
{
|
|
for (int n = 0; n < m_clients.size(); n++)
|
|
{
|
|
QWebSocket *pClient = m_clients[n];
|
|
if (pClient)
|
|
{
|
|
pClient->sendTextMessage(QString(data));
|
|
}
|
|
}
|
|
}
|
|
|
|
int WebServer::getCount() const
|
|
{
|
|
return m_clients.size();
|
|
}
|
|
|
|
Q_SLOT void WebServer::onNewConnection()
|
|
{
|
|
QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();
|
|
|
|
connect(pSocket, &QWebSocket::textMessageReceived, this, &WebServer::processTextMessage);
|
|
connect(pSocket, &QWebSocket::binaryMessageReceived, this, &WebServer::processBinaryMessage);
|
|
connect(pSocket, &QWebSocket::disconnected, this, &WebServer::socketDisconnected);
|
|
|
|
m_clients << pSocket;
|
|
QString peerIP = pSocket->peerAddress().toString();
|
|
int perPort = pSocket->peerPort();
|
|
emit sgClientInfo(peerIP, perPort, true);
|
|
}
|
|
|
|
Q_SLOT void WebServer::processTextMessage(QString message)
|
|
{
|
|
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
|
|
if (m_func)
|
|
{
|
|
m_func(pClient, message.toLatin1());
|
|
}
|
|
}
|
|
|
|
Q_SLOT void WebServer::processBinaryMessage(QByteArray message)
|
|
{
|
|
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
|
|
if (m_func)
|
|
{
|
|
m_func(pClient, message);
|
|
}
|
|
}
|
|
|
|
Q_SLOT void WebServer::socketDisconnected()
|
|
{
|
|
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
|
|
if (pClient) {
|
|
QString peerIP = pClient->peerAddress().toString();
|
|
int perPort = pClient->peerPort();
|
|
emit sgClientInfo(peerIP, perPort, false);
|
|
|
|
m_clients.removeAll(pClient);
|
|
pClient->deleteLater();
|
|
}
|
|
}
|
|
|
|
Q_SLOT void WebServer::closed()
|
|
{
|
|
if (m_pWebSocketServer)
|
|
{
|
|
m_pWebSocketServer->close();
|
|
emit sgConnected(false);
|
|
}
|
|
}
|
|
|