天天看点

Qt网络编程:QWebSocket、QWebSocketServer

Qt网络编程:QWebSocket、QWebSocketServer

QWebSocket

一、描述

WebSockets 是一种通过单个 TCP 连接提供全双工通信通道的 Web 技术。QWebSocket 既可以用于客户端应用程序,也可以用于服务器应用程序。

注意:某些代理不了解 WebSocket 握手期间使用的某些 HTTP 标头。在这种情况下,非安全 WebSocket 连接失败。缓解此问题的最佳方法是通过安全连接使用 WebSocket。

二、成员函数

1、[signal] void aboutToClose()

当Socket 即将关闭时发出此信号。如果有需要在Socket 关闭之前执行的操作(有需要写入设备的单独缓冲区中的数据),请连接此信号。

2、[signal] void binaryFrameReceived(const QByteArray &frame, bool isLastFrame)

每当接收到二进制帧时都会发出此信号。isLastFrame 指示这是否是完整消息的最后一帧。该信号可用于逐帧处理大消息,而不是等待完整的消息到达。

3、[signal] void binaryMessageReceived(const QByteArray &message)

每当接收到二进制消息时都会发出此信号。

4、[signal] void bytesWritten(qint64 bytes)

每次将数据写入Socket 时,都会发出此信号。bytes 参数设置为写入的字节数。

5、void close(QWebSocketProtocol::CloseCode closeCode = QWebSocketProtocol::CloseCodeNormal, const QString &reason = QString())

使用给定的 closeCode 和原因优雅地关闭Socket。

在Socket关闭之前,写入缓冲区中的任何数据都会被刷新。 closeCode 是一个 QWebSocketProtocol::CloseCode 表示关闭的原因,reason 更详细地描述了关闭的原因。 所有控制帧,包括关闭帧,都被限制为 125 字节。 由于其中两个用于 closeCode,因此原因的最大长度为 123! 如果原因超过此限制,它将被截断。

6、[signal] void connected()

成功建立连接时发出。

7、[signal] void disconnected()

断开连接时发出。

8、[signal] void error(QAbstractSocket::SocketError error)

发生错误后发出此信号。 error 参数描述了发生的错误类型。

9、void ignoreSslErrors()

在 QWebSocket 的握手阶段忽略错误并继续连接。见QNetworkReply第6个函数。

10、void open(const QNetworkRequest &request)

使用给定的请求打开一个 WebSocket 连接。

request 的url 将用于打开 WebSocket 连接。request中存在的标头将与 websocket 握手所需的标头一起发送到升级请求中的服务器。

11、void open(const QUrl &url)

使用给定的 url 打开一个 WebSocket 连接。如果 url 包含换行符 (\r\n),则会发出错误信号,错误类型为QAbstractSocket::ConnectionRefusedError。

12、void ping(const QByteArray &payload = QByteArray())

Ping 服务器以指示连接仍然有效。payload 为 ping 消息发送的额外信息,其大小不能大于125。如果大于,则裁剪为125 字节。

13、[signal] void pong(quint64 elapsedTime, const QByteArray &payload)

当收到 pong 消息以回复先前的 ping 时发出。elapsedTime 包含以毫秒为单位的往返时间,payload同上。

14、[signal] void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)

见QNetworkReply第8个函数。

15、[signal] void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)

见QAbstractSocket的第5个函数。

16、[signal] void readChannelFinished()

当输入(读取)流关闭时发出此信号。

17、[signal] void sslErrors(const QList<QSslError> &errors)

见QSslSocket第8个函数。

18、[signal] void stateChanged(QAbstractSocket::SocketState state)

每当状态发生变化时,就会发出此信号。 状态参数是新状态。

19、[signal] void textFrameReceived(const QString &frame, bool isLastFrame)

每当接收到文本消息都会发出此信号。该帧包含数据,isLastFrame 指示这是否是完整消息的最后一帧。该信号可用于逐帧处理大消息,而不是等待完整的消息到达。

20、[signal] void textMessageReceived(const QString &message)

每当收到文本消息时都会发出此信号。该消息包含接收到的文本。

21、void abort()

