Как поймать и иметь дело с "WebSocket уже находится в состоянии ЗАКРЫТИЕ или ЗАКРЫТО" в узле
Я искал решение проблемы "WebSocket уже находится в состоянии CLOSING или CLOSED" и нашел следующее:
- Meteor WebSocket уже находится в состоянии CLOSING или CLOSED
- WebSocket уже находится в состоянии CLOSING или CLOSED.
Ответ # 1 предназначен для строгого отношения к Meteor, а # 2 не имеет ответов... У меня есть серверное приложение Node с сокетом:
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 уже в состоянии ЗАКРЫТЬ или ЗАКРЫТО".
Я ищу способ обнаружения и устранения этих отключений и немедленно попытаюсь подключиться снова.
Каков наиболее правильный и эффективный способ сделать это?
Ответы
Ответ 1
Самый простой способ - проверить, открыт ли сокет или нет, перед отправкой.
Например - напишите простую функцию:
function isOpen(ws) { return ws.readyState === ws.OPEN }
Затем - перед любым socket.send
убедитесь, что он открыт:
if (!isOpen(socket)) return;
socket.send(JSON.stringify(data));
Вы также можете переписать функцию send
как этот ответ, но, по-моему, вы можете регистрировать эти ситуации.
Насколько я знаю - вы не можете "попытаться подключиться снова" с сервера, вы должны следить за состоянием WebSocket на стороне клиента для этого.