wssocket.js 3.6 KB

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