QT - WebSockets
WebSocket是基于Web的協(xié)議,旨在在客戶端應(yīng)用程序和遠(yuǎn)程主機(jī)之間實(shí)現(xiàn)雙向通信陌知。如果初始握手成功他托,它將使兩個實(shí)體來回發(fā)送數(shù)據(jù)。WebSocket是應(yīng)用程序通過較少的網(wǎng)絡(luò)延遲和最少的數(shù)據(jù)交換來獲取實(shí)時數(shù)據(jù)源的解決方案仆葡。
Qt WebSockets模塊提供了C ++和QML接口赏参,這些接口使Qt應(yīng)用程序充當(dāng)可以處理WebSocket請求的服務(wù)器,可以充當(dāng)從服務(wù)器接收的數(shù)據(jù)的客戶端的客戶端沿盅,或者兩者都可以把篓。
入門
要包括模塊類的定義,請使用以下指令:
#include <QtWebSockets/QtWebSockets>
要將QML類型導(dǎo)入到您的應(yīng)用程序中腰涧,請在.qml文件中使用以下import語句:
import QtWebSockets 1.14
要鏈接該模塊韧掩,請將以下行添加到您的qmake .pro文件中:
QT += websockets
Qt WebSockets概述
Qt WebSockets使您能夠構(gòu)建支持WebSocket的應(yīng)用程序。它提供了WebSocket協(xié)議的實(shí)現(xiàn)窖铡,該協(xié)議由IETF(Internet工程任務(wù)組)提供疗锐,是使用現(xiàn)有Web基礎(chǔ)結(jié)構(gòu)進(jìn)行雙向通信的更好替代方案坊谁。
從歷史上看,需要雙向通信或推送通知的Web應(yīng)用程序必須使用可用的基于HTTP的解決方案窒悔。這些解決方案采用了諸如輪詢呜袁,長輪詢和流傳輸之類的不同技術(shù)來克服HTTP協(xié)議的局限性,這些協(xié)議并非針對此類用例而設(shè)計简珠。這導(dǎo)致高網(wǎng)絡(luò)延遲阶界,不必要的數(shù)據(jù)交換以及陳舊或舊數(shù)據(jù)。IETF 的WebSocket產(chǎn)品有助于在很大程度上克服這些問題聋庵。
它是如何工作的膘融?
如您在圖片表示中所看到的,基于WebSocket的解決方案由客戶端和服務(wù)器端組成祭玉。大多數(shù)流行的Web瀏覽器(例如Google Chrome氧映,Internet Explorer,Safari等)都提供對WebSocket的本地客戶端支持脱货。WebSocket的服務(wù)器端支持使其成為完整的解決方案岛都,從而實(shí)現(xiàn)了雙向通信。任何具有本地WebSocket支持的瀏覽器都應(yīng)允許您使用HTML5 WebSocket API 運(yùn)行基于HTML和JavaScript的簡單客戶端應(yīng)用程序振峻。
網(wǎng)頁套接字WebSocket連接開始于初始HTTP兼容握手臼疫,這保證向后兼容性,使得WebSocket連接可以共享默認(rèn)HTTP(80)和HTTPS(443)端口扣孟。成功握手后烫堤,連接將打開以進(jìn)行數(shù)據(jù)交換,直到兩個實(shí)體之一結(jié)束連接凤价。
網(wǎng)頁套接字WebSocket協(xié)議使用ws
:和wss
:URL方案分別代表不安全和安全的WebSocket請求鸽斟。在初始握手期間,如果檢測到代理服務(wù)器利诺,則協(xié)議會通過向HTTP CONNECT
代理發(fā)布一條語句來嘗試建立隧道富蓄。盡管已證明在安全連接中使用TLS(傳輸層安全性)可以更好地工作,但無論請求類型如何立轧,都使用隧道方法來處理代理格粪。
典型用例
WebSocket最適合以下情況:
- 實(shí)時更新數(shù)據(jù)
- 低網(wǎng)絡(luò)延遲和最少的數(shù)據(jù)交換至關(guān)重要。
我們努力使用傳統(tǒng)方法來實(shí)現(xiàn)這些目標(biāo)的一些示例應(yīng)用程序例如:即時消息傳遞氛改,在線游戲,在線股票交易等比伏。
Qt WebSockets的作用
Qt WebSockets模塊提供API胜卤,以開發(fā)基于WebSocket的服務(wù)器和客戶端應(yīng)用程序×尴睿可以使用這些API的示例是提供股票數(shù)據(jù)的服務(wù)器應(yīng)用程序葛躏,以及當(dāng)少數(shù)股票價格發(fā)生變化時注冊推送通知的客戶端應(yīng)用程序澈段。
該模塊提供API的C ++和QML版本,因此您可以選擇適合您需要的替代方法舰攒。
帶有云服務(wù)的Qt WebSockets
客戶端應(yīng)用程序通常依賴于外部服務(wù)來獲取數(shù)據(jù)败富。這些服務(wù)提供商中的大多數(shù)還不支持WebSocket,因此最終需要開發(fā)可可感知WebSocket(WebSocket-aware)的服務(wù)器應(yīng)用程序以彌合差距摩窃。您可以在企業(yè)WebSocket網(wǎng)關(guān)服務(wù)(例如云服務(wù))上運(yùn)行服務(wù)器兽叮,從而避免了維護(hù)承載此類服務(wù)所需的必要基礎(chǔ)結(jié)構(gòu)的麻煩。
大多數(shù)云服務(wù)都提供平臺即服務(wù)(PaaS)后端猾愿,該后端可在云上部署和運(yùn)行服務(wù)器應(yīng)用程序的實(shí)例鹦聪。客戶端應(yīng)用程序可以使用WebSocket URL 連接到正在運(yùn)行的服務(wù)器并接收數(shù)據(jù)蒂秘。
相關(guān)信息
WebSocket QML Type
Properties
-
active : bool
設(shè)置為true時泽本,將使用給定的URL與服務(wù)器建立連接。設(shè)置為false時姻僧,連接關(guān)閉规丽。默認(rèn)值為false。 -
errorString: QString
包含對最后發(fā)生的錯誤的描述撇贺。如果未發(fā)生任何錯誤赌莺,則此字符串為空。 -
status: Status
WebSocket的狀態(tài)显熏。狀態(tài)可以具有以下值:- WebSocket.Connecting
- WebSocket.Open
- WebSocket.Closing
- WebSocket.Closed
- WebSocket.Error
-
url: QUrl
要連接的服務(wù)器網(wǎng)址雄嚣。網(wǎng)址必須具有以下兩種方案之一:ws://或wss://。如果未提供喘蟆,則使用ws://缓升。
Signals
-
binaryMessageReceived(message)
接收到二進(jìn)制消息時將發(fā)出此信號。消息包含收到的字節(jié)蕴轨。這個信號是在Qt 5.8中引入的港谊。 -
statusChanged(status)
WebSocket的狀態(tài)更改時,將發(fā)出此信號橙弱。該狀態(tài)參數(shù)提供的當(dāng)前狀態(tài)歧寺。
參見WebSocket :: status。 -
textMessageReceived(message)
收到文本信息時發(fā)出此信號棘脐。消息包含收到的字節(jié)斜筐。
Methods
- void sendBinaryMessage(message)
將二進(jìn)制消息發(fā)送到服務(wù)器。此方法在Qt 5.8中引入蛀缝。 - void sendTextMessage(message)
將文本消息發(fā)送到服務(wù)器顷链。
WebSocketServer QML Type
Properties
-
accept : bool
設(shè)置為true以在服務(wù)器偵聽時接受傳入的客戶端連接。設(shè)置為false時屈梁,拒絕傳入連接嗤练。默認(rèn)情況下榛了,接受連接。 -
errorString: QString
字符串化的錯誤消息煞抬,以防發(fā)生錯誤霜大。 -
host : QString
服務(wù)器的主機(jī)地址。默認(rèn)情況下革答,使用本地主機(jī)战坤。 -
listen: bool
服務(wù)器應(yīng)偵聽客戶端連接時設(shè)置為true,否則設(shè)置為false蝗碎。設(shè)置為true時湖笨,服務(wù)器將偵聽主機(jī)和端口定義的指定url;如果accept為true蹦骑,則接受傳入的客戶端連接慈省。否則,服務(wù)器將關(guān)閉眠菇。默認(rèn)情況下边败,服務(wù)器不監(jiān)聽。 -
name: QString
在HTTP握手階段使用的服務(wù)器名稱捎废。 -
port: int
該服務(wù)器正在偵聽的端口笑窜。該值必須在0-65535的范圍內(nèi)。
默認(rèn)情況下登疗,將自動選擇端口排截。 -
url : QUrl
客戶端WebSocket可以連接的服務(wù)器URL 。url使用ws://方案辐益,并包括服務(wù)器偵聽的端口和服務(wù)器的主機(jī)地址断傲。
Signals
-
clientConnected(webSocket)
當(dāng)客戶端連接到該服務(wù)器時,將發(fā)出此信號智政。webSocket是新創(chuàng)建的WebSocket