uni-app ios下websocket接收消息,服务端关闭返回1001状态码,错误信息为Stream end encountered的问题
uni-app ios下websocket接收消息,服务端关闭返回1001状态码,错误信息为Stream end encountered的问题
示例代码:
export default {
data() {
return {
title: 'Hello',
content: ''
}
},
onLoad() {
// 注意这里有时序问题,
// 如果 uni.connectSocket 还没回调 uni.onSocketOpen,而先调用 uni.closeSocket,那么就做不到关闭 WebSocket 的目的。
// 必须在 WebSocket 打开期间调用 uni.closeSocket 才能关闭。
uni.onSocketOpen(function(e) {
console.log('打开', e);
uni.sendSocketMessage({
data: JSON.stringify({
"history": [],
"input": "11"
}),
complete(res) {
console.log('发送消息成功', res);
}
})
});
uni.onSocketClose(function(res) {
console.log('WebSocket 已关闭!', res);
uni.closeSocket({
code: 1000
})
});
uni.onSocketMessage(function(res) {
console.log('收到服务器内容:' + res.data);
const data = JSON.parse(res.data)
if (data.code === 10010) {
uni.closeSocket({
code: 1000
})
}
});
uni.onSocketError(function(res) {
console.log('WebSocket连接打开失败,请检查!', res);
});
},
methods: {
send() {
uni.connectSocket({
url: 'ws://xxx',
complete(res) {
console.log('res',res);
},
header: {
'Authorization': 'xxx'
}
});
}
}
}
操作步骤:
客户端发送消息,有几次会出现这个错误。
预期结果:
完整接收服务端传过来的消息,客户端正常关闭。
实际结果:
触发了服务端关闭事件,返回信息为:
{
"code": 1001,
"reason": "Stream end encountered"
}

bug描述:
使用socketapi访问websocket的时候,抓包显示服务端把信息都全部返回后,客户端有时可以完整接收服务端的消息,有时候会未接收完服务端的消息,就会触发服务端关闭事件,返回1001状态码,错误信息为Stream end encountered。
更多关于uni-app ios下websocket接收消息,服务端关闭返回1001状态码,错误信息为Stream end encountered的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app ios下websocket接收消息,服务端关闭返回1001状态码,错误信息为Stream end encountered的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在 uni-app 中使用 WebSocket 进行通信时,如果服务端关闭连接并返回状态码 1001(CLOSE_GOING_AWAY),并且客户端接收到错误信息为 “Stream end encountered”,这通常表示服务端主动关闭了连接,或者连接由于某些原因被中断。
可能的原因和解决方案:
-
服务端主动关闭连接:
- 如果服务端主动关闭连接,并返回状态码 1001,这通常表示服务端正在关闭或正在重新启动。你可以检查服务端的日志,确认是否是服务端主动关闭了连接。
- 解决方案:在这种情况下,客户端可以尝试重新连接,或者在应用逻辑中处理连接关闭的情况。
-
网络问题:
- 如果网络不稳定,可能会导致连接中断,从而触发 “Stream end encountered” 错误。
- 解决方案:检查网络连接是否稳定,或者在网络恢复后重新连接。
-
iOS 系统的限制:
- iOS 系统可能会在应用进入后台时限制 WebSocket 的连接,导致连接被中断。
- 解决方案:在 uni-app 中,可以通过监听应用的生命周期事件(如
onShow和onHide),在应用进入后台时关闭 WebSocket 连接,在应用回到前台时重新连接。
-
WebSocket 实现问题:
- 可能是 WebSocket 实现中存在一些问题,导致连接异常关闭。
- 解决方案:检查 WebSocket 的实现代码,确保连接和断开处理的逻辑正确。
代码示例:
以下是一个简单的 WebSocket 连接和错误处理的示例:
let socketTask = null;
function connectWebSocket() {
socketTask = uni.connectSocket({
url: 'wss://your.websocket.url',
success: () => {
console.log('WebSocket connected');
},
fail: (err) => {
console.error('WebSocket connection failed', err);
}
});
socketTask.onOpen(() => {
console.log('WebSocket opened');
});
socketTask.onMessage((res) => {
console.log('Received message:', res.data);
});
socketTask.onClose((res) => {
console.log('WebSocket closed', res);
if (res.code === 1001) {
console.log('WebSocket closed with status code 1001');
// 可以根据需要重新连接
setTimeout(connectWebSocket, 5000); // 5秒后重新连接
}
});
socketTask.onError((err) => {
console.error('WebSocket error', err);
});
}
// 初始化连接
connectWebSocket();
// 监听应用生命周期
uni.onAppShow(() => {
console.log('App is in foreground, reconnecting WebSocket');
connectWebSocket();
});
uni.onAppHide(() => {
console.log('App is in background, closing WebSocket');
if (socketTask) {
socketTask.close();
}
});

