uni-app中使用socket时onmessage无触发但能send消息的实现问题
uni-app中使用socket时onmessage无触发但能send消息的实现问题
let wsInstance = null;
let reconnectAttempts = 0; // 当前连接次数
const MAX_RECONNECT_ATTEMPTS = 99; // 最大连接次数
let messageListeners = []; // 消息监听器数组
const heartCheck = {
timeout: 1000, // 1秒发一次心跳
timeoutObj: null,
reset: function () {
clearTimeout(this.timeoutObj);
this.start();
},
start: function () {
this.timeoutObj = setTimeout(() => {
if (wsInstance && wsInstance.readyState === WebSocket.OPEN) {
let msg = ‘online:uuu’;
let adminId = uni.getStorageSync(“adminId”);
if (adminId !== null && adminId !== ‘’ && adminId !== undefined) {
msg = ‘online’ + ‘:’ + adminId;
}
wsInstance.send({ data: msg }); // 发送心跳消息
this.reset(); // 重置心跳检测
}
}, this.timeout);
},
};
function connect() {
wsInstance = uni.connectSocket({
url: ‘wss://xxx.xxxx.xxxx/ws’, // 连接地址
success: () => {
console.log(‘WebSocket连接成功’);
reconnectAttempts = 0;
heartCheck.start();
},
fail: (err) => {
console.error(‘WebSocket连接失败:’, err);
},
});
wsInstance.onOpen(() => {
console.log(‘WebSocket连接成功’);
reconnectAttempts = 0;
heartCheck.start();
});
wsInstance.onMessage((event) => {
console.log(‘接收到消息:’, event.data);
// 分发事件到所有注册的监听器
messageListeners.forEach((listener) => {
listener(event.data);
});
});
wsInstance.onClose(() => {
console.log(‘WebSocket连接关闭,尝试重连’);
heartCheck.reset();
if (reconnectAttempts < MAX_RECONNECT_ATTEMPTS) {
setTimeout(connect, 2000);
reconnectAttempts++;
}
});
wsInstance.onError((error) => {
console.error(‘WebSocket连接出错:’, error);
});
}
function send(message) {
if (wsInstance) {
wsInstance.send({
data: message,
success: () => {
console.log(‘发送成功’);
},
fail: (err) => {
console.error(‘发送失败:’, err);
},
});
} else {
console.error(‘WebSocket未连接或连接已关闭’);
}
}
function close() {
if (wsInstance) {
wsInstance.close({
success: () => {
console.log(‘WebSocket连接关闭成功’);
},
fail: (err) => {
console.error(‘关闭连接失败:’, err);
},
});
}
}
function addMessageListener(listener) {
messageListeners.push(listener);
}
function removeMessageListener(listener) {
messageListeners = messageListeners.filter((l) => l !== listener);
}
export default {
connect,
send,
close,
addMessageListener,
removeMessageListener,
};
WebSocket.OPEN 是不跨端的,小程序是没有全局WebSocket对象的,确认自己的socket服务是正常的,我这里测试,移除掉WebSocket.OPEN的相关代码,是可以正常发送,接收消息的
我从if (wsInstance && wsInstance.readyState === WebSocket.OPEN) {这里开始移除的,但是真机上发现还是不行,onmessage没有触发,在网页上运行的不移除代码都能收到消息
回复 DCloud_UNI_FengXY: HBuilderX4.44版本的真机,机器是OPPO reno9,但是我感觉安卓都有这种情况,我们的测试用的OPPO reno6pro也是一样的情况
测试android模拟器运行未发现有问题,附件是测试项目
好的,我再去试试,谢谢哈
在uni-app中使用Socket时,如果遇到onmessage
事件没有触发但能够成功发送消息的问题,通常是由于几个常见的配置或实现细节上的疏忽。以下是一些可能导致这个问题的原因及相应的代码示例,帮助你排查和解决这一问题。
1. 确保Socket连接已正确建立
首先,确保你的Socket连接已经成功建立。在uni-app中,可以通过监听open
事件来确认连接状态。
const socket = uni.connectSocket({
url: 'wss://your-socket-server-url',
success: function () {
console.log('Socket连接成功建立');
},
fail: function (err) {
console.error('Socket连接失败', err);
}
});
socket.onOpen(function () {
console.log('Socket连接已打开');
// 可以在这里发送消息
socket.send({
data: 'Hello Server',
});
});
2. 监听onMessage
事件
确保你已经正确设置了onMessage
事件监听器。
socket.onMessage(function (res) {
console.log('收到服务器消息', res.data);
// 处理接收到的消息
});
3. 检查服务器响应
如果客户端能够发送消息但无法接收,可能是服务器端没有正确发送响应。确保服务器在接收到消息后,能够正确发送回消息。
4. 错误处理
添加错误处理逻辑,以便在连接关闭或出错时能够捕获到相关信息。
socket.onClose(function (res) {
console.log('Socket已关闭', res);
});
socket.onError(function (err) {
console.error('Socket错误', err);
});
5. 完整示例
以下是一个完整的示例,展示了如何在uni-app中正确设置Socket连接,并处理消息发送和接收。
const socket = uni.connectSocket({
url: 'wss://your-socket-server-url',
});
socket.onOpen(function () {
console.log('Socket连接已打开');
socket.send({
data: 'Hello Server',
});
});
socket.onMessage(function (res) {
console.log('收到服务器消息', res.data);
});
socket.onClose(function (res) {
console.log('Socket已关闭', res);
});
socket.onError(function (err) {
console.error('Socket错误', err);
});
确保你的服务器URL是正确的,并且服务器已经配置好WebSocket支持。如果问题依旧存在,建议检查服务器端的日志,看是否有关于连接或消息处理的错误信息。