话不多说,直接上代码
import { ref, onMounted, onUnmounted } from 'vue';
export default function useWebsocket(url:string, onMessage:(res:any)=>void,heartbeatInterval = 3000,) {
const socketTask = ref(null as any);
const isDisconnect = ref(true);
let heartbeatTimer = null as any;
const connect = () => {
if (isDisconnect.value) {
isDisconnect.value = false;
console.log('WebSocket连接中...',url)
console.log('socketTask',socketTask)
socketTask.value = new WebSocket(url);
socketTask.value.onopen = () => {
console.log('WebSocket连接已打开');
startHeartbeat();
}
socketTask.value.onclose = () => {
console.log('WebSocket连接已关闭');
if (isDisconnect.value) {
setTimeout(() => {
console.log('WebSocket尝试重新连接');
connect();
}, 1000);
}
} ;
socketTask.value.onerror =(error:any) => {
console.error('WebSocket连接发生错误:', error);
isDisconnect.value = true;
}
socketTask.value.onmessage = (res:{data:string}) => {
let data = JSON.parse(res.data);
console.log('收到服务器消息:', data)
if (onMessage) {
onMessage(data);
}
};
}
};
const disconnect = () => {
console.log('主动断开')
if (socketTask.value) {
isDisconnect.value = false;
socketTask.value.close();
stopHeartbeat();
socketTask.value = null;
}
};
const startHeartbeat = () => {
heartbeatTimer = setInterval(() => {
if (socketTask.value) {
console.log('发送心跳')
socketTask.value.send({});
}
}, heartbeatInterval);
};
const stopHeartbeat = () => {
clearInterval(heartbeatTimer);
};
const sendMessage = (message:any) => {
console.log('发送消息:socketTask.value', socketTask.value)
if (socketTask.value) {
socketTask.value.send({
data: JSON.stringify(message)
});
}
};
onMounted(() => {
connect();
});
onUnmounted(() => {
disconnect();
});
return {
socketTask,
connect,
disconnect,
sendMessage,
};
}