我一直在寻找“WebSocket已处于CLOSING或CLOSED状态”问题的解决方案,并发现:
答案#1与Meteor严格相关,而#2没有答案......我有一个带套接字的节点服务器应用程序:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server });
wss.on('connection', function connection(socket) {
socket.on('message', function incoming(data) {
console.log('Incoming data ', data);
});
});
客户连接如下:
const socket = new WebSocket('ws://localhost:3090'); //Create WebSocket connection
//Connection opened
socket.addEventListener('open', function(event) {
console.log("Connected to server");
});
//Listen to messages
socket.addEventListener('message', function(event) {
console.log('Message from server ', event);
});
然而,几分钟后,客户端随机断开连接和功能
socket.send(JSON.stringify(data));
然后抛出“WebSocket已经处于CLOSING或CLOSED状态。”。
我正在寻找一种检测和处理这些断开连接的方法,并立即尝试再次连接。
最正确有效的方法是什么?
答案 0 :(得分:3)
最简单的方法是在发送之前检查套接字是否打开。
例如-编写一个简单的函数:
function isOpen(ws) { return ws.readyState === ws.OPEN }
然后-在任何socket.send
之前,请确保其已打开:
if (!isOpen(socket)) return;
socket.send(JSON.stringify(data));
您还可以像this answer一样重写send
函数,但是以我的方式,您可以记录这种情况。
然后,对于您的第二个请求
立即尝试再次连接
无法从服务器上完成。
客户端代码应监视WebSocket状态并根据您的需要应用重新连接方法。
例如-检查很好的this VueJS库。查看启用自动重新连接部分
答案 1 :(得分:0)
嗯,我的答案很简单,就是你每隔一段时间向web socket发送消息,以了解你正在使用该服务。这比你有另一个连接要好。现在,您在 web socket 函数所在的位置启动您的项目并检查元素以查看状态 Time,并查看关闭时间的“pending”更改时间。所以现在你将定义一个间隔媒体来创建一个像这样的 setInterval 函数,例如:enter code here
const conn = WebSocket("WSS://YourLocationWebSocket.com");
setInterval(function(){
var object = {"message":"ARandonMessage"};
object = JSON.stringify(object);
conn.send(object);
},/*The time, I suggest 40 seconds, so*/ 40000)