You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

299 lines
6.1 KiB

class WebSocketClass {
constructor(url) {
this.lockReconnect = false; // 是否开始重连
this.wsUrl = ''; // ws 地址
this.globalCallback = null; // 回调方法
this.userClose = false; // 是否主动关闭
this.createWebSocket(url);
this.id = null;
}
setId(id) {
this.id = id
}
createWebSocket(url) {
// #ifdef H5
if (typeof(WebSocket) === 'undefined') {
this.writeToScreen('您的浏览器不支持WebSocket,无法获取数据');
return false
}
// #endif
// #ifdef APP-PLUS
if (typeof(uni.connectSocket) === 'undefined') {
this.writeToScreen('您的浏览器不支持WebSocket,无法获取数据');
return false
}
// #endif
this.wsUrl = url;
try {
// 创建一个this.ws对象【发送、接收、关闭socket都由这个对象操作】
// #ifdef H5
this.ws = new WebSocket(this.wsUrl);
this.initEventHandle();
// #endif
// #ifdef APP-PLUS
let that = this
this.ws = uni.connectSocket({
url: this.wsUrl,
success(data) {
console.log('websocket连接成功');
that.initEventHandle();
},
});
// #endif
} catch (e) {
this.reconnect(url);
}
}
// 初始化
initEventHandle() {
/**
* 监听WebSocket连接打开成功
*/
// #ifdef H5
this.ws.onopen = (event) => {
console.log('WebSocket连接打开');
};
// #endif
// #ifdef APP-PLUS
this.ws.onOpen(res => {
console.log('WebSocket连接打开');
});
// #endif
/**
* 连接关闭后的回调函数
*/
// #ifdef H5
this.ws.onclose = (event) => {
if (!this.userClose) {
this.reconnect(this.wsUrl); //重连
}
};
// #endif
// #ifdef APP-PLUS
this.ws.onClose(() => {
if (!this.userClose) {
this.reconnect(this.wsUrl); //重连
}
});
// #endif
/**
* 报错时的回调函数
*/
// #ifdef H5
this.ws.onerror = (event) => {
if (!this.userClose) {
this.reconnect(this.wsUrl); //重连
}
};
// #endif
// #ifdef APP-PLUS
this.ws.onError(() => {
if (!this.userClose) {
this.reconnect(this.wsUrl); //重连
}
});
// #endif
/**
* 收到服务器数据后的回调函数
*/
// #ifdef H5
this.ws.onmessage = (event) => {
this.globalCallback(JSON.parse(event.data))
};
// #endif
// #ifdef APP-PLUS
this.ws.onMessage(event => {
this.globalCallback(JSON.parse(event.data))
});
// #endif
}
// 关闭ws连接回调
reconnect(url) {
if (this.lockReconnect) return;
this.ws.close();
this.lockReconnect = true; // 关闭重连,没连接上会一直重连,设置延迟避免请求过多
setTimeout(() => {
this.createWebSocket(url);
this.lockReconnect = false;
}, 1000);
}
// 发送信息方法
webSocketSendMsg(msg) {
// #ifdef H5
this.ws && this.ws.send(JSON.stringify(msg));
// #endif
// #ifdef APP-PLUS
this.ws && this.ws.send({
data: JSON.stringify(msg),
success() {
console.log('消息发送成功',msg);
},
fail(err) {
console.log('关闭失败', err)
}
});
// #endif
}
// 获取ws返回的数据方法
getWebSocketMsg(callback) {
this.globalCallback = callback
}
// 关闭ws方法
closeSocket() {
if (this.ws) {
this.userClose = true;
// #ifdef H5
this.ws && this.ws.close();
// #endif
// #ifdef APP-PLUS
this.ws.close({
success(res) {
console.log('关闭成功', res)
},
fail(err) {
console.log('关闭失败', err)
}
});
// #endif
}
}
writeToScreen(massage) {
console.log(massage);
}
subPairsgroup() {
this.publicSend('sub', 'pairsgroup', ['market.pairsgroup'], null)
}
unSubPairsgroup() {
this.publicSend('un_sub', 'pairsgroup', ['market.pairsgroup'], null)
}
subBbo(symbol) {
this.publicSend('sub', 'bbo', ['market.' + symbol + '.bbo'], null)
}
unSubBbo(symbol) {
this.publicSend('un_sub', 'bbo', ['market.' + symbol + '.bbo'], null)
}
subTrade(symbol) {
this.publicSend('sub', 'trade', ['market.' + symbol + '.trade'], null)
}
unSubTrade(symbol) {
this.publicSend('un_sub', 'trade', ['market.' + symbol + '.trade'], null)
}
subDetail(symbol) {
this.publicSend('sub', 'detail', ['market.' + symbol + '.detail'], null)
}
unSubDetail(symbol) {
this.publicSend('un_sub', 'detail', ['market.' + symbol + '.detail'], null)
}
subKHistory(timeType, symbol) {
var toDate = parseInt(new Date().getTime() / 1000);
<<<<<<< HEAD
var num = 500000;
=======
var num = 10000;
// #ifdef APP-PLUS
num = 3000;
// #endif
>>>>>>> 1e578ec94e2ad85c6c797e5669f396b7f88e1b91
var fromDate = parseInt(new Date().getTime() / 1000);
switch (timeType) {
case '1min':
fromDate = fromDate - num;
break;
case '5min':
fromDate = fromDate - (5 * num);
break;
case '15min':
fromDate = fromDate - (15 * num);
break;
case '30min':
fromDate = fromDate - (30 * num);
break;
case '60min':
fromDate = fromDate - (60 * num);
break;
case '1day':
fromDate = fromDate - (60 * 24 * num);
break;
case '1week':
fromDate = fromDate - (60 * 24 * 7 * num);
break;
case '1mon':
fromDate = fromDate - (60 * 24 * 30 * num);
break;
}
this.publicSend('req', 'kline',
['market.' + symbol + ".kline." + timeType], {
fromDate: parseInt(fromDate),
toDate: toDate
})
}
subKline(timeType, symbol) {
this.publicSend('sub', 'kline',
['market.' + symbol + ".kline." + timeType], null)
}
unSubKline(timeType, symbol) {
this.publicSend('un_sub', 'kline',
['market.' + symbol + ".kline." + timeType], null)
}
publicSend(event, type, channel, date) {
var data = {
event: event,
type: type,
id: this.id,
channel: channel,
};
if('pairsgroup'===type){
data.model='contract'
}
if (date) {
data.fromDate = date.fromDate
data.toDate = date.toDate
}
this.webSocketSendMsg(data)
}
}
export default WebSocketClass;