77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
import { ref } from 'vue';
|
|
|
|
// 在组件 setup 函数中使用
|
|
export default function useWebSocket() {
|
|
// 存储 WebSocket 实例
|
|
const ws = ref(null);
|
|
const wsUrl = 'ws://127.0.0.1:8000/ws/audio';
|
|
// 初始化 WebSocket 连接
|
|
const initWebSocket = () => {
|
|
ws.value = uni.connectSocket({
|
|
url: wsUrl,
|
|
success: () => {
|
|
console.log('web');
|
|
|
|
// 监听连接打开
|
|
ws.value.onOpen((res) => {
|
|
console.log('WebSocket连接已打开', res);
|
|
|
|
// 监听消息接收
|
|
ws.value.onMessage((res) => {
|
|
let messageData = res.data;
|
|
|
|
// 处理不同类型的数据
|
|
if (typeof messageData === 'string') {
|
|
// 文本数据
|
|
try {
|
|
const parsedData = JSON.parse(messageData);
|
|
handleMessage(parsedData);
|
|
} catch (e) {
|
|
handleMessage(messageData);
|
|
}
|
|
} else if (messageData instanceof ArrayBuffer) {
|
|
// 二进制数据
|
|
try {
|
|
// 注意:组合式 API 中需通过 ref 获取子组件实例
|
|
const aaaRef = ref(null); // 需在组件中声明 <component ref="aaaRef" />
|
|
aaaRef.value?.appendBuffer(messageData);
|
|
} catch (e) {
|
|
console.log('二进制数据解析失败:', e);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
},
|
|
fail: () => {
|
|
console.log('fail');
|
|
},
|
|
});
|
|
};
|
|
|
|
// 消息处理函数(根据实际业务逻辑修改)
|
|
const handleMessage = (data) => {
|
|
// 原组件中的 handleMessage 逻辑迁移到这里
|
|
console.log('收到消息:', data);
|
|
};
|
|
|
|
// 辅助函数:ArrayBuffer 转字符串(如果后续需要使用)
|
|
const arrayBufferToStringCompat = (buffer) => {
|
|
const decoder = new TextDecoder('utf-8');
|
|
return decoder.decode(buffer);
|
|
};
|
|
|
|
// 关闭连接函数(可选,按需暴露)
|
|
const closeWebSocket = () => {
|
|
if (ws.value) {
|
|
ws.value.close();
|
|
console.log('WebSocket连接已关闭');
|
|
}
|
|
};
|
|
|
|
return {
|
|
ws,
|
|
initWebSocket,
|
|
closeWebSocket,
|
|
handleMessage
|
|
};
|
|
}; |