当前位置:   article > 正文

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

qwebsocket

目录

前言:

1、WebSocket 诞生背景

2、WebSocket的特点:

3、 WebSocket 简介

4、WebSocket 优点

5、QWebSocket通讯—客户端:

6、QWebSocket通讯—服务端:


前言:

        要是对WebSocket 的基本知识都了解了,可以直接移步,实际如何使用这个类

(二) 用QWebSocket 实现服务端和客户端(详细代码直接使用)-CSDN博客

1、WebSocket 诞生背景

早期,很多网站为了实现推送技术,所用的技术都是轮询(也叫短轮询)。

轮询是指由浏览器每隔一段时间向服务器发出 HTTP 请求,然后服务器返回最新的数据给客户端

2、WebSocket的特点:

1)建立在 TCP 协议之上,服务器端的实现比较容易;

2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,

并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器;

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通讯—客户端:

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

  1. #include <QWebSocket>
  2. QWebSocket* m_pDataRecvWS = new QWebSocket();
  3. m_pDataRecvWS->open(QUrl("URL"));//形如:ws://example.com:80/some/path
  4. //客户端发出请求后,服务器会处理发相应的信号:
  5. //1、连接成功后
  6. connected();
  7. //2、连接失败
  8. disconnected();
  9. //3、收到数据
  10. textMessageReceived();
  11. //常用的函数--------------------------------------
  12. //发送消息
  13. sendTextMessage()

简单的一个例子:

  1. //例子
  2. QTimer m_timer = new QTimer();//重连计时器
  3. if (m_pDataRecvWS == nullptr)
  4. {
  5. m_pDataRecvWS = new QWebSocket();
  6. connect(m_pDataRecvWS, &QWebSocket::disconnected, this, &WebSocketClient::slotOnDisConnected, Qt::AutoConnection);
  7. connect(m_pDataRecvWS, &QWebSocket::textMessageReceived, this, &WebSocketClient::slotOnTextReceived, Qt::AutoConnection);
  8. connect(m_pDataRecvWS, &QWebSocket::connected, this, &WebSocketClient::slotOnConnected, Qt::AutoConnection);
  9. connect(m_timer, QTimer::timeout, this, &WebSocketClient::slotReconnect, Qt::AutoConnection);
  10. m_pDataRecvWS->open(QUrl(m_strURL));
  11. }
  12. //连接成功-关闭重连的计时器
  13. void WebSocketClient::slotOnConnected()
  14. {
  15. m_bConnectStatus = true;
  16. m_timer->stop();
  17. }
  18. //连接失败-启动计时器准备重连
  19. void WebSocketClient::slotOnDisConnected()
  20. {
  21. m_bConnectStatus = false;
  22. m_timer->start(3000);/*-<当连接失败时,触发重连计时器,设置计数周期为3秒 */
  23. }
  24. //重连
  25. void WebSocketClient::slotReconnect()
  26. {
  27. m_pDataRecvWS->abort();
  28. m_pDataRecvWS->open(QUrl(m_strURL));
  29. }
  30. //收到消息
  31. void WebSocketClient::slotOnTextReceived(const QString& msg)
  32. {
  33. // todo
  34. }

6、QWebSocket通讯—服务端:

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

  1. //声明变量
  2. QWebSocketServer *m_pWebSocketServer;
  3. QList<QWebSocket *> m_clients;//保存连接的客户端
  4. unsigned short mPort;//端口号
  5. QString mServerName;//服务器名字
  6. //1、创建服务器
  7. m_pWebSocketServer = new QWebSocketServer(mServerName, QWebSocketServer::NonSecureMode, this);
  8. //2、监听
  9. m_pWebSocketServer->listen(QHostAddress::LocalHost, mPort);//端口号
  10. //3、有新的连接,会发这个信号
  11. connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &WebSocketServer::onNewConnection);
  12. //4、获得新的客户端nextPendingConnection
  13. void WebSocketServer::onNewConnection()
  14. {
  15. auto pSocket = m_pWebSocketServer->nextPendingConnection();
  16. pSocket->setParent(this);
  17. connect(pSocket, &QWebSocket::textMessageReceived, this, &WebSocketServer::processMessage);
  18. connect(pSocket, &QWebSocket::disconnected, this, &WebSocketServer::socketDisconnected);
  19. m_clients << pSocket;//放进去客户端列表
  20. }
  21. //5、接收到信息
  22. void WebSocketServer::processMessage(const QString &message)
  23. {
  24. QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
  25. for (QWebSocket *pClient : qAsConst(m_clients))
  26. {
  27. emit processServerMessage(message);
  28. if (pClient != pSender) //don't echo message back to sender
  29. pClient->sendTextMessage(message);
  30. }
  31. }
  32. //6、断开连接
  33. void WebSocketServer::socketDisconnected()
  34. {
  35. QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
  36. QTextStream(stdout) << getIdentifier(pClient) << " disconnected!\n";
  37. if (pClient)
  38. {
  39. m_clients.removeAll(pClient);
  40. pClient->deleteLater();
  41. }
  42. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/964082
推荐阅读
相关标签
  

闽ICP备14008679号