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++

#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);
}
}