天天看點

Qt網絡程式設計:QWebSocket、QWebSocketServer

作者:QT教程
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