Ejemplo de servidor WebSocket
Descripción
El ejemplo echoserver implementa un servidor WebSocket que devuelve todo lo que se le envía.
Código
Comenzamos creando un QWebSocketServer (`new QWebSocketServer()`). Después de la creación, escuchamos en todas las interfaces de red locales (`QHostAddress::Any`) en el port especificado.
EchoServer::EchoServer(quint16 puerto, bool debug, QObject *parent) : QObject(parent),m_pWebSocketServer(new QWebSocketServer(QStringLiteral("Servidor Eco"), QWebSocketServer::NonSecureMode , this)),m_debug(debug) { if (m_pWebSocketServer->listen(QHostAddress::Cualquiera, puerto)) { 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 la escucha tiene éxito, conectamos la señal `newConnection()` al slot `onNewConnection()`. La señal `newConnection()` será lanzada cada vez que un nuevo cliente WebSocket se conecte a nuestro servidor.
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; }
Cuando se recibe una nueva conexión, se recupera el cliente QWebSocket (`nextPendingConnection()`), y las señales que nos interesan se conectan a nuestras ranuras (`textMessageReceived()`, `binaryMessageReceived()` y `disconnected()`). El socket del cliente se recuerda en una lista, por si quisiéramos usarlo más tarde (en este ejemplo, no se hace nada con él).
void EchoServer::processMensajeDeTexto(QString mensaje) { QWebSocket *pCliente = qobject_cast<QWebSocket *>(sender()); if (m_debug) qDebug() << "Message received:" << message; if (pClient) { pClient->sendTextMessage(message); } }
Siempre que se activa `processTextMessage()`, recuperamos el remitente, y si es válido, devolvemos el mensaje original (`sendTextMessage()`). Lo mismo se hace con los mensajes binarios.
void EchoServer::processBinaryMessage(QByteArray mensaje) { QWebSocket * pCliente = qobject_cast<QWebSocket *>(sender()); if (m_debug) qDebug() << "Binary Message received:" << message; if (pClient) { pClient->sendBinaryMessage(message); } }
La única diferencia es que ahora el mensaje es un QByteArray en lugar de un QString.
void EchoServer::socketDisconnected() { QWebSocket *pCliente = qobject_cast<QWebSocket *>(sender()); if (m_debug) qDebug() << "socketDisconnected:" << pClient; if (pClient) { m_clients.removeAll(pClient); pClient->deleteLater(); } }
Cada vez que un socket se desconecta, lo eliminamos de la lista de clientes y borramos el socket. Nota: es mejor usar `deleteLater()` para borrar el 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.