WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。想对应http协议来说,websocket更加的平等,在http协议中,只有客户端向服务器发送申请请求之后,服务器才会返回请求的数据,如果要保证实时性的话,就需要不断地轮询,每隔一段时间就向服务器发送一个请求,这样就会造成很大的开销,而WebSocket服务器主动向客户端发送数据,而不需要申请,客户端发送数据给服务器也是如此
简单来说,就是浏览器和服务器之间通信的一种协议,相比较http来说,数据交换更加平等,开销更小;
要想在Qt实现websocket那么我们主要的就是实现一个服务器,由网页实现一个客户端
要实现服务器,首先要认识QWebSocketServer Class,我们需要通过这个类实现

从上图可以知道,需要在.pro文件中添加QT+=websockets,然后添加头文件,新建一个WebSocketTest窗口应用程序,试图如下

在WebSocketTest中添加下面的语句
QT += websockets
在websockettest.h中添加头文件,声明变量
- #ifndef WEBSOCKETTEST_H
- #define WEBSOCKETTEST_H
-
- #include
- #include
-
- QT_BEGIN_NAMESPACE
- namespace Ui { class WebSocketTest; }
- QT_END_NAMESPACE
-
- class WebSocketTest : public QWidget
- {
- Q_OBJECT
-
- public:
- WebSocketTest(QWidget *parent = nullptr);
- ~WebSocketTest();
-
- private:
- Ui::WebSocketTest *ui;
-
- //声明QWebSocketServer变量
- QWebSocketServer *web_server;
-
- };
- #endif // WEBSOCKETTEST_H
再来看一看关于这个类的使用,类名上面F1进入帮助界面,可以看到

翻译过来就是
QWebSocketServer是一个基于QTcpServer模型的类,用于处理WebSocket协议的服务器端通信。如果你知道如何使用QTcpServer,你就可以很轻松的使用QWebSocketServer。
QWebSocketServer类主要用于接收并处理来自客户端的WebSocket连接,你可以手动设定服务端的端口,也可以让QWebSocketServer自动选择。调用listen()函数即可让服务器开始侦听连接请求。
每当有新的客户端尝试连接服务器时,newConnection()信号就会发出。服务器可以调用nextPendingConnection()方法接受这个握手请求,同时返回一个已经连接状态的QWebSocket对象指针,服务器即可通过这个指针和客户端进行通信。
如果在过程中发生错误,serverError()方法可以获取错误类型,同时可以调用errorString()方法获取人类可读的错误描述。
当服务器侦听连接请求时,可以通过serverAddress()和serverPort()来获取服务器正在侦听的地址和端口。调用close()函数可以使QWebSocketServer停止侦听连接请求。
QWebSocketServer当前还不支持WebSocket拓展和WebSocket子协议。该类仅支持RFC 6455中规定的WebSocket协议的13版。
有一个默认的握手超时设置为10秒,主要用于防止拒绝服务攻击,该超时时间可以通过setHandshakeTimeout()自定义。
参见WebSocket Server Example和QWebSocket。
也就是说使用listen函数监听连接请求,一旦有新的客户端连接,就可以触发newConnection()信号,再由服务器通过nextPendingConnection()方法接收这个客户端的连接,这个方法返回一个QWebsocket的对象指针,通过这个指针就可以和客户端通信了
首先客户端代码我这里直接提供一个可以测试的html,新建一个文本文件,将下面内容复制进去,保存后,将后缀改为html,点击使用浏览器打开。
- html>
- <html>
WebSocket Test - #testButton {
- display: block;
- margin: 20px auto;
- padding: 10px 20px;
- font-size: 16px;
- }
- #messageDisplay {
- margin: 20px auto;
- padding: 10px;
- border: 1px solid #ccc;
- width: 80%;
- height: 200px;
- overflow-y: scroll;
- font-size: 14px;
- }
- <body>
- <button id="testButton">Send Test Messagebutton>
- <div id="messageDisplay">div>
-
- var ws = new WebSocket('ws://localhost:15678');
- ws.onopen = function() {
- console.log('WebSocket connection opened.');
- };
- ws.onmessage = function(event) {
- console.log('Message from server:', event.data);
- var messageDisplay = document.getElementById('messageDisplay');
- messageDisplay.innerHTML += '
' + event.data + '
'; - };
- ws.onerror = function(error) {
- console.error('WebSocket error:', error);
- };
- ws.onclose = function() {
- console.log('WebSocket connection closed.');
- };
- document.getElementById('testButton').onclick = function() {
- ws.send('Test');
- console.log('Test message sent.');
- };