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.

146 lines
3.1 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);
}
}
/*
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const reqData = {
cmd: "AllClient",
content: {
// json<6F><6E>ַ
lib_url_req: '',
lib_id: '', // <20>㷨ʵ<E3B7A8><CAB5>id
"lib_name":"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>㷨ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"stationName":"",//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const resData = {
cmd: "AllClient",
content: {
lib_url_req: '',// <20><EFBFBD><E6B4A2>node<64><65><EFBFBD>㷨ʵ<E3B7A8><CAB5>json<6F><6E>ַ
lib_url_res: '',// <20><EFBFBD><E6B4A2>c++<2B><><EFBFBD>㷨ʵ<E3B7A8><CAB5>json<6F><6E>ַ
lib_id: '', // <20>㷨ʵ<E3B7A8><CAB5>id
"lib_name":"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>㷨ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"stationName":"",//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
}
}
*/