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.的商标。所有其他商标均是其各自所有者的财产。