|
|
#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":"<22><><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>㷨ʵ<E3B7A8><CAB5><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":"<22><><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>㷨ʵ<E3B7A8><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
|
|
|
"stationName":"",//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|
|
}
|
|
|
}
|
|
|
*/
|