#include "tcpserver.h" #include #include TcpServer::TcpServer(QObject *parent) : QObject(parent) { qDebug() << "----------------------------"; qDebug() << "network interfaces:"; foreach(const QNetworkInterface &interface, QNetworkInterface::allInterfaces()){ qDebug() << " -------------------------"; qDebug() << " name:" << interface.name(); qDebug() << " mac: " << interface.hardwareAddress(); } qDebug() << "----------------------------"; } void TcpServer::sendData(const QList &clients, const QByteArray &data) { foreach (const QUuid &client, clients) { sendData(client, data); } } void TcpServer::sendData(const QUuid &clientId, const QByteArray &data) { QTcpSocket *client = m_clientList.value(clientId); if (client) { client->write(data); } } void TcpServer::newClientConnected() { // got a new client connected QTcpServer *server = qobject_cast(sender()); QTcpSocket *newConnection = server->nextPendingConnection(); qDebug() << "new client connected:" << newConnection->peerAddress().toString(); QUuid clientId = QUuid::createUuid(); // append the new client to the client list m_clientList.insert(clientId, newConnection); connect(newConnection, SIGNAL(readyRead()),this,SLOT(readPackage())); connect(newConnection,SIGNAL(disconnected()),this,SLOT(slotClientDisconnected())); emit clientConnected(clientId); } void TcpServer::readPackage() { QTcpSocket *client = qobject_cast(sender()); qDebug() << "-----------> data comming from" << client->peerAddress().toString(); QByteArray message; while(client->canReadLine()){ QByteArray dataLine = client->readLine(); qDebug() << "line in:" << dataLine; message.append(dataLine); if(dataLine.endsWith('\n')){ emit dataAvailable(m_clientList.key(client), message); message.clear(); } } } void TcpServer::slotClientDisconnected() { QTcpSocket *client = qobject_cast(sender()); qDebug() << "client disconnected:" << client->peerAddress().toString(); QUuid clientId = m_clientList.key(client); m_clientList.take(clientId)->deleteLater(); } bool TcpServer::startServer() { // Listen on all Networkinterfaces foreach(const QHostAddress &address, QNetworkInterface::allAddresses()){ QTcpServer *server = new QTcpServer(this); if(server->listen(address, 1234)) { qDebug() << "server listening on" << address.toString(); connect(server, SIGNAL(newConnection()), SLOT(newClientConnected())); m_serverList.insert(QUuid::createUuid(), server); } else { qDebug() << "ERROR: can not listening to" << address.toString(); delete server; } } if(m_serverList.empty()){ return false; } return true; } bool TcpServer::stopServer() { // Listen on all Networkinterfaces foreach(QTcpServer *server, m_serverList){ qDebug() << "close server " << server->serverAddress().toString(); server->close(); delete server; } if(!m_serverList.empty()){ return false; } return true; }