QWebSocketServer Class
实现基于 WebSocket 的服务器。更多
头文件: | #include <QWebSocketServer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS WebSockets) target_link_libraries(mytarget PRIVATE Qt6::WebSockets) |
qmake: | QT += websockets |
继承: | QObject |
公共类型
enum | SslMode { SecureMode, NonSecureMode } |
公共函数
QWebSocketServer(const QString &serverName, QWebSocketServer::SslMode secureMode, QObject *parent = nullptr) | |
virtual | ~QWebSocketServer() override |
void | close() |
QWebSocketProtocol::CloseCode | error() const |
QString | errorString() const |
void | handleConnection(QTcpSocket *socket) const |
std::chrono::milliseconds | handshakeTimeout() const |
int | handshakeTimeoutMS() const |
bool | hasPendingConnections() const |
bool | isListening() const |
bool | listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0) |
int | maxPendingConnections() const |
virtual QWebSocket * | nextPendingConnection() |
void | pauseAccepting() |
QNetworkProxy | proxy() const |
void | resumeAccepting() |
QWebSocketServer::SslMode | secureMode() const |
QHostAddress | serverAddress() const |
QString | serverName() const |
quint16 | serverPort() const |
QUrl | serverUrl() const |
void | setHandshakeTimeout(std::chrono::milliseconds msec) |
void | setHandshakeTimeout(int msec) |
void | setMaxPendingConnections(int numConnections) |
void | setProxy(const QNetworkProxy &networkProxy) |
void | setServerName(const QString &serverName) |
bool | setSocketDescriptor(qintptr socketDescriptor) |
void | setSslConfiguration(const QSslConfiguration &sslConfiguration) |
(since 6.4) void | setSupportedSubprotocols(const QStringList &protocols) |
qintptr | socketDescriptor() const |
QSslConfiguration | sslConfiguration() const |
(since 6.4) QStringList | supportedSubprotocols() const |
QList<QWebSocketProtocol::Version> | supportedVersions() const |
信号
void | acceptError(QAbstractSocket::SocketError socketError) |
(since 6.2) void | alertReceived(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description) |
(since 6.2) void | alertSent(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description) |
void | closed() |
(since 6.2) void | handshakeInterruptedOnError(const QSslError &error) |
void | newConnection() |
void | originAuthenticationRequired(QWebSocketCorsAuthenticator *authenticator) |
void | peerVerifyError(const QSslError &error) |
void | preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator) |
void | serverError(QWebSocketProtocol::CloseCode closeCode) |
void | sslErrors(const QList<QSslError> &errors) |
详细说明
QWebSocketServer 以QTcpServer 为模型,行为方式相同。因此,如果你知道如何使用QTcpServer ,你就知道如何使用 QWebSocketServer。该类可以接受传入的 WebSocket 连接。你可以指定端口,也可以让 QWebSocketServer 自动选择端口。您可以监听特定地址,也可以监听所有机器的地址。调用listen() 可让服务器监听传入连接。
每次客户端连接到服务器时,都会发出newConnection() 信号。调用nextPendingConnection() 接受挂起的连接作为已连接的QWebSocket 。函数会返回一个指向QAbstractSocket::ConnectedState 中QWebSocket 的指针,您可以使用该指针与客户端通信。
如果发生错误,serverError() 会返回错误类型,调用errorString() 可以获得关于发生错误的可读描述。
在监听连接时,服务器监听的地址和端口可通过serverAddress() 和serverPort() 获得。
调用close() 会使 QWebSocketServer 停止监听传入连接。
QWebSocketServer 目前不支持WebSocket 扩展。
注意: 在使用自签名证书时,Firefox bug 594502会阻止Firefox连接到安全的 WebSocket 服务器。要解决这个问题,首先使用 HTTPS 浏览安全 WebSocket 服务器。FireFox 会提示证书无效。从现在起,可以将证书添加到例外情况中。之后,安全 WebSockets 连接就能正常工作了。
QWebSocketServer 仅支持RFC 6455 中概述的 WebSocket 协议第 13 版。
默认的连接握手超时时间为 10 秒,以避免拒绝服务,可使用setHandshakeTimeout() 对超时时间进行自定义。
另请参阅 WebSocket 服务器示例和QWebSocket 。
成员类型文档
enum QWebSocketServer::SslMode
表示服务器通过 wss(安全模式)还是 ws(非安全模式)运行
常数 | 值 | 说明 |
---|---|---|
QWebSocketServer::SecureMode | 0 | 服务器以安全模式运行(通过 wss) |
QWebSocketServer::NonSecureMode | 1 | 服务器以非安全模式运行(通过 ws) |
成员函数文档
[explicit]
QWebSocketServer::QWebSocketServer(const QString &serverName, QWebSocketServer::SslMode secureMode, QObject *parent = nullptr)
使用给定的serverName 构建一个新的 QWebSocketServer。serverName 将在 HTTP 握手阶段用于识别服务器。它可以为空,在这种情况下,将不会向客户端发送服务器名称。secureMode 参数表示服务器是通过 wss (SecureMode) 还是通过 ws (NonSecureMode) 运行。
parent 传递给 构造函数。QObject
[override virtual noexcept]
QWebSocketServer::~QWebSocketServer()
销毁QWebSocketServer 对象。如果服务器正在监听连接,则会自动关闭套接字。任何仍在排队的客户端QWebSocket都会被关闭和删除。
另请参阅 close().
[signal]
void QWebSocketServer::acceptError(QAbstractSocket::SocketError socketError)
当接受新连接时出现错误,就会发出该信号。socketError 参数描述了发生错误的类型。
另请参阅 pauseAccepting() 和resumeAccepting()。
[signal, since 6.2]
void QWebSocketServer::alertReceived(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
QWebSocketServer level type 是解释发送警报原因的代码。如果有关于警报信息的文字说明,则在 中提供。description
注意: 该信号主要用于提供信息和调试,不需要在应用程序中进行任何处理。如果警报是致命的,底层后端会进行处理并关闭连接。
注意: 并非所有后端都支持此功能。
此函数在 Qt 6.2 中引入。
另请参阅 alertSent(),QSsl::AlertLevel, 和QSsl::AlertType 。
[signal, since 6.2]
void QWebSocketServer::alertSent(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description)
QWebSocketServer level 描述了是警告还是致命错误。 给出了警报信息的代码。如果有警报信息的文本描述,则在 中提供。type description
注意: 该信号主要是信息性的,可用于调试目的,通常不要求应用程序执行任何操作。
注意: 并非所有后端都支持此功能。
此函数在 Qt 6.2 中引入。
另请参阅 alertReceived(),QSsl::AlertLevel, 和QSsl::AlertType 。
void QWebSocketServer::close()
关闭服务器。服务器将不再侦听传入连接。
[signal]
void QWebSocketServer::closed()
服务器关闭连接时发出该信号。
另请参阅 close().
QWebSocketProtocol::CloseCode QWebSocketServer::error() const
返回上次出错的错误代码。如果没有错误发生,则返回QWebSocketProtocol::CloseCodeNormal 。
另请参阅 errorString() 。
QString QWebSocketServer::errorString() const
返回对上次发生的错误的可读描述。如果未发生错误,则返回空字符串。
另请参阅 serverError()。
void QWebSocketServer::handleConnection(QTcpSocket *socket) const
将 tcpsocket 升级为 websocket。
QWebSocketServer 对象将获得 socket 对象的所有权,并在适当的时候将其删除。
[signal, since 6.2]
void QWebSocketServer::handshakeInterruptedOnError(const QSslError &error)
QWebSocketServer 如果发现证书验证 ,并且在 中启用了早期错误报告功能,则会发出此信号。error QSslConfiguration
此函数在 Qt 6.2 中引入。
另请参阅 sslErrors() 和QSslConfiguration::setHandshakeMustInterruptOnError()。
std::chrono::milliseconds QWebSocketServer::handshakeTimeout() const
返回新连接的握手超时(毫秒)。
默认为 10 秒。如果对等方用了更多时间完成握手,其连接将被关闭。
另请参阅 setHandshakeTimeout() 和handshakeTimeoutMS()。
int QWebSocketServer::handshakeTimeoutMS() const
返回新连接的握手超时(毫秒)。
默认为 10 秒。如果对等方用了更多时间完成握手,其连接将被关闭。
另请参阅 setHandshakeTimeout() 和handshakeTimeout()。
bool QWebSocketServer::hasPendingConnections() const
如果服务器有待处理连接,则返回 true;否则返回 false。
另请参阅 nextPendingConnection() 和setMaxPendingConnections()。
bool QWebSocketServer::isListening() const
如果服务器正在监听传入连接,则返回 true;否则返回 false。如果监听失败,error() 将返回原因。
bool QWebSocketServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
告诉服务器监听地址address 和端口port 上的传入连接。如果port 为 0,则会自动选择一个端口。如果address 为QHostAddress::Any ,服务器将监听所有网络接口。
成功时返回 true,否则返回 false。
另请参阅 isListening() 。
int QWebSocketServer::maxPendingConnections() const
返回待接受连接的最大数量。默认为 30。
另请参阅 setMaxPendingConnections() 和hasPendingConnections()。
[signal]
void QWebSocketServer::newConnection()
每次有新连接时都会发出该信号。
另请参阅 hasPendingConnections() 和nextPendingConnection()。
[virtual]
QWebSocket *QWebSocketServer::nextPendingConnection()
将下一个待处理连接作为已连接的QWebSocket 对象返回。QWebSocketServer 不拥有返回的QWebSocket 对象的所有权。如果在没有待处理连接时调用此函数,则返回 nullptr。
注意:返回的QWebSocket 对象不能在其他线程中使用。
另请参阅 hasPendingConnections()。
[signal]
void QWebSocketServer::originAuthenticationRequired(QWebSocketCorsAuthenticator *authenticator)
请求新连接时会发出该信号。连接到此信号的插槽应指示authenticator 对象是否允许使用起源(可通过调用 origin() 确定)(通过发布setAllowed() )。
如果该信号未连接任何插槽,则默认接受所有起源。
注意: 不能使用 QueuedConnection 连接到此信号,因为连接总是会成功。
void QWebSocketServer::pauseAccepting()
暂停接收新连接。队列中的连接将保留在队列中。
另请参阅 resumeAccepting()。
[signal]
void QWebSocketServer::peerVerifyError(const QSslError &error)
QWebSocketServer 可以在 SSL 握手过程中,在加密建立之前多次发出该信号,以表明在建立对等方身份时发生了错误。 通常表明 无法安全地识别对等方。error QWebSocketServer
当出现问题时,该信号可为您提供早期提示。通过连接到该信号,您可以在握手完成前从连接的插槽内手动选择中断连接。如果不采取任何行动,QWebSocketServer 将继续发送QWebSocketServer::sslErrors().
另请参阅 sslErrors()。
[signal]
void QWebSocketServer::preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)
QWebSocketServer 在协商 PSK 密码套件时,服务器会发出这个信号,因此需要进行 PSK 验证。
使用 PSK 时,客户端必须向服务器发送有效的身份信息和有效的预共享密钥,才能继续 SSL 握手。应用程序可以根据自己的需要,通过填写传递的authenticator 对象,在与该信号相连的插槽中提供这些信息。
注: 忽略此信号或未提供所需凭证将导致握手失败,从而中止连接。
注: authenticator 对象为套接字所有,应用程序不得删除。
另请参阅 QSslPreSharedKeyAuthenticator 和QSslSocket::preSharedKeyAuthenticationRequired()。
QNetworkProxy QWebSocketServer::proxy() const
返回此服务器的网络代理。默认情况下使用QNetworkProxy::DefaultProxy 。
另请参阅 setProxy().
void QWebSocketServer::resumeAccepting()
恢复接受新连接。
另请参见 pauseAccepting().
QWebSocketServer::SslMode QWebSocketServer::secureMode() const
返回服务器运行的安全模式。
另请参阅 QWebSocketServer() 和SslMode 。
QHostAddress QWebSocketServer::serverAddress() const
如果服务器正在监听连接,则返回服务器地址;否则返回QHostAddress::Null 。
另请参阅 serverPort() 和listen()。
[signal]
void QWebSocketServer::serverError(QWebSocketProtocol::CloseCode closeCode)
当 WebSocket 连接设置过程中发生错误时会发出该信号。closeCode 参数描述了发生错误的类型。
另请参阅 errorString().
QString QWebSocketServer::serverName() const
返回在 http 握手阶段使用的服务器名称。
另请参阅 setServerName()。
quint16 QWebSocketServer::serverPort() const
如果服务器正在监听连接,则返回服务器的端口;否则返回 0。
另请参阅 serverAddress() 和listen()。
QUrl QWebSocketServer::serverUrl() const
如果服务器正在监听连接,则返回客户端可用于连接该服务器的 URL。否则将返回无效 URL。
另请参阅 serverPort()、serverAddress() 和listen()。
void QWebSocketServer::setHandshakeTimeout(std::chrono::milliseconds msec)
将新连接的握手超时设置为msec 毫秒。
默认设置为 10 秒。如果对等方用了更多时间完成握手,其连接将被关闭。可以通过负值(如-1)来禁用超时。
另请参阅 handshakeTimeout() 和handshakeTimeoutMS()。
void QWebSocketServer::setHandshakeTimeout(int msec)
这是一个重载函数。
void QWebSocketServer::setMaxPendingConnections(int numConnections)
设置numConnections 的最大待接受连接数。在调用nextPendingConnection() 之前,WebSocketServer 接受的传入连接数不会超过numConnections 。默认情况下,上限为 30 个待处理连接。
QWebSocketServer 当达到最大连接数时,将发出带有 关闭代码的 () 信号。WebSocket 握手失败,套接字将被关闭。QWebSocketProtocol::CloseCodeAbnormalDisconnection error
另请参阅 maxPendingConnections() 和hasPendingConnections()。
void QWebSocketServer::setProxy(const QNetworkProxy &networkProxy)
将此服务器的显式网络代理设置为networkProxy 。
要禁用代理,请使用QNetworkProxy::NoProxy 代理类型:
server->setProxy(QNetworkProxy::NoProxy);
另请参阅 proxy() 。
void QWebSocketServer::setServerName(const QString &serverName)
将 HTTP 握手阶段使用的服务器名称设置为给定的serverName 。serverName 可以为空,在这种情况下,将向客户端发送一个空服务器名称。现有连接的客户端不会收到通知,只有新连接的客户端才会看到这个新名称。
另请参阅 serverName() 。
bool QWebSocketServer::setSocketDescriptor(qintptr socketDescriptor)
设置服务器在监听socketDescriptor 的传入连接时应使用的套接字描述符。
如果套接字设置成功,则返回 true;否则返回 false。假设套接字处于侦听状态。
另请参阅 socketDescriptor() 和isListening()。
void QWebSocketServer::setSslConfiguration(const QSslConfiguration &sslConfiguration)
将QWebSocketServer 的 SSL 配置设置为sslConfiguration 。如果QWebSocketServer 以非安全模式运行 (QWebSocketServer::NonSecureMode) ,则此方法无效。
另请参阅 sslConfiguration() 和SslMode 。
[since 6.4]
void QWebSocketServer::setSupportedSubprotocols(const QStringList &protocols)
将服务器支持的协议列表设置为protocols 。
此函数在 Qt 6.4 中引入。
另请参阅 supportedSubprotocols()。
qintptr QWebSocketServer::socketDescriptor() const
返回服务器用于侦听传入指令的本地套接字描述符,如果服务器未侦听,则返回-1。如果服务器使用QNetworkProxy ,返回的描述符可能无法使用本地套接字函数。
另请参阅 setSocketDescriptor() 和isListening()。
QSslConfiguration QWebSocketServer::sslConfiguration() const
返回QWebSocketServer 使用的 SSL 配置。如果服务器未在安全模式下运行 (QWebSocketServer::SecureMode),则此方法返回QSslConfiguration::defaultConfiguration()。
另请参阅 setSslConfiguration(),SslMode, 和QSslConfiguration::defaultConfiguration().
[signal]
void QWebSocketServer::sslErrors(const QList<QSslError> &errors)
QWebSocketServer 在 SSL 握手后发出此信号,表明在建立对等方身份时发生了一个或多个错误。这些错误通常表明 无法安全地识别对等方。除非采取任何措施,否则连接将在此信号发出后中断。QWebSocketServer
errors 包含一个或多个阻止 验证对等方身份的错误。QSslSocket
另请参阅 peerVerifyError() 。
[since 6.4]
QStringList QWebSocketServer::supportedSubprotocols() const
返回服务器支持的协议列表。
此函数在 Qt 6.4 中引入。
另请参阅 setSupportedSubprotocols()。
QList<QWebSocketProtocol::Version> QWebSocketServer::supportedVersions() const
返回该服务器支持的 WebSocket 版本列表。
© 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.