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 :
La classe ServerThread :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }
serverthread.h
serverthread.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; };
Pour vous donner une idée de ce qui se passe, la console affiche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
SVP je veux des solutions pour régler ces problèmes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Merci d'avance,
Partager