WebSocket サーバーの例
概要
echoserver のサンプルは、送信されたすべてのデータをそのままエコーバックする WebSocket サーバーを実装しています。
コード
まず、QWebSocketServer (`new QWebSocketServer()`)を作成します。作成後、指定されたport で、すべてのローカルネットワークインターフェース(`QHostAddress::Any`)をリッスンします。
EchoServer::EchoServer(quint16 port, booldebug,QObject*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;
connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
this, &EchoServer::onNewConnection);
connect(m_pWebSocketServer, &QWebSocketServer::closed, this, &EchoServer::closed);
}
}リスニングに成功した場合、`newConnection()`シグナルをスロット`onNewConnection()`に接続します。`newConnection()`シグナルは、新しいWebSocketクライアントがサーバーに接続されるたびに発火します。
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(QString message)
{
QWebSocket*pClient =qobject_cast<QWebSocket*>(sender());
if(m_debug)
qDebug() << "Message received:" << message;
if(pClient) {
pClient->sendTextMessage(message);
}
}`processTextMessage()` が呼び出されるたびに、送信者を取得し、有効であれば元のメッセージを返信します(`sendTextMessage()`)。バイナリメッセージについても同様です。
voidEchoServer::processBinaryMessage(QByteArray message)
{
QWebSocket*pClient =qobject_cast<QWebSocket*>(sender());
if(m_debug)
qDebug() << "Binary Message received:" << message;
if(pClient) {
pClient->sendBinaryMessage(message);
}
}唯一の違いは、メッセージがQString からQByteArray に変更された点です。
voidEchoServer::socketDisconnected()
{
QWebSocket*pClient =qobject_cast<QWebSocket*>(sender());
if(m_debug)
qDebug() << "socketDisconnected:" << pClient;
if(pClient) {
m_clients.removeAll(pClient);
pClient->deleteLater();
}
}ソケットの接続が切断されるたびに、クライアントリストからそのソケットを削除し、ソケット自体も削除します。注:ソケットの削除には `deleteLater()` を使用するのが最適です。
© 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.