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 : 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();
}
La classe ServerThread :
serverthread.h
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;
};
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
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 : 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
SVP je veux des solutions pour régler ces problèmes
Merci d'avance,