js close()无法关闭链接

张三
var heartbeat,
    ws = new WebSocket(url);
ws.onopen = function(e){
    heartbeat = setInterval(function(){
        ws.send({type:'heartbeat'});
    },3e4);
    plugin.emit('live.onopen', e, heartbeat);
},
    ws.onerror = function(e){
    plugin.emit('live.onerror',JSON.parse(e.data));
},
    ws.onmessage = function(e){
    plugin.emit('live.onmessage',JSON.parse(e.data));
},
    ws.onclose = function(e){
    plugin.emit('live.onclose',e);
};
return ws;

调用ws.close(); 链接依旧存在,执行close也没有报错

阅读 119
1个回答

walkor

打日志看下ws.close()是否真的被调用到。
还有你是怎么判定调用了ws.close()后没有关闭连接?

  • 张三 2021-12-01

    ws.close()系统函数,没办法查看是否被真的调用,但是调用没有报错,就应该是调用了。执行ws.close()后,再次去执行连接websocket,会报错WebSocket is already in CLOSING or CLOSED state.

  • 张三 2021-12-01

    看起来其实应该已经是关闭了,但是重新执行上面的代码来重连接,就会报这个错误。

  • walkor 2021-12-01

    这说明连接已经关闭了。连接关闭了就不能再调用ws.send了,否则会有这个报错。比如连接关闭了要把你js里定时发送心跳的定时器删除,它引用的ws仍然是旧的连接对象,连接端口后定时器仍然执行 ws.send({type:'heartbeat'}); 的时候就会出现WebSocket is already in CLOSING or CLOSED state.这个错误了。onclose的时候你要把定时器删除