wssocket.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. let wsurl = "";
  2. let accessToken = "";
  3. let messageCallBack = null;
  4. let closeCallBack = null;
  5. let connectCallBack = null;
  6. let isConnect = false; //连接标识 避免重复连接
  7. let rec = null;
  8. let isInit = false;
  9. let init = () => {
  10. // 防止重复初始化
  11. if (isInit) {
  12. return;
  13. }
  14. isInit = true;
  15. uni.onSocketOpen((res) => {
  16. console.log("WebSocket连接已打开");
  17. isConnect = true;
  18. // 发送登录命令
  19. let loginInfo = {
  20. cmd: 0,
  21. data: {
  22. accessToken: accessToken
  23. }
  24. };
  25. uni.sendSocketMessage({
  26. data: JSON.stringify(loginInfo)
  27. });
  28. })
  29. uni.onSocketMessage((res) => {
  30. let sendInfo = JSON.parse(res.data)
  31. if (sendInfo.cmd == 0) {
  32. heartCheck.start()
  33. connectCallBack && connectCallBack();
  34. console.log('WebSocket登录成功')
  35. } else if (sendInfo.cmd == 1) {
  36. // 重新开启心跳定时
  37. heartCheck.reset();
  38. } else {
  39. // 其他消息转发出去
  40. console.log("接收到消息", sendInfo);
  41. messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data)
  42. }
  43. })
  44. uni.onSocketClose((res) => {
  45. console.log('WebSocket连接关闭')
  46. isConnect = false; //断开后修改标识
  47. closeCallBack && closeCallBack(res);
  48. })
  49. uni.onSocketError((e) => {
  50. console.log(e)
  51. isConnect = false; //连接断开修改标识
  52. uni.showModal({
  53. content: '连接失败,可能是websocket服务不可用,请稍后再试',
  54. showCancel: false,
  55. })
  56. })
  57. };
  58. let connect = (url, token) => {
  59. wsurl = url;
  60. accessToken = token;
  61. if (isConnect) {
  62. return;
  63. }
  64. uni.connectSocket({
  65. url: wsurl,
  66. success: (res) => {
  67. console.log("websocket连接成功");
  68. },
  69. fail: (e) => {
  70. console.log(e);
  71. console.log("websocket连接失败,10s后重连");
  72. setTimeout(() => {
  73. connect();
  74. }, 10000)
  75. }
  76. });
  77. }
  78. //定义重连函数
  79. let reconnect = (wsurl, accessToken) => {
  80. console.log("尝试重新连接");
  81. if (isConnect) {
  82. //如果已经连上就不在重连了
  83. return;
  84. }
  85. rec && clearTimeout(rec);
  86. rec = setTimeout(function() { // 延迟15秒重连 避免过多次过频繁请求重连
  87. connect(wsurl, accessToken);
  88. }, 15000);
  89. };
  90. //设置关闭连接
  91. let close = () => {
  92. if (!isConnect) {
  93. return;
  94. }
  95. uni.closeSocket({
  96. code: 3000,
  97. complete: (res) => {
  98. console.log("关闭websocket连接");
  99. isConnect = false;
  100. },
  101. fail: (e) => {
  102. console.log("关闭websocket连接失败", e);
  103. }
  104. });
  105. };
  106. //心跳设置
  107. var heartCheck = {
  108. timeout: 10000, //每段时间发送一次心跳包 这里设置为30s
  109. timeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
  110. start: function() {
  111. if (isConnect) {
  112. console.log('发送WebSocket心跳')
  113. let heartBeat = {
  114. cmd: 1,
  115. data: {}
  116. };
  117. uni.sendSocketMessage({
  118. data: JSON.stringify(heartBeat),
  119. fail(res) {
  120. console.log(res);
  121. }
  122. })
  123. }
  124. },
  125. reset: function() {
  126. clearTimeout(this.timeoutObj);
  127. this.timeoutObj = setTimeout(function() {
  128. heartCheck.start();
  129. }, this.timeout);
  130. }
  131. }
  132. // 实际调用的方法
  133. function sendMessage(agentData) {
  134. uni.sendSocketMessage({
  135. data: agentData
  136. })
  137. }
  138. let onConnect = (callback) => {
  139. connectCallBack = callback;
  140. }
  141. function onMessage(callback) {
  142. messageCallBack = callback;
  143. }
  144. function onClose(callback) {
  145. closeCallBack = callback;
  146. }
  147. // 将方法暴露出去
  148. export {
  149. init,
  150. connect,
  151. reconnect,
  152. close,
  153. sendMessage,
  154. onConnect,
  155. onMessage,
  156. onClose
  157. }