socket_api.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. // 域名地址(项目实地址)
  2. const Host = 'ws://id27149.com:2222/codec'; //codecserver网站
  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(sever_url, success_cb, fail_cb) {
  20. wx.showLoading({
  21. title: '正在请求中',
  22. mask: true,
  23. });
  24. socketOpen = false;
  25. socketClose = false;
  26. socketMsgQueue = [];
  27. wx.connectSocket({
  28. url:sever_url,
  29. success:function(res) {
  30. if (success_cb) {
  31. success_cb(res);
  32. }
  33. },
  34. fail:function(res) {
  35. if (fail_cb) {
  36. fail_cb(res);
  37. }
  38. }
  39. })
  40. },
  41. // 发送消息
  42. SocketTxMsg:function(msg, success_cb, fail_cb) {
  43. if (socketOpen) {
  44. wx.sendSocketMessage({
  45. data: msg,
  46. success: function(res) {
  47. if (success_cb) {
  48. success_cb(res);
  49. }
  50. },
  51. fail: function(res) {
  52. if (fail_cb) {
  53. fail_cb(res);
  54. }
  55. }
  56. })
  57. } else {
  58. socketMsgQueue.push(options.msg)
  59. }
  60. },
  61. // 关闭Socket
  62. closeSocket: function(success_cb, fail_cb) {
  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 (success_cb) {
  72. success_cb(res);
  73. }
  74. },
  75. fail: function(res) {
  76. if (fail_cb) {
  77. fail_cb(res);
  78. }
  79. }
  80. })
  81. },
  82. // 收到消息
  83. onSocketMessageCallback: function(msg) {
  84. console.log("收到服务器消息:", msg)
  85. },
  86. // 开始心跳
  87. startHeartBeat: function() {
  88. heart = true;
  89. this.heartBeat();
  90. },
  91. // 正在心跳
  92. heartBeat: function() {
  93. console.log("启动心跳")
  94. // 与后端约定,传点消息,保持链接
  95. var heartbeat_data = "123456"
  96. var that = this;
  97. if (!heart) {
  98. return;
  99. };
  100. if (socketOpen) {
  101. wx.sendSocketMessage({
  102. data: JSON.stringify({
  103. "method": "heartbeat",
  104. "args": "1234"
  105. }),
  106. success: function(res) {
  107. console.log("心跳发送成功, res:", res)
  108. if (heart) {
  109. heartBeatTimeout = setTimeout(() => {
  110. that.heartBeat();
  111. }, 7000);
  112. }
  113. },
  114. fail: function(res) {
  115. console.log("心跳发送失败, res:", res)
  116. if (heartBeatFailCount > 2) {
  117. that.connectSocket();
  118. };
  119. if (heart) {
  120. heartBeatTimeout = setTimeout(() => {
  121. that.heartBeat();
  122. }, 7000);
  123. };
  124. heartBeatFailCount++;
  125. },
  126. });
  127. }else{
  128. // socketMsgQueue.push(heartbeat_data)
  129. }
  130. },
  131. // 结束心跳
  132. stopHeartBeat: function() {
  133. console.log("结束心跳")
  134. heart = false;
  135. if (heartBeatTimeout) {
  136. clearTimeout(heartBeatTimeout);
  137. heartBeatTimeout = null;
  138. };
  139. if (connectSocketTimeout) {
  140. clearTimeout(connectSocketTimeout);
  141. connectSocketTimeout = null;
  142. }
  143. }
  144. };
  145. // 监听WebSocket打开连接
  146. wx.onSocketOpen(function(res) {
  147. wx.hideLoading();
  148. // 如果已经关闭socket
  149. if (socketClose) {
  150. webSocket.closeSocket();
  151. } else {
  152. console.log("打开socket成功")
  153. socketOpen = true
  154. for (var i = 0; i < socketMsgQueue.length; i++) {
  155. // webSocket.SocketTxMsg(socketMsgQueue[i], null, null)
  156. wx.sendSocketMessage({
  157. data: socketMsgQueue[i],
  158. success: function(res) {
  159. console.log("send success, res:", res)
  160. },
  161. fail: function(res) {
  162. console.log("send fail, res:", res)
  163. }
  164. })
  165. };
  166. socketMsgQueue = []
  167. // webSocket.startHeartBeat();
  168. }
  169. });
  170. // 监听WebSocket错误
  171. wx.onSocketError(function(res) {
  172. console.log('WebSocket连接打开失败,请检查!', res);
  173. });
  174. // 监听WebSocket接受到服务器的消息
  175. wx.onSocketMessage(function(res) {
  176. webSocket.onSocketMessageCallback(res.data);
  177. });
  178. // 监听WebSocket关闭连接后马上重连
  179. wx.onSocketClose(function(res) {
  180. if (!socketClose) {
  181. clearTimeout(connectSocketTimeout);
  182. connectSocketTimeout = setTimeout(() => {
  183. webSocket.connectSocket();
  184. }, 8000);
  185. }
  186. });
  187. module.exports = webSocket;