Serveur MultiThread en C++
Bonjour,
J'utilise le module Qt network pour créer une application de chat serveur-client .Le problème est que le serveur s'execute mais quand on envoie un message depuis un client le serveur s'arrête .
Voici mes classes :
La fenêtre du serveur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| ServerWin::ServerWin(QWidget *parent) :
QWidget(parent)
{
// initialisation of QLabel and QPushButton
server = new QTcpServer(this);
server->listen(QHostAddress::Any, 50856);
connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
connect(server, SIGNAL(newConnection()), this, SLOT(newTcpConnection()));
}
ServerWin::~ServerWin()
{
delete quitButton;
delete label;
delete server;
for (int i = 0; i < clientThreads.size(); ++i)
delete clientThreads[i];
}
void ServerWin::newTcpConnection()
{
QTcpSocket *socket = new QTcpSocket();
socket = server->nextPendingConnection();
if (socket == 0)
return;
ServerThread *thread = new ServerThread(socket->socketDescriptor());
for (int i = 0; i < clientThreads.size(); ++i)
{
clientThreads[i]->addSocket(socket->socketDescriptor());
thread->addSocket(clientThreads[i]->Descriptor());
}
clientThreads << thread;
delete socket;
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
} |
La classe ServerThread :
serverthread.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class ServerThread : public QThread
{
Q_OBJECT
public:
ServerThread(qintptr descriptor);
~ServerThread();
void addSocket(qintptr descriptor);
quintptr Descriptor();
void run();
private slots :
void dataReceived();
void clientDisconnected();
private:
void sendForAll(QByteArray buffer);
QByteArray writeInBuffer(QString message);
QList <QTcpSocket *> clientSockets;
QTcpSocket *m_socket;
qint64 dataSize;
}; |
serverthread.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| ServerThread::ServerThread(qintptr descriptor) : QThread()
{
qDebug("constructor");
m_socket = new QTcpSocket(this);
m_socket->setSocketDescriptor(descriptor);
dataSize = 0;
connect(m_socket, SIGNAL(readyRead()), this, SLOT(dataReceived()));
connect(m_socket, SIGNAL(disconnected()), this, SLOT(clientDisconnected()));
moveToThread(this);
}
ServerThread::~ServerThread()
{
delete m_socket;
for (int i = 0; i < clientSockets.size(); ++i)
delete clientSockets[i];
}
void ServerThread::run()
{
sendForAll(writeInBuffer("Client Connected"));
qDebug("before exec()");
exec();
qDebug("after exec()");
}
void ServerThread::addSocket(qintptr descriptor)
{
QTcpSocket *socket = new QTcpSocket(this);
socket->setSocketDescriptor(descriptor);
clientSockets << socket;
qDebug("add socket");
}
quintptr ServerThread::Descriptor()
{
return m_socket->socketDescriptor();
}
void ServerThread::dataReceived()
{
if (dataSize == 0)
{
QDataStream stream(m_socket);
stream.setVersion(QDataStream::Qt_5_11);
stream >> dataSize;
}
if (m_socket->bytesAvailable() < dataSize)
return;
qDebug("data received");
sendForAll(m_socket->read(dataSize));
dataSize = 0;
}
void ServerThread::clientDisconnected()
{
sendForAll(writeInBuffer("un client vient de se deconnecter"));
m_socket->deleteLater();
exit(0);
}
void ServerThread::sendForAll(QByteArray buffer)
{
for (int i = 0; i < clientSockets.size(); ++i)
clientSockets[i]->write(buffer);
m_socket->write(buffer);
qDebug("sent for all");
}
QByteArray ServerThread::writeInBuffer(QString message)
{
QByteArray buffer;
QDataStream stream(&buffer, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_5_11);
stream << message;
qDebug("write in buffer");
return buffer;
} |
Pour vous donner une idée de ce qui se passe, la console affiche :
Code:
1 2 3 4 5 6 7 8
| Starting C:\chat_server.exe...
constructor
QSocketNotifier: Multiple socket notifiers for same socket 1240 and type Read
write in buffer
send for all
before exec()
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
QThread: Destroyed while thread is still running |
SVP je veux des solutions pour régler ces problèmes
Merci d'avance,