当前位置:   article > 正文

微信小程序中WebSocket的运用_微信小程序websocket用法

微信小程序websocket用法

近期在开发一个类似于小年糕的小程序,当用户在合成影集后会立马跳到个人中心的影集列表,但是立刻跳过去,服务端并没有马上制作完成,所以会有个“影集正在制作中”的提示,为了避免用户退出页面重新请求查看影集是否制作完成,决定前后端通信采用websocket通信的方式,当有影集制作完成时,服务端可实时向用户推送消息。

websocket在实现时需要注意以下几点:

1. 微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该连接,并重新创建一个 WebSocket 连接。

2. WebSocket 链接默认和最大超时时间都是 60s,超过了这个时间会自动断开,所以要设置一个心跳链接。

3. 页面在卸载时要关闭socket的链接。

以下是websocket连接及心跳的实现

  1. // 域名地址(项目实地址)
  2. const Host = 'wss://xxxx:0000';
  3. // Socket连接成功
  4. var socketOpen = false;
  5. // Socket关闭
  6. var socketClose = false;
  7. // 消息队列
  8. var socketMsgQueue = [];
  9. // 判断心跳变量
  10. var heart = null;
  11. // 心跳失败次数
  12. var heartBeatFailCount = 0;
  13. // 终止心跳
  14. var heartBeatTimeout = null;
  15. // 终止重连
  16. var connectSocketTimeout = null;
  17. var webSocket = {
  18. // 连接Socket
  19. connectSocket:function(options) {
  20. wx.showLoading({
  21. title: '正在请求中',
  22. mask: true,
  23. });
  24. socketOpen = false;
  25. socketClose = false;
  26. socketMsgQueue = [];
  27. wx.connectSocket({
  28. url:Host,
  29. success:function(res) {
  30. if (options) {
  31. options.success && options.success(res);
  32. }
  33. },
  34. fail:function(res) {
  35. if (options) {
  36. options.fail && options.fail(res);
  37. }
  38. }
  39. })
  40. },
  41. // 发送消息
  42. sendSocketMessage:function(options) {
  43. if (socketOpen) {
  44. wx.sendSocketMessage({
  45. data: options.msg,
  46. success: function(res) {
  47. if (options) {
  48. options.success && options.success(res);
  49. }
  50. },
  51. fail: function(res) {
  52. if (options) {
  53. options.fail && options.fail(res);
  54. }
  55. }
  56. })
  57. } else {
  58. socketMsgQueue.push(options.msg)
  59. }
  60. },
  61. // 关闭Socket
  62. closeSocket: function(options) {
  63. if (connectSocketTimeout) {
  64. clearTimeout(connectSocketTimeout);
  65. connectSocketTimeout = null;
  66. };
  67. socketClose = true;
  68. this.stopHeartBeat();
  69. wx.closeSocket({
  70. success: function(res) {
  71. if (options) {
  72. options.success && options.success(res);
  73. }
  74. },
  75. fail: function(res) {
  76. if (options) {
  77. options.fail && options.fail(res);
  78. }
  79. }
  80. })
  81. },
  82. // 收到消息
  83. onSocketMessageCallback: function(msg) {},
  84. // 开始心跳
  85. startHeartBeat: function() {
  86. heart = true;
  87. this.heartBeat();
  88. },
  89. // 正在心跳
  90. heartBeat: function() {
  91. var that = this;
  92. if (!heart) {
  93. return;
  94. };
  95. that.sendSocketMessage({
  96. msg: JSON.stringify({
  97. // 与后端约定,传点消息,保持链接
  98. "msg_type": "heart"
  99. }),
  100. success: function(res) {
  101. if (heart) {
  102. heartBeatTimeout = setTimeout(() => {
  103. that.heartBeat();
  104. }, 7000);
  105. }
  106. },
  107. fail: function(res) {
  108. if (heartBeatFailCount > 2) {
  109. that.connectSocket();
  110. };
  111. if (heart) {
  112. heartBeatTimeout = setTimeout(() => {
  113. that.heartBeat();
  114. }, 7000);
  115. };
  116. heartBeatFailCount++;
  117. },
  118. });
  119. },
  120. // 结束心跳
  121. stopHeartBeat: function() {
  122. heart = false;
  123. if (heartBeatTimeout) {
  124. clearTimeout(heartBeatTimeout);
  125. heartBeatTimeout = null;
  126. };
  127. if (connectSocketTimeout) {
  128. clearTimeout(connectSocketTimeout);
  129. connectSocketTimeout = null;
  130. }
  131. }
  132. };
  133. // 监听WebSocket打开连接
  134. wx.onSocketOpen(function(res) {
  135. wx.hideLoading();
  136. // 如果已经关闭socket
  137. if (socketClose) {
  138. webSocket.closeSocket();
  139. } else {
  140. socketOpen = true
  141. for (var i = 0; i < socketMsgQueue.length; i++) {
  142. webSocket.sendSocketMessage(socketMsgQueue[i])
  143. };
  144. socketMsgQueue = []
  145. webSocket.startHeartBeat();
  146. }
  147. });
  148. // 监听WebSocket错误
  149. wx.onSocketError(function(res) {
  150. console.log('WebSocket连接打开失败,请检查!', res);
  151. });
  152. // 监听WebSocket接受到服务器的消息
  153. wx.onSocketMessage(function(res) {
  154. webSocket.onSocketMessageCallback(res.data);
  155. });
  156. // 监听WebSocket关闭连接后马上重连
  157. wx.onSocketClose(function(res) {
  158. if (!socketClose) {
  159. clearTimeout(connectSocketTimeout);
  160. connectSocketTimeout = setTimeout(() => {
  161. webSocket.connectSocket();
  162. }, 3000);
  163. }
  164. });
  165. module.exports = webSocket;

 以下是页面中的使用,其中在onSocketMessageCallback里面会有消息回调。

  1. const WebSocket = require('../../public/websocket.js');
  2. Page({
  3. // 页面加载
  4. onLoad: function(options) {
  5. // 创建连接
  6. WebSocket.connectSocket();
  7. // 设置接收消息回调
  8. WebSocket.onSocketMessageCallback = this.onSocketMessageCallback;
  9. },
  10. // Socket收到的信息
  11. onSocketMessageCallback: function(res) {
  12. console.log(res);
  13. },
  14. // 页面销毁时关闭连接
  15. onUnload: function(options) {
  16. WebSocket.closeSocket();
  17. },
  18. })

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

闽ICP备14008679号