wssocket.js 3.4 KB

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