WebSocket Server Beispiel

Beschreibung

Das echoserver-Beispiel implementiert einen WebSocket-Server, der alles, was an ihn gesendet wird, mit einem Echo zurückgibt.

Code

Wir beginnen mit der Erstellung eines QWebSocketServer (`new QWebSocketServer()`). Nach der Erstellung lauschen wir auf allen lokalen Netzwerkschnittstellen (`QHostAddress::Any`) auf der angegebenen port.

EchoServer::EchoServer(quint16 port, bool  debug, QObject *parent) : QObject(Elternteil),m_pWebSocketServer(new QWebSocketServer(QStringLiteral("EchoServer"),               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); } }

Wenn das Abhören erfolgreich ist, verbinden wir das Signal `newConnection()` mit dem Slot `onNewConnection()`. Das Signal `newConnection()` wird immer dann ausgelöst, wenn ein neuer WebSocket-Client mit unserem Server verbunden wird.

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;
}

Wenn eine neue Verbindung empfangen wird, wird der Client QWebSocket abgerufen (`nextPendingConnection()`), und die Signale, an denen wir interessiert sind, werden mit unseren Slots verbunden (`textMessageReceived()`, `binaryMessageReceived()` und `disconnected()`). Der Client-Socket wird in einer Liste gespeichert, für den Fall, dass wir ihn später benutzen wollen (in diesem Beispiel wird nichts mit ihm gemacht).

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

Immer wenn `processTextMessage()` ausgelöst wird, rufen wir den Absender ab und senden, falls gültig, die ursprüngliche Nachricht zurück (`sendTextMessage()`). Das Gleiche wird mit binären Nachrichten gemacht.

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

Der einzige Unterschied besteht darin, dass es sich bei der Nachricht jetzt um eine QByteArray anstelle einer QString handelt.

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

Immer wenn ein Socket getrennt wird, entfernen wir ihn aus der Client-Liste und löschen den Socket. Hinweis: Es ist am besten, `deleteLater()` zu verwenden, um den Socket zu löschen.

© 2025 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.