中止当前Socket并重置Socket。与 close() 不同,此函数会立即关闭Socket,丢弃写入缓冲区中的所有待处理数据。

22、qint64 bytesToWrite()

返回等待写入的字节数。

23、QWebSocketProtocol::CloseCode closeCode()

返回指示Socket关闭原因的代码。

  • enum QWebSocketProtocol::CloseCode:
  • QWebSocketProtocol::CloseCodeNormal:正常关闭
  • QWebSocketProtocol::CloseCodeGoingAway:离开
  • QWebSocketProtocol::CloseCodeProtocolError:协议错误
  • QWebSocketProtocol::CloseCodeDatatypeNotSupported:不支持的数据
  • QWebSocketProtocol::CloseCodeReserved1004:Reserved(不知道怎么翻译)
  • QWebSocketProtocol::CloseCodeMissingStatusCode:未收到状态
  • QWebSocketProtocol::CloseCodeAbnormalDisconnection:异常关闭
  • QWebSocketProtocol::CloseCodeWrongDatatype:无效的帧数据
  • QWebSocketProtocol::CloseCodePolicyViolated:违反政策
  • QWebSocketProtocol::CloseCodeTooMuchData:消息太大
  • QWebSocketProtocol::CloseCodeMissingExtension:缺少强制扩展
  • QWebSocketProtocol::CloseCodeBadOperation:内部服务器错误
  • QWebSocketProtocol::CloseCodeTlsHandshakeFailed:TLS 握手失败

24、QString closeReason()

返回Socket关闭的原因。

25、bool flush()

该函数尽可能多地从内部写缓冲区写入底层网络Socket,不阻塞。如果有任何数据被写入返回true。 如果需要 QWebSocket 立即开始发送缓冲数据,请调用此函数。成功写入的字节数取决于操作系统。 在大多数情况下,不需要调用此函数,因为一旦控制权返回到事件循环,QWebSocket 将自动开始发送数据。

26、void ignoreSslErrors(const QList<QSslError> &errors)

重载函数。告诉 QWebSocket 忽略错误中给出的错误。

可以在 SSL 错误中设置预期的证书:例如,如果想连接到使用自签名证书的服务器,请考虑以下代码段:

QList<QSslCertificate> cert = QSslCertificate::fromPath(QLatin1String("server-certificate.pem"));
QSslError error(QSslError::SelfSignedCertificate, cert.at(0));
QList<QSslError> expectedSslErrors;
expectedSslErrors.append(error);

QWebSocket socket;
socket.ignoreSslErrors(expectedSslErrors);
socket.open(QUrl(QStringLiteral("wss://myserver.at.home")));           

27、bool isValid()

如果Socket准备好读取和写入,则返回 true。

28、[static] quint64 maxIncomingFrameSize()

返回此 websocket 实现的传入 websocket 帧的最大支持大小。

29、[static] quint64 maxIncomingMessageSize()

返回此 websocket 实现的传入 websocket 消息的最大支持大小。

30、[static] quint64 maxOutgoingFrameSize()

返回此 websocket 实现的传出 websocket 帧的最大支持大小。

31、QHostAddress peerAddress()

返回对等地址。

32、QNetworkRequest request()

返回已用于或将用于打开此Socket的请求。

33、QUrl requestUrl()

返回Socket连接到或将连接到的 url。

34、QString resourceName()

返回当前访问的资源的名称。

35、void resume()

继续在Socket上传输数据。 只有在Socket设置为暂停通知并且收到通知后,才应使用此方法。 当前支持的唯一通知是 sslErrors()。 如果Socket未暂停,则调用此方法会导致未定义的行为。

36、qint64 sendBinaryMessage(const QByteArray &data)

通过Socket将给定数据作为二进制消息发送并返回实际发送的字节数。

37、qint64 sendTextMessage(const QString &message)

通过Socket将给定的消息作为文本消息发送并返回实际发送的字节数。

38、void setMaskGenerator(const QMaskGenerator *maskGenerator)

设置蒙版生成器。

39、void setMaxAllowedIncomingFrameSize(quint64 maxAllowedIncomingFrameSize)

