Auf dieser Seite

Beispiel für einen WebSocket-Server

Beschreibung

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

Code

Zunächst erstellen wir einen „ QWebSocketServer “ (`new QWebSocketServer()`). Nach der Erstellung hören wir auf allen lokalen Netzwerkschnittstellen (`QHostAddress::Any`) auf der angegebenen Adresse port ab.

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

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 eine Verbindung zu unserem Server herstellt.

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 für uns interessanten Signale werden mit unseren Slots verbunden (`textMessageReceived()`, `binaryMessageReceived()` und `disconnected()`). Der Client-Socket wird in einer Liste gespeichert, falls wir ihn später verwenden möchten (in diesem Beispiel wird nichts damit gemacht).

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

Immer wenn `processTextMessage()` aufgerufen wird, ermitteln wir den Absender und senden, sofern gültig, die ursprüngliche Nachricht zurück (`sendTextMessage()`). Bei binären Nachrichten wird ebenso verfahren.

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

Der einzige Unterschied besteht darin, dass die Nachricht nun ein ` QByteArray ` anstelle eines ` QString` ist.

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

Immer wenn eine Socket-Verbindung getrennt wird, entfernen wir sie aus der Client-Liste und löschen die Socket. Hinweis: Es empfiehlt sich, zum Löschen der Socket die Funktion `deleteLater()` zu verwenden.

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