赞
踩
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
要是对WebSocket 的基本知识都了解了,可以直接移步,实际如何使用这个类
(二) 用QWebSocket 实现服务端和客户端(详细代码直接使用)-CSDN博客
早期,很多网站为了实现推送技术,所用的技术都是轮询(也叫短轮询)。
轮询是指由浏览器每隔一段时间向服务器发出 HTTP 请求,然后服务器返回最新的数据给客户端。
1)建立在 TCP 协议之上,服务器端的实现比较容易;
2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,
并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器;
3)数据格式比较轻量,性能开销小,通信高效;
4)可以发送文本,也可以发送二进制数据;
5)没有同源限制,客户端可以与任意服务器通信;
6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL,
形如:ws://example.com:80/some/path。
WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层;
1)较少的控制开销:在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小;
2)更强的实时性:由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于 HTTP 请求需要等待客户端发起请求服务端才能响应,延迟明显更少;
3)保持连接状态:与 HTTP 不同的是,WebSocket 需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息;
4)更好的二进制支持:WebSocket 定义了二进制帧,相对 HTTP,可以更轻松地处理二进制内容;
5)可以支持扩展:WebSocket 定义了扩展,用户可以扩展协议、实现部分自定义的子协议。
由于 WebSocket 拥有上述的优点,所以它被广泛地应用在即时通讯/IM、实时音视频、在线教育和游戏等领域。
主要用到的一些接口:(主要步骤)
#include <QWebSocket> QWebSocket* m_pDataRecvWS = new QWebSocket(); m_pDataRecvWS->open(QUrl("URL"));//形如:ws://example.com:80/some/path //客户端发出请求后,服务器会处理发相应的信号: //1、连接成功后 connected(); //2、连接失败 disconnected(); //3、收到数据 textMessageReceived(); //常用的函数-------------------------------------- //发送消息 sendTextMessage()
简单的一个例子:
//例子 QTimer m_timer = new QTimer();//重连计时器 if (m_pDataRecvWS == nullptr) { m_pDataRecvWS = new QWebSocket(); connect(m_pDataRecvWS, &QWebSocket::disconnected, this, &WebSocketClient::slotOnDisConnected, Qt::AutoConnection); connect(m_pDataRecvWS, &QWebSocket::textMessageReceived, this, &WebSocketClient::slotOnTextReceived, Qt::AutoConnection); connect(m_pDataRecvWS, &QWebSocket::connected, this, &WebSocketClient::slotOnConnected, Qt::AutoConnection); connect(m_timer, QTimer::timeout, this, &WebSocketClient::slotReconnect, Qt::AutoConnection); m_pDataRecvWS->open(QUrl(m_strURL)); } //连接成功-关闭重连的计时器 void WebSocketClient::slotOnConnected() { m_bConnectStatus = true; m_timer->stop(); } //连接失败-启动计时器准备重连 void WebSocketClient::slotOnDisConnected() { m_bConnectStatus = false; m_timer->start(3000);/*-<当连接失败时,触发重连计时器,设置计数周期为3秒 */ } //重连 void WebSocketClient::slotReconnect()   **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。** **[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)** **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!** **[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)** **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。