websocket初始化

锦通  论坛元老 | 2024-11-17 09:05:39 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1582|帖子 1582|积分 4746

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
websocket初始化

媒介

上一集我们HTTP的ping操纵就可以跑通了,那么我们还有一个协议---websocket,我们在这一集就要去完成我们websocket的初始化。
分析

我们在初始化websocket的之前,我们考虑一下,我们什么时候就要初始化我们的websocket?
我们是不是应该在步伐一启动,我们就和我们的websocket的服务端那里创建连接?
那么我们就需要把初始化websocket的方法直接放在我们NetClient的构造函数当中,只要我们一创建一个NetClient就会直接初始化我们的websocket。
客户端

initWebsocket

我们初始化websocket需要考虑的只有两个因素。
第一,websocket的五种信号的处理,我们需要使用信号槽对五种信号进行处理。
第二,我们需要连接服务器。
我们的五种信号为:


  • 创建连接之后connected
  • 断开连接之后disconnected
  • 连接堕落的情况 errorOccurred
  • 收到 文本消息 textMessageReceived
  • 收到二进制消息 binaryMessageReceived
  1. void NetClient::initWebsocket()
  2. {
  3.     //信号槽
  4.     connect(&webSocketClient, &QWebSocket::connected, this, [=](){
  5.         LOG() <<"websocket 连接成功!";
  6.     });
  7.     connect(&webSocketClient, &QWebSocket::disconnected, this, [=](){
  8.         LOG() <<"websocket 连接断开!";
  9.     });
  10.     connect(&webSocketClient, &QWebSocket::errorOccurred,  this, [=](QAbstractSocket::SocketError error){
  11.         LOG() <<"websocket 连接失败! 错误原因:" << error;
  12.     });
  13.     connect(&webSocketClient, &QWebSocket::textMessageReceived, this, [=](const QString& message){
  14.         LOG() <<"websocket 收到文本消息!message=" << message;
  15.     });
  16.     connect(&webSocketClient, &QWebSocket::binaryMessageReceived, this, [=](const QByteArray& byteArray){
  17.         LOG() <<"websocket 收到二进制消息! length:" << byteArray.length();
  18.         //todo:
  19.     });
  20.     //服务器连接
  21.     webSocketClient.open(WEBSOCKET_URL);
  22. }
复制代码
这里我们二进制就只打印长度,后续还有内容需要完成,先不讲。
服务端

我们的服务端的websocket也是需要单例模式,提醒一下,我们是持久化的连接的哦!
我们在构造函数里,给websocket设置服务器的名字,以及让websocket的安全模式设置为非安全模式。意味着这个 WebSocket 服务器不会使用加密连接(即不使用 WSS,而是使用 WS)。如果你需要加密连接,可以使用 QWebSocketServer::SecureMode,但这通常需要额外的配置,好比 SSL/TLS 证书。
  1. class WebsocketServer : public QObject{
  2.     Q_OBJECT
  3. private:
  4.     static WebsocketServer* instance;
  5.     WebsocketServer()
  6.         : websocketServer("websocket server", QWebSocketServer::NonSecureMode)
  7.     {}
  8.     QWebSocketServer websocketServer;
  9. public:
  10.     static WebsocketServer* getInstance();
  11.     bool init();
  12. };
复制代码
init

我们需要用信号槽来创建我们的新连接。新连接之后我们就获取到用来通信的socket对象,之后我们还是像客户端的代码有四种信号。我们末了需要绑定端口启动我们的服务,当然我们监听的是我们的8001的端标语,这个也是我们在NetClient内里规定的。
  1. bool WebsocketServer::init()
  2. {
  3.     //信号槽
  4.     connect(&websocketServer, &QWebSocketServer::newConnection, this, [=](){
  5.         //连接建立成功
  6.         qDebug() << "[websocket] 连接建立成功!";
  7.         //获取到用来通信的socket对象
  8.         QWebSocket* socket = websocketServer.nextPendingConnection();
  9.         //剩余信号处理
  10.         connect(socket, &QWebSocket::disconnected, this, [=](){
  11.             qDebug() << "[websocket] 连接断开!";
  12.         });
  13.         connect(socket, &QWebSocket::errorOccurred, this, [=](QAbstractSocket::SocketError error){
  14.             qDebug() << "[websocket] 连接失败! 错误原因" << error;
  15.         });
  16.         connect(socket, &QWebSocket::textMessageReceived, this, [=](const QString& message){
  17.             qDebug() << "[websocket] 收到文本数据!message=" << message;
  18.         });
  19.         connect(socket, &QWebSocket::binaryMessageReceived, this, [=](const QByteArray& byteArray){
  20.             qDebug() << "[websocket] 收到二进制数据! length=" << byteArray.length();
  21.         });
  22.     });
  23.     //绑定端口启动服务
  24.     bool ok = websocketServer.listen(QHostAddress::Any, 8001);
  25.     return ok;
  26. }
复制代码
测试

  1. WebsocketServer* websocketServer = WebsocketServer::getInstance();
  2.     if(!websocketServer->init()){
  3.         qDebug() << "websocket 服务器启动失败!";
  4.         return 1;
  5.     }
  6.     qDebug() << "websocket 服务器启动成功!";
复制代码
  1. NetClient::NetClient(model::DataCenter *dataCenter)
  2.     :dataCenter(dataCenter)
  3. {
  4.     initWebsocket();
  5. }
复制代码
这样,我们先启动服务端,再启动客户端就可以自动连接我们的websocket了。
看看我们的测试结果。


那么我们就完成了这一集的任务,那么我们等候下一集!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表