#pragma once #include #include #include #include "JDefines.h" #include "JTerminal.h" #include "JConfig.h" //#include "WebSocketFrame.h" //#include "UdpServer.h" namespace Incart::Net::WebSockets { class WebSocketServer : public QObject { Q_OBJECT const bool MYDEBUG = false; protected: // const QtMsgType MT; QWebSocketServer* m_pWebSocketServer; QMap m_clients; // UnPacking& m_unpack; // WebSocketFrame& m_frame; public: // WebSocketServer(QObject *parent = nullptr) : QObject(parent) {} WebSocketServer(/*WebSocketFrame& frame,*/ quint16 port, QObject* parent = nullptr) : QObject(parent) // , m_unpack(up) // , m_frame(frame) { Init(port); } void Init(quint16 port) { Common::JT() << __FUNCTION__; // настройка устройства // QVariantList channel_names = JConfig::getRg("Cannals").toList(); // QVariantList markers_names = JConfig::getRg("Markers").toList(); // int cannals = channel_names.size(); // int markers = markers_names.size(); // m_unpack = new UnPacking(cannals,markers); // m_frame = new WebSocketFrame(channel_names, markers_names, m_unpack); m_pWebSocketServer = new QWebSocketServer("WebSocketServer",QWebSocketServer::NonSecureMode,this); if (m_pWebSocketServer->listen(QHostAddress::Any, port)) //LocalHost { Common::JTerminal(JCL_GREEN) << __FUNCTION__ << "listen ..." << port << m_pWebSocketServer->serverUrl(); connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &WebSocketServer::slotNewConnection); connect(m_pWebSocketServer, &QWebSocketServer::closed, this, &WebSocketServer::slotClosed); } else { Common::JTerminal(JCL_YELLOW) << __FUNCTION__ << "listen error" << port; } } ~WebSocketServer() { Common::JT() << __FUNCTION__; m_pWebSocketServer->close(); QList list = m_clients.keys(); for (QWebSocket* client : list) { m_clients.remove(client); client->deleteLater(); } } signals: public slots: void slotClosed() { Common::JTerminal() << __FUNCTION__; //!! я не знаю, когда это возникает } void slotNewConnection() { QWebSocket* client = m_pWebSocketServer->nextPendingConnection(); connectMessageListener(client); connect(client, &QWebSocket::disconnected, this, &WebSocketServer::socketDisconnected); m_clients[client] = true; //false; Common::JTerminal() << __FUNCTION__ << m_clients.size() << client; } void socketDisconnected() { QWebSocket* client = qobject_cast(sender()); if ( client != nullptr ) { m_clients.remove(client); client->deleteLater(); } Common::JTerminal() << __FUNCTION__ << m_clients.size() << client; } void slotMessageReceived(QString msg) { QWebSocket* client = qobject_cast(sender()); Common::JT() << __FUNCTION__ << client << msg; /* // затычка client->sendTextMessage(m_frame.exeInit()); // передаем кадр инициализации m_clients[client] = true; // устанавливаем статус клиента */ } void slotTransfer(QByteArray _data) { //JT() << __FUNCTION__; //QByteArray data = m_frame.exeView(_data); // перепаковываем из кадров АЦП в json кадры визуализатора for (QWebSocket* client : m_clients.keys()) { if (m_clients[client]) { client->sendBinaryMessage(_data); //client->sendTextMessage(_data); } } } protected: virtual void connectMessageListener(QWebSocket* client) { connect(client, &QWebSocket::textMessageReceived, this, &WebSocketServer::slotMessageReceived); } }; } // namespace Incart::Net::WebSockets