/
seneka.y
/
ClientServer
Обзор
Документация
Войти
/
seneka.y
/
ClientServer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
server/server.cpp
89 строк
3 KB
Julia Sinika
Initial commit
09 ноя 2025, 22:05
09 ноя 2025, 22:05
bfef146
Код
Авторство
О чём код?
#include "server.h" #include "clientworker.h" #include <QDebug> #include <QThread> #include <QTimer> Server::Server(QObject* parent) : QObject(parent) { m_tcpServer = new QTcpServer(this); connect(m_tcpServer, &QTcpServer::newConnection, this, &Server::onNewConnection); qInfo() << "Server initialized"; } Server::~Server() { qInfo() << "Server shutdown"; const QList<QThread*> threads = m_workerThreads; for (QThread* thread : threads) { if (thread && thread->isRunning()) { thread->quit(); thread->wait(3000); if (thread->isRunning()) { thread->terminate(); thread->wait(); } } if (thread) { delete thread; } } m_workerThreads.clear(); } bool Server::start(quint16 port) { if (!m_tcpServer->listen(QHostAddress::Any, port)) { qCritical() << "Failed to start server:" << m_tcpServer->errorString(); return false; } qInfo() << "Server listening on port" << port; return true; } void Server::onNewConnection() { while (m_tcpServer->hasPendingConnections()) { QTcpSocket* clientSocket = m_tcpServer->nextPendingConnection(); qintptr socketDescriptor = clientSocket->socketDescriptor(); QString peerAddr = clientSocket->peerAddress().toString(); quint16 peerPort = clientSocket->peerPort(); qInfo() << "New connection from" << peerAddr << ":" << peerPort; clientSocket->setParent(nullptr); QThread* workerThread = new QThread(this); ClientWorker* worker = new ClientWorker(); worker->moveToThread(workerThread); connect(workerThread, &QThread::started, worker, [worker, socketDescriptor]() { QTimer::singleShot(0, worker, [worker, socketDescriptor]() { worker->initialize(socketDescriptor); }); }); connect(worker, &QObject::destroyed, workerThread, &QThread::quit); connect(workerThread, &QThread::finished, worker, &QObject::deleteLater); connect(workerThread, &QThread::finished, this, [this, workerThread]() { m_workerThreads.removeAll(workerThread); workerThread->deleteLater(); }); for (auto it = m_workerThreads.begin(); it != m_workerThreads.end(); ) { if (!(*it)->isRunning()) { (*it)->deleteLater(); it = m_workerThreads.erase(it); } else { ++it; } } m_workerThreads.append(workerThread); workerThread->start(); } }