websocket.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. let wsurl='wss://' + process.env.VUE_APP_WEBSCOKET + '/ws/';
  2. let ws = null
  3. let weboscket_callback = null
  4. import {getToken,generateUUID } from '@/api/auth';
  5. import {Message} from 'element-ui'
  6. //获取 websocket 推送的数据
  7. let websocketonmessage = e => {
  8. let data=JSON.parse(e.data)
  9. if(data.type=="ping"){
  10. if(ws){
  11. ws.send('保持连接')
  12. }
  13. }
  14. return weboscket_callback(data);
  15. }
  16. // 连接成功
  17. let websocketonopen = () => {
  18. console.log('websocket 成功')
  19. }
  20. // 连接失败时重新连接
  21. let websocketonerror = (e) => {
  22. // Message({
  23. // message: '网络连接失败,请检查网络',
  24. // type: 'error',
  25. // })
  26. weboscket_callback({type:'error',msg:'网络连接失败,请检查网络'})
  27. // initWebSocket()
  28. }
  29. // 断开链接后报错
  30. let websocketclose = e => {
  31. if(!e.wasClean){//当网络中断时处理
  32. // Message({
  33. // message: '网络连接失败,请稍后再试',
  34. // type: 'error',
  35. // })
  36. weboscket_callback({type:'break',msg:'网络连接失败,请稍后再试'})
  37. closewebsocket();
  38. }
  39. }
  40. // 手动关闭 websocket
  41. let closewebsocket = () => {
  42. if(ws){
  43. console.log('websocket 关闭')
  44. ws.close()
  45. ws=null;
  46. }
  47. }
  48. let initWebSocket = (is) => {
  49. //初始化 websocket
  50. if(is){
  51. wsurl='wss://' + process.env.VUE_APP_WEBSCOKET + '/ws2/';
  52. }else{
  53. wsurl='wss://' + process.env.VUE_APP_WEBSCOKET + '/ws/';
  54. }
  55. ws = new WebSocket(wsurl)
  56. ws.onmessage = websocketonmessage
  57. ws.onopen = websocketonopen
  58. ws.onerror = websocketonerror
  59. ws.onclose = websocketclose
  60. }
  61. // 发送数据 is是使用ws2API 后面要清掉
  62. let sendData = (data, callback,is) => {
  63. weboscket_callback = callback
  64. // 判断 data 数据类型
  65. if (typeof data == 'string') {
  66. data = data
  67. } else {
  68. data = JSON.stringify(data)
  69. }
  70. if(ws){// 判断 websocket 的状态
  71. if (ws.readyState === ws.OPEN) {// 已经打开,可以直接发送
  72. ws.send(data)
  73. } else if (ws.readyState === ws.CONNECTING) {// 正在开启状态中,则 1 秒后重新发送
  74. setTimeout(() => {
  75. ws.send(data)
  76. }, 2000)
  77. }
  78. }else {
  79. // 未打开,则开启后重新调用
  80. initWebSocket(is)
  81. let wsData = {type: 'auth',token: getToken(),machine:generateUUID()};
  82. sendData(wsData, callback)
  83. sendData(data, callback)
  84. }
  85. }
  86. // 导出
  87. export {
  88. initWebSocket,
  89. sendData,
  90. closewebsocket
  91. }