diff --git a/messagingserver/client.cpp b/messagingserver/client.cpp new file mode 100644 index 0000000..e0ea2c2 --- /dev/null +++ b/messagingserver/client.cpp @@ -0,0 +1,42 @@ +#include "client.h" + +#include +#include + +#include "server.h" + +Client::Client(QTcpSocket *socket, Server *server) : + QObject(server), m_socket(socket) +{ + qDebug() << this << "connected"; + + m_socket->setParent(this); + + connect(m_socket, &QIODevice::readyRead, this, &Client::readyRead); + connect(m_socket, &QAbstractSocket::disconnected, this, &QObject::deleteLater); +} + +Client::~Client() +{ + qDebug() << this << "disconnected"; +} + +qint64 Client::write(const char *data, qint64 len) +{ + return m_socket->write(data, len); +} + +qint64 Client::write(const char *data) +{ + return m_socket->write(data); +} + +qint64 Client::write(const QByteArray &data) +{ + return m_socket->write(data); +} + +void Client::readyRead() +{ + qDebug() << this << "readyRead" << m_socket->readAll(); +} diff --git a/messagingserver/client.h b/messagingserver/client.h new file mode 100644 index 0000000..b72237f --- /dev/null +++ b/messagingserver/client.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +class QTcpSocket; + +class Server; + +class Client : public QObject +{ + Q_OBJECT + +public: + explicit Client(QTcpSocket *socket, Server *server); + ~Client(); + + qint64 write(const char *data, qint64 len); + qint64 write(const char *data); + qint64 write(const QByteArray &data); + +private Q_SLOTS: + void readyRead(); + +private: + QTcpSocket *m_socket; +}; diff --git a/messagingserver/main.cpp b/messagingserver/main.cpp index 1a46e00..80684c3 100644 --- a/messagingserver/main.cpp +++ b/messagingserver/main.cpp @@ -1,11 +1,12 @@ #include -#include + +#include "server.h" int main(int argc, char **argv) { QCoreApplication app(argc, argv); - qDebug() << "hello from server"; + Server server; - return 0; + return app.exec(); } diff --git a/messagingserver/messagingserver.pro b/messagingserver/messagingserver.pro index 5f24eac..5f5b18f 100644 --- a/messagingserver/messagingserver.pro +++ b/messagingserver/messagingserver.pro @@ -7,9 +7,13 @@ TARGET = messagingserver PROJECT_ROOT = ../.. -SOURCES += main.cpp +SOURCES += main.cpp \ + client.cpp \ + server.cpp -HEADERS += +HEADERS += \ + client.h \ + server.h FORMS += diff --git a/messagingserver/server.cpp b/messagingserver/server.cpp new file mode 100644 index 0000000..7292f6b --- /dev/null +++ b/messagingserver/server.cpp @@ -0,0 +1,44 @@ +#include "server.h" + +#include +#include +#include + +#include "client.h" + +Server::Server(QObject *parent) : + QObject(parent), + m_server(new QTcpServer(this)) +{ + if(!m_server->listen(QHostAddress::Any, 1234)) + qFatal("could not start listening %s", m_server->errorString()); + + connect(m_server, &QTcpServer::newConnection, this, &Server::newConnection); + + m_timerId = startTimer(1000); +} + +void Server::timerEvent(QTimerEvent *event) +{ + if(event->timerId() == m_timerId) + Q_EMIT distribute(QDateTime::currentDateTime().toString("dd.MM.yyyy HH:mm:ss\r\n").toUtf8()); + else + QObject::timerEvent(event); +} + +void Server::newConnection() +{ + auto socket = m_server->nextPendingConnection(); + if(!socket) + { + qWarning() << "null socket received"; + return; + } + + auto client = new Client(socket, this); + connect(this, &Server::distribute, client, qOverload(&Client::write)); + m_clients.insert(client); + connect(client, &QObject::destroyed, this, [this, client](){ + m_clients.remove(client); + }); +} diff --git a/messagingserver/server.h b/messagingserver/server.h new file mode 100644 index 0000000..a692c44 --- /dev/null +++ b/messagingserver/server.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +class QTcpServer; + +class Client; + +class Server : public QObject +{ + Q_OBJECT + +public: + explicit Server(QObject *parent = nullptr); + +Q_SIGNALS: + void distribute(const QByteArray &data); + +protected: + void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE; + +private Q_SLOTS: + void newConnection(); + +private: + QTcpServer *m_server; + QSet m_clients; + int m_timerId; +};