이 페이지에서

WebSocket 서버 예제

설명

echoserver 예제는 서버로 전송된 모든 데이터를 그대로 반환하는 WebSocket 서버를 구현합니다.

코드

먼저 QWebSocketServer 를 생성합니다(`new QWebSocketServer()`). 생성 후에는 지정된 port 에서 모든 로컬 네트워크 인터페이스(`QHostAddress::Any`)를 수신 대기합니다.

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

수신 대기(listening)에 성공하면 `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()`)에 연결합니다. 클라이언트 소켓은 나중에 사용할 수 있도록 목록에 저장됩니다(이 예제에서는 소켓을 별도로 처리하지 않습니다).

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

`processTextMessage()`가 호출될 때마다 발신자를 확인한 후, 유효한 경우 원본 메시지를 다시 전송합니다 (`sendTextMessage()`). 바이너리 메시지의 경우에도 동일한 처리가 이루어집니다.

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

유일한 차이점은 메시지가 이제 ` QString` 대신 ` QByteArray `가 되었다는 점입니다.

void EchoServer::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.