WebSocketサーバーの例

説明

echoserver のサンプルは、送られてきたものをすべてエコーバックする WebSocket サーバーを実装している。

コード

まず、QWebSocketServer (`new QWebSocketServer()`) を作成します。作成後、指定したport 上のすべてのローカルネットワークインタフェース (`QHostAddress::Any`) をリッスンします。

EchoServer::EchoServer(quint16port, bool  debugQObject(*parent) :   QObject(parent),m_pWebSocketServer(newQWebSocketServer(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;
        コネクト(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &EchoServer::onNewConnection); connect(m_pWebSocketServer, &QWebSocketServer::closed, this, &EchoServer::closed); } }

リスニングに成功したら、シグナル `newConnection()` をスロット `onNewConnection()` に接続する。新しい WebSocket クライアントがサーバーに接続されると、 `newConnection()` シグナルがスローされます。

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

新しい接続を受信すると、クライアントQWebSocket が取得され (`nextPendingConnection()`)、興味のあるシグナルがスロットに接続されます (`textMessageReceived()`、`binaryMessageReceived()`、`disconnected()`)。クライアントソケットは、後で使用する場合に備えてリストに記憶しておく(この例では何もしない)。

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

processTextMessage()`がトリガーされるたびに、送信者を取得し、有効であれば元のメッセージを送り返す(`sendTextMessage()`)。バイナリ・メッセージの場合も同様です。

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

唯一の違いは、メッセージがQString ではなくQByteArray になったことである。

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

ソケットが切断されるたびに、クライアントリストからソケットを削除する。注意: ソケットの削除には `deleteLater()` を使うのがよい。

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