WebSocket服务器示例

描述

echoserver示例实现了一个WebSocket服务器,会回显发送到它的所有内容。

代码

我们首先创建一个QWebSocketServer (`new QWebSocketServer()`)。在创建后,我们在指定的端口上监听所有本地网络接口(`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);
    }
}

如果监听成功,我们连接`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()`)。客户端套接字被保存在一个列表中,以防我们稍后需要使用它(在这个示例中,没有对它进行任何操作)。

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

唯一的区别是,现在的消息是一个QByteArray而不是一个QString

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

每当一个套接字断开连接,我们将其从客户端列表中删除并删除套接字。注意:最好使用`deleteLater()`来删除套接字。

© 2024 The Qt Company Ltd. 本文档中的内容贡献者是各自所有者的版权。本提供的文档是根据自由软件开发基金会发布的GNU自由文档许可版1.3的条款许可的。Qt及其相应标识是芬兰和/或全球其他地区的The Qt Company Ltd.的商标。所有其他商标均是其各自所有者的财产。