(一)WebSocket 详解,以及用QWebSocket 实现服务端和客户端(含代码例子)(1)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

3)数据格式比较轻量,性能开销小,通信高效;

4)可以发送文本,也可以发送二进制数据;

5)没有同源限制,客户端可以与任意服务器通信;

6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL,

形如:ws://example.com:80/some/path。

3、 WebSocket 简介

WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层;

4、WebSocket 优点

1)较少的控制开销:在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小;

2)更强的实时性:由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于 HTTP 请求需要等待客户端发起请求服务端才能响应,延迟明显更少;

3)保持连接状态:与 HTTP 不同的是,WebSocket 需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息;

4)更好的二进制支持:WebSocket 定义了二进制帧,相对 HTTP,可以更轻松地处理二进制内容;

5)可以支持扩展:WebSocket 定义了扩展,用户可以扩展协议、实现部分自定义的子协议。

由于 WebSocket 拥有上述的优点,所以它被广泛地应用在即时通讯/IM、实时音视频、在线教育和游戏等领域。

5、QWebSocket通讯—客户端:

主要用到的一些接口:(主要步骤)

#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()
{
    m_pDataRecvWS->abort();
    m_pDataRecvWS->open(QUrl(m_strURL));
}

//收到消息
void WebSocketClient::slotOnTextReceived(const QString& msg)
{
   // todo
}



6、QWebSocket通讯—服务端:

主要用到的一些接口:(主要步骤)

//声明变量
QWebSocketServer *m_pWebSocketServer;
QList<QWebSocket *> m_clients;//保存连接的客户端
unsigned short mPort;//端口号
QString mServerName;//服务器名字

//1、创建服务器
m_pWebSocketServer = new QWebSocketServer(mServerName, QWebSocketServer::NonSecureMode, this);

//2、监听
m_pWebSocketServer->listen(QHostAddress::LocalHost, mPort);//端口号

//3、有新的连接,会发这个信号
connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &WebSocketServer::onNewConnection);


//4、获得新的客户端nextPendingConnection
void WebSocketServer::onNewConnection()
{
    auto pSocket = m_pWebSocketServer->nextPendingConnection();
    pSocket->setParent(this);
    connect(pSocket, &QWebSocket::textMessageReceived, this, &WebSocketServer::processMessage);


![img](https://img-blog.csdnimg.cn/img_convert/cf4b77441fc5bca30d56edea15c7ad0d.png)
![img](https://img-blog.csdnimg.cn/img_convert/b8c9a8ca8987a1380a53d73328d7f61a.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**


**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值