Houjie
2025-04-11 1bf977929dd324f3ac64b70debd8a79443c54392
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import configService from '@/common/service/config.service.js';
import store from '@/store/index.js';
import {ACCESS_TOKEN} from '@/common/util/constants.js'
class socket {
    constructor(options) {
        this.socketUrl = configService.apiUrl;
        this.socketStart = false;
        this.monitorSocketError();
        this.monitorSocketClose();
        this.socketReceive();
    }
    init(socket_type,callback) {
        const _this = this;
        if (configService.apiUrl) {
            if(this.socketStart){
                console.log('webSocket已经启动了');
            }else{
                let userid=store.state.userid?store.state.userid:store.getters.userid;
                let url=this.socketUrl.replace("https://","wss://").replace("http://","ws://")+"/"+socket_type+"/"+userid+"_app";
                console.log("启动this.socketUrl连接地址:",url);
                // update-begin-author:lsq date:20230506 for:[issues/497]websocket连接打开失败 
                let token = uni.getStorageSync(ACCESS_TOKEN)
                uni.connectSocket({
                    url: url,
                    method: 'GET',
                    protocols:[token]
                });
                // update-end-author:lsq date:20230506 for:[issues/497]websocket连接打开失败 
 
                uni.onSocketOpen((res) => {
                    this.socketStart = true;
                    callback && callback();
                    console.log('WebSocket连接已打开!');
                });
                /*setTimeout(() => {
                   _this.getHeartbeat();
                }, 5000);*/
            }
        }else{
            console.log('config/baseUrl socketUrl为空');
        }
    }
    //Socket给服务器发送消息
    send(data, callback) {
        const _this = this;
        if (store.state.userid) {
            data.userUid =store.state.userid;
        }
        console.log(data);
        uni.sendSocketMessage({
            data: JSON.stringify(data),
            success: () => {
                callback && callback(true);
            },
            fail: () => {
                callback && callback(false);
            }
        });
    }
    //Socket接收服务器发送过来的消息
    socketReceive() {
        const _this = this;
        uni.onSocketMessage(function(res) {
            console.log("APP:----》收到服务器内容:",res);
            let data = JSON.parse(res.data);
            //console.log('收到服务器内容:', data);
            _this.acceptMessage && _this.acceptMessage(data);
        });
    }
    //关闭Socket
    closeSocket() {
        const _this = this;
        uni.closeSocket();
        _this.socketStart = false;
    }
    //监听Socket关闭
    monitorSocketClose() {
        const _this = this;
        uni.onSocketClose(function(res) {
            console.log('WebSocket 已关闭!');
            _this.socketStart = false;
            setTimeout(function() {
                //_this.init();
            }, 3000); 
        });
    }
    //监听Socket错误
    monitorSocketError() {
        const _this = this;
        uni.onSocketError(function(res) {
            _this.socketStart = false;
            console.log('WebSocket连接打开失败,请检查!');
        });
    }
    //心跳
    getHeartbeat() {
        const _this = this;
        this.send({
            type: "心跳",
            userUid: store.state.userid
        }, (val) => {
            setTimeout(() => {
                if (val) {
                    //_this.getHeartbeat();
                } else {
                    if(!_this.socketStart){
                        //_this.init();
                    }
                }
            }, 10000);
        });
    }
};
const mySocket = new socket();
export default mySocket;