Qt之WebSockets

  1. 云栖社区>
  2. 博客>
  3. 正文

Qt之WebSockets

潘志闻 2016-09-18 14:45:00 浏览1498

简述

WebSocket 是一个基于 Web 的协议,旨在使 client 应用程序和远程主机之间进行双向通信。如果最初的握手成功,则两个实体可以来回发送数据。WebSocket 是通过用更少的网络延迟和最小数据交换来努力获取实时数据的应用程序解决方案。

优点

Qt WebSockets 使你能够构建 WebSocket 应用程序。它提供了一个 WebSocket 协议实现,由 IETF(Internet Engineering Task Force)提供,作为双向沟通的更好的选择使用现有 Web 基础架构。

历史上,需要双向沟通或推送通知的 Web 应用程序必须使用基于 HTTP 的解决方案之一,这些解决方案使用了不同的技术,例如:轮询、长轮询和流式查询,为了克服不支持这种用例的 HTTP 协议的局限性。其结果是:高网络延迟、不必要的数据交换、以及陈旧或过时数据。WebSocket 由 IETF 的帮助在很大的程度上克服了这些问题。

工作原理

这里写图片描述

正如上图所示,基于 WebSocket 的解决方案包括 client 和 server。本地 client 对于 WebSocket 的支持在大多数流行的 Web 浏览器中可用,例如:Google Chrome、Internet Explorer、Safari 等等。服务器端支持 WebSocket 使其成为一个实现双向通信的完整解决方案。任何支持原生 WebSocket 的浏览器应该可以使用 HTML5 WebSocket API 来运行一个简单的 HTML 和基于 JavaScript 的 client 应用程序。

一个 WebSocket 连接始于一个初始 HTTP 兼容的握手,这确保向后兼容性,使得 WebSocket 连接可以共用默认的 HTTP(80)和 HTTPS(443)端口。成功握手,连接便会打开用于数据交换,直到两个实体中的一个结束连接。

WebSocket 协议使用 ws: 和 wss: URL 协议,以分别代表不安全和安全的 WebSocket 请求。在初始握手时,如果检测到一个代理服务器,该协议试图通过向代理发出一个 HTTP CONNECT 语句来建立隧道。处理代理隧道的方法不管请求类型,尽管它被证明在安全连接中使用 TLS (Transport Layer Security)更好。

使用方式

要链接 WebSockets 模块,需要在 qmake.pro 文件中添加:

QT += websockets

在应用程序中使用此模块,使用以下 include 声明:

#include <QtWebSockets/QtWebSockets>

典型用例

WebSocket 最适合的场景:

  • 呈现的数据必须是最新的
  • 较低的网络延迟和最小的数据交换至关重要

例如,使用传统方法难以实现的一些应用程序:即时通讯、在线游戏、在线股票交易等等。

Qt WebSockets 的角色

Qt WebSockets 模块提供了一系列 API 来开发基于 WebSocket 的 server 和 client 应用程序。可以使用这些 API 的一个典型例子:一个提供了股票数据的 server 应用程序,和一个注册推送通知的 client,当有股票的价格变化时。

该模块提供了 C++ 和 QML 版本的 API,使 Qt 应用程序作为一个处理 WebSocket 请求的 server,或者一个可以使用从 server 接收到数据的 client,或两者兼而有之。可根据自己的需求选择合适的方式。

Qt WebSockets 与 Cloud Services

client 应用程序通常依赖于外部服务的数据。这些服务提供者大多数不支持 WebSocket,所以你最终需要开发一个感知 WebSocket 的 server 应用程序来填补这一缺口。可以在一个企业的 WebSocket 网关服务(例如:云服务)运行 server,避免了维护托管这样一个服务所需的必要的基础设施的麻烦。

大多数云服务提供了一个平台作为一个后台服务(PaaS),使 server 应用程序部署并且运行在云上。client 应用程序可以使用一个 WebSocket URL 连接到运行的 server 并且接收数据。

相关信息