我们的小程序保障ws连接的机制是:每6秒会发送一次心跳,如果发送心跳成功后判断该ws的readyState同时为1,则断定为ws是连通的,如果发送失败,或发送成功但是readyState不为1则都算失败,将会关闭ws,重新发起连接。
后台日志(下方代码块),以及小程序实时日志(下方截图)可看出客户在16:52::18(小程序后台日志16:52::17秒)成功连接,readystate不等于1并在6秒内仍不为,故在下一次心跳则断开重连。
{
"timestamp" : "2020-05-11T16:52:18.531+08",
"level" : "INFO",
"thread" : "nioEventLoopGroup-3-2",
"logger" : "websocket",
"message" : "医生端小程序已连接, currentDoctor: CurrentDoctor{userId=1059}, ChannelId: 00163efffe0dd1cc-00007c72-0003436c-a07c3fec4a4defde-fd860c6a",
"context" : "default"
}{
"timestamp" : "2020-05-11T16:52:24.306+08",
"level" : "INFO",
"thread" : "nioEventLoopGroup-3-2",
"logger" : "heartbeat",
"message" : "接收客户端心跳, HB: HB_2fd7016c-b1d5-467b-b537-7f0cecdcee35, ChannelId: 00163efffe0dd1cc-00007c72-0003436c-a07c3fec4a4defde-fd860c6a",
"context" : "default"
}{
"timestamp" : "2020-05-11T16:52:24.391+08",
"level" : "WARN",
"thread" : "nioEventLoopGroup-3-2",
"logger" : "websocket",
"message" : "医生端小程序已断开, currentDoctor: CurrentDoctor{userId=1059}, ChannelId: 00163efffe0dd1cc-00007c72-0003436c-a07c3fec4a4defde-fd860c6a",
"context" : "default"
}
心跳代码
// 心跳定时器启动
startHBTimer () {
clearInterval(this._timer)
this._timer = setInterval(() => {
this.sendHBMsg()
}, 6000)
}
// 发送心跳
sendHBMsg () {
let self = this
const loginInfo = wx.getStorageSync('loginInfo')
if (!loginInfo) { return }
self._socketTask.send({
data: `HB_${loginInfo.token}_${loginInfo.name}`,
success: (e) => {
if (self._socketTask.readyState * 1 === 1) {
wx.hideNavigationBarLoading()
} else {
self.sendFailHandler(self)
wxLog.warn('sendHBMsg success but readyStateCode is not open', '&readyStateCode=' + self._socketTask.readyState + '&device=' + JSON.stringify(wx.getStorageSync('systemDetailInfo')))
}
},
fail: (res) => {
self.sendFailHandler(self)
wxLog.warn(res, 'sendHBMsg fail&readyStateCode=' + self._socketTask.readyState + '&device=' + JSON.stringify(wx.getStorageSync('systemDetailInfo')))
}
})
}
sendFailHandler (self) {
wx.showNavigationBarLoading()
self.createConnection()
}
目前readyState这个状态是不可用的状态吗?那客户端应如何判断ws是否连接成功状态
谢邀:
readyState你是在哪看到这个玩意的哈?官方文档上我没找到呢,我小程序websocket里也没用到这个
我是59秒一次心跳,
onSocketOpen时设置自定义标志为成功
onSocketError,重连,设置标志为失败
有点历史了。onclose的时候也重置失败吗?小程序onhide的时候处理吗
onHide的时候不做处理,onShow里重连。
我也遇到了这个问题,再息屏一段时间后,进入游戏,readystate 一直是 0。而且这个问题复现还不好复现,有时候遇到,有时候又是好的。
websocket有个连接成功的回调,SocketTask.onOpen(function callback)
监听 WebSocket 连接打开事件
,如果能走到这里,说明连接成功了
_onSocketOpen () {
this._socketTask.onOpen((res) => {
wx.hideToast()
wxLog.info(`WebSocket连接已打开!code=${this._socketTask.readyState}`)
})
}