WebSocket 服务器示例
说明
echoserver 示例实现了一个 WebSocket 服务器,可回声发送给它的所有内容。
代码
我们首先创建一个QWebSocketServer (`new QWebSocketServer()`)。创建完成后,我们在指定的port 上监听所有本地网络接口(`QHostAddress::Any`)。
EchoServer::EchoServer(quint16port, bool debug、 QObject*父节点): 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, &EchoServer::newConnection,this,&EchoServer::onNewConnection)QWebSocketServer::newConnection, this, &EchoServer::onNewConnection); connect(m_pWebSocketServer, &EchoServer::closed); } } 。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(QString消息){ QWebSocket*pClient = qobject_cast<QWebSocket*>(sender());if(m_debug) qDebug() << "Message received:" << message; if(pClient) { pClient->sendTextMessage(message); } }
每当触发 "processTextMessage() "时,我们都会检索发件人,如果有效,则发回原始信息("sendTextMessage()")。二进制消息也是如此。
voidEchoServer::processBinaryMessage(QByteArray消息) { QWebSocket*pClient = qobject_cast<QWebSocket*>(sender());if(m_debug) qDebug() << "Binary Message received:" << message; if(pClient) { pClient->sendBinaryMessage(message); } }
唯一的区别是,现在的消息是QByteArray ,而不是QString 。
voidEchoServer::socketDisconnected() { 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.