Как подключиться к 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, это гибкая сексуальная реализация.