uni-app调用websocket无法关闭

uni-app调用websocket无法关闭

问题描述

Android端APP,第一次执行uni.closeSocket后会显示关闭成功,但是WebSocket并没有被关闭,依然在获取数据。之后的uni.closeSocket全部返回关闭失败!

uni.connectSocket({  
    url: 'ws://172.16.32.204:8000',  
    success: (res) => {  
        console.log("WebSocket服务连接成功!");  
    }  
})  

uni.onSocketOpen(function() {  
    uni.onSocketMessage(function(res) {  
        console.log("收到服务器内容:" + res.data);  

        uni.closeSocket({  
            success: function(res) {  
                console.log("WebSocket关闭成功!");  
            },  
            fail: function(res) {  
                console.log("WebSocket关闭失败!");  
            }  
        })  
    })  
})


更多关于uni-app调用websocket无法关闭的实战教程也可以访问 https://www.itying.com/category-93-b0.html

32 回复

我昨天刚试了移动端。你试行不行。就是uni.closeSocket的参数里有一个code,默认是发送1000的。表示正常关闭。把这个值换成1000之外的值,例如500.就会关闭。同时onSocketError会被调用。

更多关于uni-app调用websocket无法关闭的实战教程也可以访问 https://www.itying.com/category-93-b0.html


大佬的方法亲测有效

app还是没有办法正常关闭

同样代码下H5端正常,怀疑是APP端的Bug。

别沉啊,官方有没有解决方案。要是有得救我就不改写WebView了啊!

别沉啊

H5和IOS 15测试均正常,Android 8和Android 10关闭全失效。目前手里就这些设备了,现在已改用WebView作为临时方案。希望官方尽快修改。

我试试

是不是有问题,我这边虽然显示关闭成功,但是ios还是可以接收到心跳

回复 苏陌: 你不要立刻执行关闭。 设置个timeout 延迟2s试试

回复 DCloud_Android_DQQ: 我是在退出登录的时候 关闭的

回复 DCloud_Android_DQQ: 延迟2s也不行,监听关闭api已经监听到已关闭了,但是还是可以接收到心跳,苹果11

回复 苏陌: 那到底是苹果的问题 还是 android的问题哟

回复 DCloud_Android_DQQ: D哥,我一直说的ios,没有用安卓测试

回复 DCloud_Android_DQQ: Android 10试过了延迟关闭,也无效。

回复 DCloud_Android_DQQ: 我上面贴的那个代码,放在iOS上是可以正常关闭的,Android端无效。至于楼上说的心跳我不清楚,我这边的需求是拿到第一个值以后立刻关闭WebSocket。

回复 w***@gmail.com: 我看看

回复 w***@gmail.com: 我回复在下面了。

再总结一下。 你的写法是有问题的。 用下面的代码测试 可以实现你的需要
websocket: function() {
console.log(“websocket!222”);
uni.connectSocket({
url: ‘wss://xxxxxxxx.com/xxxx/Socket?token=290090’,
success: (res) => {
console.log(“WebSocket服务连接成功!”);
}
})

            // uni.onSocketOpen(function() {  

                uni.onSocketMessage(function(res) {  
                    console.log("收到服务器内容:"   res.data);  

                    uni.closeSocket({  
                        success: function(res) {  
                            console.log("WebSocket关闭成功!");  
                        },  
                        fail: function(res) {  
                            console.log("WebSocket关闭失败!");  
                        }  
                    })  

                })  

            // })  

        },<br>

我用这段代码测试了一下还是关不上,跟我上面贴出的代码效果一样。

回复 w***@gmail.com: 换个手机。或者你提供一下你的websocket 地址我在我这边试试

回复 w***@gmail.com: 我这边换了几部手机都OK

我也碰到这种情况了,h5可以正常关闭,app关闭不了。用了你贴的代码还是不行,请问有解决办法吗?

我的也关不上,虽然提示关闭成功,但是还是有心跳发送

这个问题有解决吗

我昨天刚试了移动端。你试行不行。就是uni.closeSocket的参数里有一个code,默认是发送1000的。表示正常关闭。把这个值换成1000之外的值,例如500.就会关闭。同时onSocketError会被调用。

问下,这个问题处理了吗,发现移动端小程序也有这个问题,没法关闭websocekt,有解决方案吗

真的是服了, 沉年老问题,2024了。还有。死活关不掉,提示了关闭成功,但是心跳还是有, 进页面了又创建一个监听,然后返回上一页,提示关闭成功, 重新进入页面,又创建一个监听。导致所有功能都不正常。
反正就是每次退出都提示正常关闭了监听,但是重新进入页面创建监听,就会在上次的基础监听上+1次。
机型是华为P60 ,魅族的也试了,一样。



哈哈哈 难兄难弟 不敢置信是3年前就发现的bug

用socketTask 试试 可以关闭&onMessage
虽然没解决但是结果正确

这是一个典型的WebSocket关闭时序问题。在uni.onSocketMessage回调中直接调用uni.closeSocket会导致连接状态异常。

问题分析: 当WebSocket连接成功后,服务器持续推送数据,每次收到消息都会触发onSocketMessage回调。如果在回调中立即执行closeSocket,而服务器仍在发送数据,就会造成连接状态冲突。第一次可能显示成功但实际未完全关闭,后续再调用就会失败。

解决方案:

  1. 避免在消息回调中关闭连接:将关闭逻辑移到合适的业务位置
  2. 使用状态控制:添加连接状态标识
  3. 完整示例代码:
let socketOpen = false
let socketTask = null

// 连接WebSocket
function connectWebSocket() {
    socketTask = uni.connectSocket({
        url: 'ws://172.16.32.204:8000',
        success: (res) => {
            console.log("开始连接WebSocket")
        }
    })
    
    socketTask.onOpen(() => {
        socketOpen = true
        console.log("WebSocket连接成功")
    })
    
    socketTask.onMessage((res) => {
        console.log("收到服务器内容:" + res.data)
        // 处理消息,不要在这里关闭连接
    })
    
    socketTask.onClose(() => {
        socketOpen = false
        console.log("WebSocket连接关闭")
    })
}

// 关闭WebSocket
function closeWebSocket() {
    if (socketTask && socketOpen) {
        socketTask.close({
            success: (res) => {
                socketOpen = false
                console.log("WebSocket关闭成功")
            },
            fail: (err) => {
                console.log("WebSocket关闭失败", err)
            }
        })
    }
}

// 在需要的时候调用closeWebSocket()
回到顶部