Sur cette page

Exemple de serveur WebSocket

Description

L'exemple echoserver implémente un serveur WebSocket qui renvoie tout ce qui lui est envoyé.

Code

Nous commençons par créer un serveur WebSocket ( QWebSocketServer, `new QWebSocketServer()`). Une fois le serveur créé, nous écoutons sur toutes les interfaces réseau locales (`QHostAddress::Any`) sur l'port spécifiée.

EchoServer::EchoServer(quint16 port, bool debug, QObject*parent) :
    QObject(parent),
    m_pWebSocketServer(new QWebSocketServer(QStringLiteral("Echo Server"),
                                            QWebSocketServer::NonSecureMode, this)),
    m_debug(debug)
{
    if (m_pWebSocketServer->listen(QHostAddress::Any, port)) {
        if (m_debug)
            qDebug() << "Echoserver listening on port" << port;
        connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
                this, &EchoServer::onNewConnection);
        connect(m_pWebSocketServer, &QWebSocketServer::closed, this, &EchoServer::closed);
    }
}

Si l'écoute aboutit, nous connectons le signal `newConnection()` au slot `onNewConnection()`. Le signal `newConnection()` sera émis chaque fois qu'un nouveau client WebSocket se connectera à notre serveur.

void EchoServer::onNewConnection()
{
    QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();

    connect(pSocket, &QWebSocket::textMessageReceived, this, &EchoServer::processTextMessage);
    connect(pSocket, &QWebSocket::binaryMessageReceived, this, &EchoServer::processBinaryMessage);
    connect(pSocket, &QWebSocket::disconnected, this, &EchoServer::socketDisconnected);

    m_clients << pSocket;
}

Lorsqu’une nouvelle connexion est reçue, le client QWebSocket est récupéré (`nextPendingConnection()`), et les signaux qui nous intéressent sont connectés à nos slots (`textMessageReceived()`, `binaryMessageReceived()` et `disconnected()`). La socket du client est enregistrée dans une liste, au cas où nous souhaiterions l’utiliser ultérieurement (dans cet exemple, elle n’est pas utilisée).

void EchoServer::processTextMessage(QString message)
{
    QWebSocket*pClient = qobject_cast<QWebSocket*>(sender());
    if (m_debug)
        qDebug() << "Message received:" << message;
   if (pClient) {
        pClient->sendTextMessage(message);
    }
}

Chaque fois que la fonction `processTextMessage()` est appelée, nous récupérons l'expéditeur et, si celui-ci est valide, nous renvoyons le message d'origine (`sendTextMessage()`). La même procédure s'applique aux messages binaires.

void EchoServer::processBinaryMessage(QByteArray message)
{
    QWebSocket*pClient = qobject_cast<QWebSocket*>(sender());
    if (m_debug)
        qDebug() << "Binary Message received:" << message;
   if (pClient) {
        pClient->sendBinaryMessage(message);
    }
}

La seule différence est que le message est désormais un ` QByteArray ` au lieu d'un ` QString`.

void EchoServer::socketDisconnected()
{
    QWebSocket*pClient = qobject_cast<QWebSocket*>(sender());
    if (m_debug)
        qDebug() << "socketDisconnected:" << pClient;
   if (pClient) {
        m_clients.removeAll(pClient);
        pClient->deleteLater();
    }
}

Chaque fois qu'un socket est déconnecté, nous le retirons de la liste des clients et le supprimons. Remarque : il est préférable d'utiliser `deleteLater()` pour supprimer le socket.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.