App.vue 5.5 KB

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