设置传入的 websocket 最大帧允许大小。如果传入帧超过此限制,则对等方将断开连接。可接受的范围在 0 和 maxIncomingFrameSize() 之间,默认为 maxIncomingFrameSize()。 此函数的目的是避免耗尽虚拟内存。

40、void setMaxAllowedIncomingMessageSize(quint64 maxAllowedIncomingMessageSize)

设置传入的 websocket 消息的最大允许大小。如果传入消息超过此限制,则对等方将断开连接。 可接受的范围在 0 和 maxIncomingMessageSize() 之间,默认为 maxIncomingMessageSize()。 此函数的目的是避免耗尽虚拟内存。

41、void setOutgoingFrameSize(quint64 outgoingFrameSize)

设置传出 websocket 帧的最大允许大小。可接受的范围在 0 到 maxOutgoingFrameSize() 之间,默认为 512kB。

42、void setPauseMode(QAbstractSocket::PauseModes pauseMode)

控制是否在收到通知时暂停。pauseMode 参数指定应暂停Socket的条件。

当前支持的唯一通知是 sslErrors()。 如果设置为 QAbstractSocket::PauseOnSslErrors,则Socket上的数据传输将暂停,需要通过调用 resume() 再次显式启用。 默认情况下,此选项设置为 PauseNever。 必须在连接到服务器之前调用此选项,否则将导致未定义的行为。

43、void setProxy(const QNetworkProxy &networkProxy)

设置代理。

44、void QWebSocket::setReadBufferSize(qint64 size)

设置 QWebSocket 的内部读取缓冲区的大小(字节)。

如果缓冲区大小被限制在某个大小,QWebSocket 将不会缓冲超过这个大小的数据。缓冲区大小为 0 意味着读取缓冲区是无限的,并且所有传入的数据都将被缓冲。 这是默认设置。

45、void setSslConfiguration(const QSslConfiguration &sslConfiguration)

设置 SSL 配置。

46、QAbstractSocket::SocketState state()

返回Socket的当前状态。

47、QWebSocketProtocol::Version version()

返回Socket当前使用的版本。

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」

QWebSocketServer

一、描述

QWebSocketServer以 QTcpServer 为模型,并且行为相同。所以,如果你知道如何使用 QTcpServer,你就知道如何使用 QWebSocketServer。此类使接受传入的 WebSocket 连接成为可能。

二、类型成员

1、enum QWebSocketServer::SslMode:指示服务器运行模式。

  • SecureMode:服务器以安全模式运行(wss)。
  • NonSecureMode:服务器以非安全模式运行(ws)。

三、成员函数

1、[signal] void acceptError(QAbstractSocket::SocketError socketError)

当接受新连接导致错误时发出此信号。参数描述发生的错误类型。

2、[signal] void closed()

当服务器关闭其连接时发出此信号。

3、[signal] void newConnection()

每次有新连接可用时都会发出此信号。

4、[signal] void originAuthenticationRequired(QWebSocketCorsAuthenticator *authenticator)

当请求新连接时发出此信号。连接到该信号的槽函数中应指示验证器对象中是否允许来源(可以通过 origin() 调用确定)(通过发出 setAllowed())。

如果没有槽函数连接到此信号,则默认情况下将接受所有来源。

注意:无法使用 QueuedConnection 连接到此信号,因为连接将始终成功。

5、[signal] void peerVerifyError(const QSslError &error)

在建立加密之前,QWebSocketServer 可以在 SSL 握手期间多次发出此信号,以指示在建立对等方身份时发生了错误。该错误通常表明 QWebSocketServer 无法安全地识别对等方。

当出现问题时,此信号提供早期指示。通过连接到这个信号,可以在握手完成之前手动选择从连接的槽函数内部拆除连接。如果没有采取任何行动,QWebSocketServer 将继续发出sslErrors()。

6、[signal] void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)

见QNetworkReply第8个函数。

7、[signal] void serverError(QWebSocketProtocol::CloseCode closeCode)

在设置 WebSocket 连接期间发生错误时会发出此信号。closeCode 参数描述发生的错误类型。

