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
我昨天刚试了移动端。你试行不行。就是uni.closeSocket的参数里有一个code,默认是发送1000的。表示正常关闭。把这个值换成1000之外的值,例如500.就会关闭。同时onSocketError会被调用。
更多关于uni-app调用websocket无法关闭的实战教程也可以访问 https://www.itying.com/category-93-b0.html
大佬的方法亲测有效
同样代码下H5端正常,怀疑是APP端的Bug。
别沉啊,官方有没有解决方案。要是有得救我就不改写WebView了啊!
【正确报bug的姿势】https://ask.dcloud.net.cn/article/38139
别沉啊
H5和IOS 15测试均正常,Android 8和Android 10关闭全失效。目前手里就这些设备了,现在已改用WebView作为临时方案。希望官方尽快修改。
我试试
回复 DCloud_Android_DQQ: 我是在退出登录的时候 关闭的
回复 DCloud_Android_DQQ: 延迟2s也不行,监听关闭api已经监听到已关闭了,但是还是可以接收到心跳,苹果11
回复 苏陌: 那到底是苹果的问题 还是 android的问题哟
回复 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,而服务器仍在发送数据,就会造成连接状态冲突。第一次可能显示成功但实际未完全关闭,后续再调用就会失败。
解决方案:
- 避免在消息回调中关闭连接:将关闭逻辑移到合适的业务位置
- 使用状态控制:添加连接状态标识
- 完整示例代码:
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()


