微信小程序使用Websocket


/**

初始化websocket

stomp文檔 http://jmesnil.net/stomp-websocket/doc/
*/
initSocket: function () {
var that = this;
// socket是否連接
var socketConnected = false;
// 待發送的消息隊列
var messageQueue = [];
// 是否斷線重連
var reconnect = true;
// 斷線重連次數
var reconnectnum = 0;

// 發送消息
function sendSocketMessage(msg) {
// 如果socket已連接則發送消息
if (socketConnected) {
wx.sendSocketMessage({
data: msg
})
} else {
// socket沒有連接將消息放入隊列中
messageQueue.push(msg);
}
}

// 關閉連接
function close() {
if (socketConnected) {
wx.closeSocket()
}
}

// 符合WebSocket定義的對象
var ws = {
send: sendSocketMessage,
close: close
}

// 創建一個 WebSocket 連接
//api.RTCWSSHOST_URL,你的wss鏈接
//token ;與服務端定義的參數
function connect() {
var token = “token=” + wx.getStorageSync(‘clienttoken’)
wx.connectSocket({
url: api.RTCWSSHOST_URL + ‘?token=’ + wx.getStorageSync(‘clienttoken’),
})
}
connect();

// 監聽 WebSocket 連接打開事件
wx.onSocketOpen(function (res) {
console.log(“WebSocket 連接成功”)
socketConnected = true;
ws.onopen();
// 連接成功后,將隊列中的消息發送出去
// let queueLength = messageQueue.length
// for (let i = 0; i < queueLength; i++) {
// const messageQueueElement = messageQueue.shift();
// wx.sendSocketMessage({
// data: messageQueueElement
// })
// }
})

// 監聽 WebSocket 接受到服務器的消息事件
wx.onSocketMessage(function (res) {
ws.onmessage(res);
})

// 監聽 WebSocket 錯誤事件
wx.onSocketError(function (res) {
console.log(“WebSocket 錯誤事件”)
})

// 監聽 WebSocket 連接關閉事件
wx.onSocketClose(function (res) {
console.log(“WebSocket 連接關閉”)
socketConnected = false;
// 斷線重連
//斷線重連3次后,30分鍾之后重連
if (reconnect) {
console.log(“斷線重連***************”)
if(reconnectnum>3){
setTimeout(function(){
reconnectnum = 0;
client.disconnect();
that.connect();
},1800000);
}else{
reconnectnum +=1;
connect();
}
}
})

var Stomp = require(‘utils/stomp.min.js’).Stomp;

/**

定期發送心跳或檢測服務器心跳
The heart-beating is using window.setInterval() to regularly send heart-beats and/or check server heart-beats.
可看stomp.js的源碼(195,207,489行),由於小程序沒有window對象,所以我們要調用小程序的定時器api實現
*/
Stomp.setInterval = function (interval, f) {
return setInterval(f, interval);
};
// 結束定時器的循環調用
Stomp.clearInterval = function (id) {
return clearInterval(id);
};
var stompClient = Stomp.over(ws);

//{“clienttype”:“小程序”} ;與服務端定義的標識
stompClient.connect({“clienttype”:“小程序”}, function (callback) {
//全局都可以使用stompClient
that.globalData.client = stompClient;
// 主題訂閱
stompClient.subscribe(’/app/public’, function (body, headers) {
console.log(‘主題訂閱收到群發消息’, body);
wx.setStorageSync(‘clientdata’, body);
//需求,每個18秒把推送過來 的消息情況
if (subscribeTimeFun) {
clearTimeout(subscribeTimeFun);
}
subscribeTimeFun = setTimeout(function () {
wx.setStorageSync(‘clientdata’, “”);
}, 18000);
});

// // 訂閱自己的
// stompClient.subscribe('/user/' + openid + '/message', function(message, headers) {
// wx.vibrateLong()
// console.log('收到只發送給我的消息:', message);
// // 通知服務端收到消息
// message.ack();
// });
//
// // 向服務端發送消息
// stompClient.send("/app/message", {}, JSON.stringify({
// 'msg': '我是客戶端'
// }));

})

},


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM