App - 副本.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <script>
  2. export default {
  3. globalData: {
  4. token: "",
  5. // 文本消息
  6. socketTask: null,
  7. // urlData: "ws://114.115.147.140:12345/api/api_gateway?method=control_center.real_time.im_message",
  8. // urlData: "wss://www.toreskj.com/api/api_gateway?method=control_center.real_time.im_message",
  9. urlData: "ws://192.168.1.17:12345/api/api_gateway?method=control_center.real_time.im_message",
  10. is_open_socket: false, // 确保websocket是打开状态
  11. list: [],
  12. userId: null, // 用户ID
  13. // 即构
  14. video: null, //房间密码和token
  15. // 测试 - 心跳检测
  16. status: null, // websocket是否关闭
  17. lockReconnect: false, // 避免重复连接
  18. // timeout: 5000, // 多少秒执行监测
  19. timeout: 10000, // 多少秒执行监测
  20. timeoutObj: null, // 检测服务器端是否还活着
  21. reconnectTimeOutObj: null, // 重连之后多久再次重连
  22. // 测试
  23. app: [],
  24. hdskdh: null
  25. },
  26. onLoad() {},
  27. onLaunch: function() {
  28. console.log('启动了')
  29. // App启动
  30. var that = this
  31. uni.getStorage({
  32. key: 'session_key',
  33. success: function(res) {
  34. // console.log(res)
  35. that.globalData.token = res.data
  36. // console.log('登录成功了')
  37. that.msgInit(); // 文本初始化
  38. },
  39. fail: function(err) {
  40. // console.log(err)
  41. // console.log('没有登录成功')
  42. }
  43. })
  44. },
  45. onShow: function() {
  46. // App展示在前台
  47. console.log('+++++++++++++++++++App Show-------------------------------------')
  48. this.msgInit(); // 再进行请求
  49. },
  50. onHide: function() {
  51. // App不再再展示在前台
  52. // this.close(); // 关闭
  53. },
  54. methods: {
  55. // 实时通信 - 初始化
  56. msgInit() {
  57. var that = this
  58. // 连接webscoket
  59. that.globalData.socketTask = uni.connectSocket({
  60. url: this.globalData.urlData + "&token=" + that.globalData.token,
  61. success(data) {
  62. // console.log("websocket连接中");
  63. }
  64. });
  65. // 发送消息 - 获取对话列表
  66. var obj = {
  67. 'action': 'list', // 动作标识,必填
  68. 'recv_user_id': '', // 接收人用户id, 非必填
  69. 'data': {}
  70. }
  71. that.globalData.socketTask.onOpen((res) => {
  72. console.log('websocket开启了')
  73. // 清除重连定时器
  74. // clearTimeout(that.globalData.reconnectTimeOutObj)
  75. // that.notReconnect()
  76. that.globalData.socketTask.send({
  77. data: JSON.stringify(obj),
  78. async success(res) {
  79. that.globalData.is_open_socket = true
  80. console.log("消息发送成功");
  81. },
  82. });
  83. that.start() // 开启心跳机制
  84. })
  85. // // 接收服务器返回的消息
  86. // // 注:只有连接正常打开中 ,才能正常收到消息
  87. that.globalData.socketTask.onMessage((res) => {
  88. // console.log("收到服务器内容:");
  89. var val = JSON.parse(res.data)
  90. console.log('这是返回的内容---------', val)
  91. if (val.action == 'list') {
  92. console.log('这是发送人的ID', that.globalData.userId)
  93. var obj1 = {
  94. 'action': 'list', // 动作标识,必填
  95. 'recv_user_id': that.globalData.userId, // 接收人用户id, 非必填
  96. 'data': {
  97. 'msg_status': false, // 消息未读
  98. 'msg_info': '', // 发送消息
  99. }
  100. }
  101. that.globalData.socketTask.send({
  102. data: JSON.stringify(obj1),
  103. async success(res) {
  104. },
  105. });
  106. } else if (val.action == 'none') {
  107. console.log('进入了none')
  108. that.globalData.list = val.data
  109. this.$store.state.list = val.data
  110. } else if (val.action == 'recv_video') {
  111. that.globalData.video = val.data
  112. this.$store.state.video = val.data
  113. setTimeout(() => {
  114. console.log('跳转了')
  115. this.$store.getters.watchData;
  116. }, 1500)
  117. } else if (val.action == 'ok') {
  118. this.start(); // 心跳机制
  119. }
  120. // this.reset();
  121. // console.log('消息可正常接收');
  122. });
  123. // 连接断开
  124. // 如果希望websocket连接一直保持,在close或者error上绑定重新连接方法。
  125. this.globalData.socketTask.onClose((res) => {
  126. // console.log(res, '连接关闭');
  127. clearTimeout(this.globalData.timeoutObj);
  128. setTimeout(() => {
  129. that.reconnect();
  130. }, 5000)
  131. })
  132. // 连接失败
  133. that.globalData.socketTask.onError((res) => {
  134. // console.log(res, '连接错误');
  135. clearTimeout(this.globalData.timeoutObj);
  136. setTimeout(() => {
  137. that.reconnect();
  138. }, 5000)
  139. })
  140. },
  141. // 心跳机制
  142. start() {
  143. var that = this
  144. this.globalData.timeoutObj = setTimeout(() => {
  145. //这里发送一个心跳,后端收到后,返回一个心跳消息,
  146. //onmessage拿到返回的心跳就说明连接正常
  147. var obj = {
  148. 'action': 'keepalive', // 动作标识,必填
  149. 'recv_user_id': '', // 接收人用户id, 非必填
  150. 'data': {}
  151. }
  152. that.globalData.socketTask.send({
  153. data: JSON.stringify(obj),
  154. async success(res) {
  155. that.globalData.is_open_socket = true
  156. // console.log('消息发送成功1111')
  157. }
  158. });
  159. console.log('进入心跳机制了')
  160. }, this.globalData.timeout)
  161. },
  162. // 清除心跳机制
  163. reset() {
  164. // 清除定时器重新发送一个心跳信息
  165. // clearTimeout(this.globalData.timeoutObj);
  166. clearTimeout(this.globalData.timeoutObj);
  167. this.start();
  168. },
  169. // 重连
  170. reconnect() {
  171. // 防止多个方法调用,多处重连
  172. if (this.lockReconnect) {
  173. return;
  174. };
  175. this.lockReconnect = true;
  176. // console.log('准备重连');
  177. //没连接上会一直重连,设置延迟避免请求过多
  178. this.globalData.reconnectTimeOutObj = setTimeout(() => {
  179. // 重新连接
  180. this.msgInit()
  181. // console.log('正在重新连接')
  182. this.lockReconnect = false;
  183. }, 4000);
  184. },
  185. // 清除重连
  186. notReconnect() {
  187. clearTimeout(this.globalData.reconnectTimeOutObj)
  188. },
  189. // 手动关闭
  190. close() {
  191. var that = this
  192. // console.log('已经手动关闭了')
  193. that.globalData.socketTask.close()
  194. clearTimeout(that.globalData.timeoutObj);
  195. clearTimeout(that.globalData.reconnectTimeOutObj);
  196. },
  197. },
  198. }
  199. </script>
  200. <!-- // App.vue文件 中首行的位置引入,注意给style标签加入lang="scss"属性 -->
  201. <style lang="scss">
  202. /* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
  203. @import "uview-ui/index.scss";
  204. </style>