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.
288 lines
5.9 KiB
288 lines
5.9 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('消息发送成功');
|
|
},
|
|
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);
|
|
var num = 500000;
|
|
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;
|
|
|