8、[signal] void sslErrors(const QList<QSslError> &errors)

QWebSocketServer 在 SSL 握手后发出此信号以指示在建立对等方身份时发生了一个或多个错误。这些错误通常表明 QWebSocketServer 无法安全地识别对等方。 除非采取任何行动,否则在发出此信号后将断开连接。参数为阻止 QSslSocket 验证对等身份的错误。

9、void close()

关闭服务器。 服务器将不再侦听传入连接。

10、QWebSocketProtocol::CloseCode error()

返回最后发生的错误的错误代码。

11、void handleConnection(QTcpSocket *socket)

将 socket 升级为 websocket。QWebSocketServer 对象将获得socket对象的所有权并在适当时将其删除。

12、bool hasPendingConnections()

如果服务器有挂起的连接,则返回 true。

13、bool isListening()

如果服务器当前正在侦听传入连接,则返回 true。 如果监听失败,error() 将返回原因。

14、bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

监听连接。 如果端口为 0,则自动选择一个端口。 如果地址是 QHostAddress::Any,则服务器将侦听所有网络接口。

15、QWebSocket * nextPendingConnection()

将下一个挂起的连接作为已连接的 QWebSocket 对象返回。 QWebSocketServer 不拥有返回的 QWebSocket 对象的所有权。当对象不再被使用时,由调用者明确删除该对象,否则会发生内存泄漏。注意:返回的 QWebSocket 对象不能被其他线程使用。

16、void pauseAccepting()

暂停传入的新连接。排队的连接将保留在队列中。

17、void resumeAccepting()

恢复接受新连接。

18、QHostAddress serverAddress()

如果服务器正在侦听连接,则返回服务器的地址; 否则返回 QHostAddress::Null。

19、QString serverName()

返回在 http 握手阶段使用的服务器名称。

20、quint16 serverPort()

如果服务器正在侦听连接,则返回服务器的端口; 否则返回 0。

21、QUrl serverUrl()

如果服务器正在侦听连接,则返回客户端可用于连接到此服务器的 URL。 否则返回无效的 URL。

22、void setHandshakeTimeout(std::chrono::milliseconds msec)

void setHandshakeTimeout(int msec)           

设置握手超时时间(毫秒)。默认设置为 10 秒。如果对等方使用更多时间来完成握手,则它们的连接将关闭。 可以传递一个负值(例如 -1)来禁用超时。

23、void setMaxPendingConnections(int numConnections)

将最大挂起的接受连接数设置为 numConnections。 在调用 nextPendingConnection() 之前,WebSocketServer 将接受不超过 numConnections 的传入连接。 默认情况下,限制为 30 个挂起的连接。

当达到最大连接数时,QWebSocketServer 将发出带有 QWebSocketProtocol::CloseCodeAbnormalDisconnection 关闭代码的 error() 信号。 WebSocket 握手将失败,套接字将关闭。

24、void setProxy(const QNetworkProxy &networkProxy)

设置代理。

要禁用代理,使用 QNetworkProxy::NoProxy 代理类型:

server->setProxy(QNetworkProxy::NoProxy);

25、void setServerName(const QString &serverName)

将在 HTTP 握手阶段使用的服务器名称设置为给定的 serverName。serverName 可以为空,在这种情况下,将向客户端发送一个空的服务器名称。现有连接的客户端不会收到此更改的通知,只有新连接的客户端才会看到此新名称。

26、void setSslConfiguration(const QSslConfiguration &sslConfiguration)

将 QWebSocketServer 的 SSL 配置设置为 sslConfiguration。 如果在非安全模式 (QWebSocketServer::NonSecureMode) 下运行,则此方法无效。

27、QSslConfiguration sslConfiguration()

返回 SSL 配置。 如果服务器在非安全模式下运行,则此方法返回 QSslConfiguration::defaultConfiguration()。

28、QList<QWebSocketProtocol::Version> supportedVersions()

返回此服务器支持的 WebSocket 版本列表。

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」

版权声明:本文为CSDN博主「友善啊,朋友」的原创文章

原文链接:https://blog.csdn.net/kenfan1647/article/details/118445764