123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- 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();
- this.wsUrl = ""
- }
- // 心跳重置
- _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));
- // 停止心跳连接
- 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(callBack) {
- wx.onSocketOpen(res => {
- console.log('websocket已打开');
- // 打开已登录开关
- this._isLogin = true;
- // 发送心跳
- if (this._heartCheck) {
- this._reset()._start();
- }
- // 发送登录信息
- wx.sendSocketMessage({
- // 这里是第一次建立连接所发送的信息,应由前后端商量后决定
- data: JSON.stringify({
- "key": 'value'
- })
- })
- // 打开网络开关
- this._netWork = true;
- if (typeof callBack == "function") {
- callBack(res)
- } else {
- console.log('参数的类型必须为函数')
- }
- })
- }
- // 接收服务器返回的消息
- onReceivedMsg(callBack) {
- wx.onSocketMessage(msg => {
- if (typeof callBack == "function") {
- callBack(msg)
- } else {
- console.log('参数的类型必须为函数')
- }
- })
- }
- // 建立websocket连接
- initWebSocket(options) {
- let _this = this;
- this.wsUrl = options.url ? options.url : this.wsUrl
- if (this._isLogin) {
- console.log("您已经登录了");
- } else {
- // 检查网络
- wx.getNetworkType({
- success(result) {
- if (result.networkType != 'none') {
- // 开始建立连接
- wx.connectSocket({
- url: _this.wsUrl,
- 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;
- }
- }
- })
- }
- }
- // 发送websocket消息
- sendWebSocketMsg(options) {
- // console.log("send参数:", options)
- wx.sendSocketMessage({
- data: options.data,
- success(res) {
- if (options.success && typeof options.success == "function") {
- options.success(res)
- }
- },
- fail(err) {
- if (options.fail && typeof options.fail == "function") {
- options.fail(err)
- }
- }
- })
- }
- // 重连方法,会根据时间频率越来越慢
- _reConnect(options) {
- let timer, _this = this;
- if (this._connectNum < 3) {
- timer = setTimeout(() => {
- this.initWebSocket(options)
- }, 3000)
- this._connectNum += 1;
- } else if (this._connectNum < 10) {
- 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;
- }
- }
|