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

1 回复

更多关于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”,这通常表示服务端主动关闭了连接,或者连接由于某些原因被中断。

可能的原因和解决方案:

  1. 服务端主动关闭连接

    • 如果服务端主动关闭连接,并返回状态码 1001,这通常表示服务端正在关闭或正在重新启动。你可以检查服务端的日志,确认是否是服务端主动关闭了连接。
    • 解决方案:在这种情况下,客户端可以尝试重新连接,或者在应用逻辑中处理连接关闭的情况。
  2. 网络问题

    • 如果网络不稳定,可能会导致连接中断,从而触发 “Stream end encountered” 错误。
    • 解决方案:检查网络连接是否稳定,或者在网络恢复后重新连接。
  3. iOS 系统的限制

    • iOS 系统可能会在应用进入后台时限制 WebSocket 的连接,导致连接被中断。
    • 解决方案:在 uni-app 中,可以通过监听应用的生命周期事件(如 onShowonHide),在应用进入后台时关闭 WebSocket 连接,在应用回到前台时重新连接。
  4. 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();
    }
});
回到顶部