⼩程序实现websocket长连接以及断开连接之后⾃动重连app.js
let socketMsgQueue = []
let isLoading = false
App({
globalData: {
userInfo: null,
localSocket: {},
callback: function () {}
},
showLoad() {
if(!isLoading) {
当初是你要分开
wx.showLoading({
title: '请稍后...',
})
isLoading = true
}
},
hideLoad() {
wx.hideLoading()
isLoading = false
},
initSocket() {
let that = this
that.globalData.localSocket = wx.connectSocket({
// url: 'wss://hico/app'
url: 'wss://hico/app'
})
that.showLoad()
that.Open(function (res) {
console.log('WebSocket连接已打开!readyState=' + that.adyState)
that.hideLoad()
while (socketMsgQueue.length > 0) {
var msg = socketMsgQueue.shift();
that.sendSocketMessage(msg);
}
})
that.Message(function(res) {
that.hideLoad()
that.globalData.callback(res)
})
that.Error(function(res) {
console.log('readyState=' + that.adyState)
})
that.Close(function (res) {
console.log('WebSocket连接已关闭!readyState=' + that.adyState)
that.initSocket()
})
},
//统⼀发送消息
sendSocketMessage: function (msg) {
if (this.adyState === 1) {
this.showLoad()
this.globalData.localSocket.send({
data: JSON.stringify(msg)
})
} else {
socketMsgQueue.push(msg)
}
},
onShow: function(options) {
if (this.adyState !== 0 && this.adyState !== 1) {
console.log('开始尝试连接WebSocket!readyState=' + this.adyState)
this.initSocket()
}
}
怎么查看隐藏文件})
page 页⾯
/**
* ⽣命周期函数--监听页⾯显⽰
*/
宠物飞机托运onShow: function () {
var that = this
app.globalData.callback = function (res) {
//res 接收websocket onMessage事件返回的数据
}
}
//向服务器发送数据
app.sendSocketMessage(data: JSON.stringify({});
)
SocketTask
这个对象是通过wx.connetSocket(obj)来获取的,他有⼀个属性值readyState,有4个状态值:
1 CONNECTING:0 连接中
美女明星2 OPEN:1 已连接
3 CLOSING:2 关闭中
4 CLOSED:3 已关闭
刚开始我们使⽤的做法是全局⼀个变量socketOpen,⽤来表⽰这个socket是否打开,没有打开就重连,否则就直接调⽤发送消息接⼝了。但是经过测试发现⽹络不稳定,会出现这个变量没有得到及时更新⼀直是true。然后就不再去连接了,但实际上已经断开了
父亲节美文所以最后就把这个socketOpen变量去掉,直接判断SocketTask对象的属性值readyState,如果是1的
话就表⽰直接可⽤;
基本思路:
1 全局维护⼀个SocketTask对象,⽤来表⽰websocket连接,⼩程序onShow时判断是否断线,是否需要重连
2 同时定义⼀个全局的回调函数callback回调函数,每个页⾯初始化的时候更新这个回调函数,那么每个页⾯中收到的返回信息就会执⾏当前页⾯逻辑
3 维护⼀个消息队列,所有的消息请求会⾸先判断连接是否可⽤,可⽤直接send,不可⽤将消息push到这个队列中。
4 在app.js的onShow函数中判断连接是否连上,如果没有连上就会触发websocket连接
5 SocketTask对象的onOpen()负责从消息队列中取出请求消息,并发送这个请求消息自己制作音乐
6 SocketTask对象的onMessage() 负责接收返回消息。并调⽤每个页⾯⾃⼰定义的回调函数
7 SocketTask对象的onClose() 监听函数中,触发websocket连接
发布评论