import { ref, reactive } from 'vue';
|
|
export const useWebSocket = (protocols) => {
|
const ws = new WebSocket("ws://localhost:9260/", protocols);
|
const messages = ref([]);
|
const status = reactive({
|
isConnected: false,
|
error: null
|
});
|
|
// 事件监听
|
const connect = () => {
|
ws.onopen = () => {
|
status.isConnected = true;
|
console.log('WebSocket 连接成功');
|
};
|
|
ws.onmessage = (event) => {
|
try {
|
const data = JSON.parse(event.data);
|
messages.value.push(data);
|
} catch (e) {
|
console.error('消息解析失败', e);
|
}
|
};
|
|
ws.onclose = (event) => {
|
status.isConnected = false;
|
console.log('连接关闭,准备重连...');
|
setTimeout(connect, 3000); // 3秒后重连
|
};
|
|
ws.onerror = (error) => {
|
status.error = error;
|
console.error('WebSocket 错误:', error);
|
};
|
};
|
|
// 初始化连接
|
connect();
|
|
// 发送消息方法
|
const send = (data) => {
|
if (status.isConnected) {
|
ws.send(JSON.stringify(data));
|
}
|
};
|
|
return {
|
ws,
|
messages,
|
status,
|
send,
|
close: () => ws.close()
|
};
|
};
|