123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // websocket.js
- let socketTask = null;
- let reconnectAttempts = 0;
- const maxReconnectAttempts = 5;
- let heartbeatTimer = null;
- export function connectWebSocket() {
- return new Promise((resolve, reject) => {
- const token = uni.getStorageSync('Access-Token');
- const Ids = uni.getStorageSync('login_user_info')['id'];
- const userId = Ids + '_app?token=' + token;
- // const url = 'http://' + window.location.hostname + ':9999'?.replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;
- const url = uni.getStorageSync("apiUrl").replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;
- console.log(url, 'url======')
- // 创建连接
- socketTask = uni.connectSocket({
- url: url,
- success: () => {
- console.log('WebSocket 连接创建中...');
- },
- fail: (err) => {
- console.error('连接创建失败:', err);
- reject(err);
- }
- });
- // 监听打开事件
- socketTask.onOpen((res) => {
- console.log('WebSocket 连接已打开');
- startHeartbeat();
- reconnectAttempts = 0;
- resolve(socketTask);
- });
- // 监听错误事件
- socketTask.onError((err) => {
- console.error('WebSocket 错误:', err);
- handleReconnection();
- reject(err);
- });
- // 监听关闭事件
- socketTask.onClose((res) => {
- console.log('WebSocket 连接已关闭', res);
- clearInterval(heartbeatTimer);
- if (!res.code === 1000) { // 非正常关闭
- handleReconnection();
- }
- });
- });
- }
- function handleReconnection() {
- if (reconnectAttempts < maxReconnectAttempts) {
- reconnectAttempts++;
- const delay = Math.min(1000 * reconnectAttempts, 5000);
- console.log(`尝试第 ${reconnectAttempts} 次重连,${delay}ms后执行`);
- setTimeout(() => {
- connectWebSocket().catch(console.error);
- }, delay);
- } else {
- console.error(`已达到最大重连次数 ${maxReconnectAttempts}`);
- }
- }
- // 发送消息
- export function sendWebSocketMessage(message) {
- return new Promise((resolve, reject) => {
- if (!socketTask || socketTask.readyState !== 1) {
- reject('WebSocket 未连接');
- return;
- }
- socketTask.send({
- data: JSON.stringify(message),
- success: () => resolve(),
- fail: (err) => reject(err)
- });
- });
- }
- // 关闭连接
- export function closeWebSocket() {
- if (socketTask) {
- socketTask.close({
- code: 1000,
- reason: '用户主动关闭'
- });
- }
- }
- function startHeartbeat() {
- // 每30秒发送一次心跳
- heartbeatTimer = setInterval(() => {
- sendWebSocketMessage({
- type: 'heartbeat',
- timestamp: Date.now()
- }).catch(() => {
- clearInterval(heartbeatTimer);
- });
- }, 3*60000);
- }
|