Как подключиться к websocket после подключения
Я создаю мое соединение с этим кодом (например,):
var socket = new WebSocket("ws://94.12.176.177:8080");
И я закрываю соединение с этим:
socket.close();
Но как мне восстановить соединение?
Я провел некоторое исследование и попробовал несколько методов. Этот вопрос не помог мне: Socket.io повторно подключиться к отключению?
Это единственный результат, близкий к тому, что я ищу.
Причина, по которой я хочу сделать это, - это разрешить пользователям прекращать отправку данных на веб-ресурс и повторно отправлять их через некоторое время. Без повторного подключения пользователь должен обновить страницу для повторной отправки. Это может привести к потере некоторых данных. Спасибо.
Ответы
Ответ 1
Вам нужно будет воссоздать сокет, чтобы его можно было повторно подключить. Единственная проблема заключается в том, что вам придется повторно привязать обработчики.
Но действительно, websockets предназначены для того, чтобы оставаться открытыми.
Лучшим способом было бы закрыть сервер. Таким образом, websocket запускает событие onclose
, но будет продолжать попытки подключения. Когда сервер снова прослушивает, соединение будет автоматически восстановлено.
Ответ 2
Когда сервер закрывает соединение, клиент не пытается повторно подключиться. Возможно, с некоторыми фреймворками JS, но на момент ответа этот вопрос был отмечен как простой Vanilla JS.
Я немного расстроен, потому что принятый, поддержанный ответ явно неправильный, и это стоило мне некоторого дополнительного времени при поиске правильного решения.
Что здесь: Повторное подключение Клиента при перезагрузке сервера в WebSocket
Ответ 3
Безупречная реализация:
var socket;
const socketMessageListener = (event) => {
console.log(event.data);
};
const socketOpenListener = (event) => {
console.log('Connected');
socket.send('hello');
};
const socketCloseListener = (event) => {
if (socket) {
console.error('Disconnected.');
}
socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open', socketOpenListener);
socket.addEventListener('message', socketMessageListener);
socket.addEventListener('close', socketCloseListener);
};
socketCloseListener();
Чтобы проверить это:
setTimeout(()=>{
socket.close();
},5000);
Изменить: обратите внимание на реализацию Exponential Backoff (в связанном потоке по верхнему комментарию: fooobar.com/info/74368/...), а не в приведенном выше коде, НО ОЧЕНЬ ОЧЕНЬ ЧРЕЗВЫЧАЙНО.
Изменить еще раз: проверить back
с primus
: https://www.npmjs.com/package/back, это гибкая сексуальная реализация.