#include "WebsocketServer.h" #include "QtWebSockets/QWebSocketServer" #include "QtWebSockets/QWebSocket" #include #include "cstrapi.hxx" #include "appdoc.h" //! constructor WebsocketServer::WebsocketServer(quint16 port, QObject *parent) : QObject(parent), m_pWebSocketServer(Q_NULLPTR) { m_pWebSocketServer = new QWebSocketServer(QStringLiteral("Chat Server"), QWebSocketServer::NonSecureMode, this); if (m_pWebSocketServer->listen(QHostAddress::Any, port)) { qDebug() << "Chat Server listening on port" << port; connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &WebsocketServer::onNewConnection); } } //! 关闭服务 WebsocketServer::~WebsocketServer() { m_pWebSocketServer->close(); // delete model; // model =0; qDeleteAll(m_clientMap); } //! 创建连接 void WebsocketServer::onNewConnection() { QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection(); connect(pSocket, &QWebSocket::textMessageReceived, this, &WebsocketServer::processMessage); connect(pSocket, &QWebSocket:: textFrameReceived, this, &WebsocketServer::textFrameReceived); connect(pSocket, &QWebSocket::disconnected, this, &WebsocketServer::socketDisconnected); connect(pSocket, &QWebSocket::binaryMessageReceived, this, &WebsocketServer::binaryMessageReceived); AppDoc* doc =new AppDoc(); doc->OnNewDocument(); m_clientDocMap.insert(1,doc); AppView *view = new AppView(doc->GetHoopsModel(),NULL,"opengl"); view->Init(); view->Update(); m_clientMap.insert(1,view); AppDoc* doc2 =new AppDoc(); doc2->OnNewDocument(); m_clientDocMap.insert(2,doc2); AppView *view2 = new AppView(doc2->GetHoopsModel(),NULL,"opengl"); view2->Init(); view2->Update(); m_clientMap.insert(2,view2); } //! textFrameReceived void WebsocketServer::textFrameReceived(const QString &frame) { qDebug() << u8"收到消息" << frame; QWebSocket *pClient = qobject_cast(sender()); AppView *view = (AppView *)m_clientMap.value(1); AppModel* model= ((AppModel*)(view->GetModel())); HC_KEY model_key = view->GetModel()->GetModelKey(); HC_Open_Segment_By_Key(model_key); HC_Open_Segment(""); ENTITY_LIST entityList; BODY* sphere = NULL; api_solid_sphere(SPAposition(0, 0, 0), 1, sphere, NULL); entityList.add(sphere); HA_Render_Entities(entityList); model->AddAcisEntity(sphere); HC_Close_Segment(); HC_Close_Segment(); model->Write("E://1.png",view,1,400, 400); AppView *view2 = (AppView *)m_clientMap.value(2); AppModel* model2= ((AppModel*)(view2->GetModel())); HC_KEY model_key2 = view2->GetModel()->GetModelKey(); HC_Open_Segment_By_Key(model_key2); HC_Open_Segment("2"); ENTITY_LIST entityList2; BODY* sphere2 = NULL; api_solid_sphere(SPAposition(1, 0, 0), 1, sphere2, NULL); entityList2.add(sphere2); HA_Render_Entities(entityList2); model2->AddAcisEntity(sphere2); HC_Close_Segment(); HC_Close_Segment(); model2->Write("E://2.png",view,1,400, 400); } //! 发送二进制消息 发送给消息来源方 void WebsocketServer::binaryMessageReceived(const QByteArray &message) { QWebSocket *pSender = qobject_cast(sender()); pSender->sendBinaryMessage(message); } //! 发送文本消息 发送给消息来源方 void WebsocketServer::processMessage(QString message) { //获取当前信号槽 对应连接 sender() QWebSocket *pSender = qobject_cast(sender()); pSender->sendTextMessage(message); } //! 连接断开 void WebsocketServer::socketDisconnected() { QWebSocket *pClient = qobject_cast(sender()); if (pClient) { AppView *view = m_clientMap.value(1); // AppModel* model= ((AppModel*)(view->GetModel())); // delete model; // model =0; delete view; view = 0; m_clientMap.remove(1); AppDoc * doc = m_clientDocMap.value(1); delete doc; doc =0; m_clientDocMap.remove(1); AppView *view2 = m_clientMap.value(2); // AppModel* model= ((AppModel*)(view->GetModel())); // delete model; // model =0; delete view2; view2 = 0; m_clientMap.remove(2); AppDoc * doc2 = m_clientDocMap.value(2); delete doc2; doc2 =0; m_clientDocMap.remove(2); pClient->deleteLater(); } }