Exemple de serveur WebSocket
Description de l'exemple de serveur WebSocket
L'exemple echoserver implémente un serveur WebSocket qui renvoie tout ce qui lui est envoyé.
Code
Nous commençons par créer un QWebSocketServer (`new QWebSocketServer()`). Après la création, nous écoutons toutes les interfaces réseau locales (`QHostAddress::Any`) sur l'adresse 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 est réussie, nous connectons le signal `newConnection()` au slot `onNewConnection()`. Le signal `newConnection()` sera lancé à chaque fois qu'un nouveau client WebSocket sera connecté à 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()`). Le socket du client est mémorisé dans une liste, au cas où nous voudrions l'utiliser plus tard (dans cet exemple, rien n'est fait avec).
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 `processTextMessage()` est déclenché, nous récupérons l'expéditeur et, s'il est valide, nous renvoyons le message original (`sendTextMessage()`). La même chose est faite avec les 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 maintenant 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'une socket est déconnectée, nous la retirons de la liste des clients et nous supprimons la socket. Note : il est préférable d'utiliser `deleteLater()` pour supprimer la 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.