Files
aistream-test/测试流式传输uniapp/pages/index/useWebSocket.js
T
2025-12-02 21:04:46 +08:00

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
};
};