- websocket真机调试小程序,安卓机微信版本7.0.4连接不上,苹果机可以
[图片] 上图是在开发者工具的,都能打开websocket [图片] 上图是安卓机在真机调试,但这是微信6.7.3版本的websocket连接报错 [图片] 上图是安卓微信版本7.0.4,直接连websocket都打开不了,更不要说有报错,以上都是同一台安卓机,用其他苹果机真机调试都可以打开websocket,连接正常 代码片段是 linkWebsocket() { // 建立连接 this.websocket.initWebSocket({ url: app.globalData.websocketUrl, success(res) { console.log(res) }, fail(err) { console.log(err) } }) }, onLoad: function (options) { let date = new Date() var pages = getCurrentPages() //获取加载的页面 var currentPage = pages[pages.length - 1] //获取当前页面的对象 var url = currentPage.route //当前页面url var options = currentPage.options //如果要获取url中所带的参数可以查看options var fromUserId = app.globalData.callback.userId;// var toUserId = this.data.teacherUserId;// // app.globalData.websocketUrl="wss://liyongen.goho.co/mwkj/websocket?userId=" + fromUserId+"&problemId="+options.problemId app.globalData.websocketUrl="wss://m.jdy.com/mwkj/websocket?userId=" + fromUserId+"&problemId="+options.problemId let _this = this; // 创建websocket对象 this.websocket = new websocket({ // true代表启用心跳检测和断线重连 heartCheck: false, isReconnection: true }); // // 建立连接 // this.linkWebsocket(); // 监听websocket状态 this.websocket.onSocketClosed({ url: app.globalData.websocketUrl, success(res) { console.log(res) }, fail(err) { console.log(err) } }) // 监听网络变化 this.websocket.onNetworkChange({ url: app.globalData.websocketUrl, success(res) { console.log(res) }, fail(err) { console.log(err) } }) // 监听服务器返回 this.websocket.onReceivedMsg(result => { console.log('app.js收到服务器内容:' + result.data); console.log(JSON.parse(result.data)) this.receviewMsg(JSON.parse(result.data)) }) },export default class websocket { constructor({ heartCheck, isReconnection }) { // // 是否连接 this._isLogin = false; // 当前网络状态 this._netWork = true; // 是否人为退出 this._isClosed = false; // 心跳检测频率 this._timeout = 3000; this._timeoutObj = null; // 当前重连次数 this._connectNum = 0; // 心跳检测和断线重连开关,true为启用,false为关闭 this._heartCheck = heartCheck; this._isReconnection = isReconnection; this._onSocketOpened(); } // 心跳重置 _reset() { clearTimeout(this._timeoutObj); return this; } // 心跳开始 _start() { let _this = this; this._timeoutObj = setInterval(() => { wx.sendSocketMessage({ // 心跳发送的信息应由前后端商量后决定 data: JSON.stringify({ "key": 'value' }), success(res) { console.log(res) console.log("发送心跳成功"); }, fail(err) { console.log(err) _this._reset() } }); }, this._timeout); } // 监听websocket连接关闭 onSocketClosed(options) { wx.onSocketClose(err => { console.log('当前websocket连接已关闭,错误信息为:' + JSON.stringify(err)); wx.showToast({ duration: 2000, title: "连接已关闭,请退出重新登录", icon:"none" //"success" }) // 停止心跳连接 if (this._heartCheck) { this._reset(); } // 关闭已登录开关 this._isLogin = false; // 检测是否是用户自己退出小程序 if (!this._isClosed) { // 进行重连 if (this._isReconnection) { this._reConnect(options) } } }) } // 检测网络变化 onNetworkChange(options) { wx.onNetworkStatusChange(res => { console.log('当前网络状态:' + res.isConnected); if (!this._netWork) { this._isLogin = false; // 进行重连 if (this._isReconnection) { this._reConnect(options) } } }) } _onSocketOpened() { wx.onSocketOpen(res => { console.log('websocket已打开'); //对话连接中提示语去掉 wx.hideToast(); // 打开已登录开关 this._isLogin = true; // 发送心跳 if (this._heartCheck) { this._reset()._start(); } // 发送登录信息 // wx.sendSocketMessage({ // // 这里是第一次建立连接所发送的信息,应由前后端商量后决定 // data: JSON.stringify({ // "key": 'value' // }) // }) // 打开网络开关 this._netWork = true; }) } // 接收服务器返回的消息 onReceivedMsg(callBack) { wx.onSocketMessage(msg => { if (typeof callBack == "function") { callBack(msg) } else { console.log('参数的类型必须为函数') } }) } // 建立websocket连接 initWebSocket(options) { wx.showToast({ title: '对话连接中...', icon: 'none', duration: 50000 }) let _this = this; if (this._isLogin) { console.log("您已经登录了"); } else { // 检查网络 wx.getNetworkType({ success(result) { if (result.networkType != 'none') { // 开始建立连接 wx.connectSocket({ url: options.url, success(res) { if (typeof options.success == "function") { options.success(res) } else { console.log('参数的类型必须为函数') } }, fail(err) { if (typeof options.fail == "function") { options.fail(err) } else { console.log('参数的类型必须为函数') } } }) } else { console.log('网络已断开'); _this._netWork = false; // 网络断开后显示model wx.showModal({ title: '网络错误', content: '请重新打开网络', showCancel: false, success: function (res) { if (res.confirm) { console.log('用户点击确定') } } }) } } }) } } // 发送websocket消息 sendWebSocketMsg(options) { wx.sendSocketMessage({ data: options.data, success(res) { if (typeof options.success == "function") { options.success(res) } else { console.log('参数的类型必须为函数') } }, fail(err) { if (typeof options.fail == "function") { options.fail(err) } else { console.log('参数的类型必须为函数') } } }) } // 重连方法,会根据时间频率越来越慢 _reConnect(options) { let timer, _this = this; if (this._connectNum < 20) { timer = setTimeout(() => { this.initWebSocket(options) }, 3000) this._connectNum += 1; } else if (this._connectNum < 50) { timer = setTimeout(() => { this.initWebSocket(options) }, 10000) this._connectNum += 1; } else { timer = setTimeout(() => { this.initWebSocket(options) }, 450000) this._connectNum += 1; } } // 关闭websocket连接 closeWebSocket(){ wx.closeSocket(); this._isClosed = true; } }
2019-06-11 - 在开发工具上能连接websocket,真机调试不行,如何解决?
使用官方websocketAPI后 ,真机调试 建立websocket连接后可以进入success回调,但是会自动断开连接,报socket error: {errMsg: "exception onOpen fail code:20, msg:Invalid HTTP status."}错误 。 安卓和ios都会出现
2019-10-30