0

Node.js: Закрытие клиентского соединения в socket.io

9

Как закрыть сокет-соединение на клиентской стороне?

Я использую:

  • socket.io 0.9
  • node.js 0.10.15
  • express 3.3.4

То есть: вызываю localhost/test -- серверная сторона

var test = io
.of('/test')
.on('connection', function (socket) {
  console.log('открыт сокет: ' + socket);

  socket.on('disconnect', function () {
    console.log('событие отключения');
    //socket.manager.onClientDisconnect(socket.id); --> бесконечный цикл с этим событием отключения на сервере
    //socket.disconnect(); --> то же самое здесь
  });
});

-- клиентская сторона

var socket = io.connect('http://localhost:3000/test');
socket.on('disconnect', function () {
   console.log('событие отключения клиента....');
});

socket.emit('getInitData', function (data) {
  .. что-то делаю с данными
});

Когда я загружаю тестовую страницу, мне нужны некоторые значения с сервера (getInitData). При первом посещении страницы я получаю данные один раз, при перезагрузке или втором посещении я получаю их дважды и так далее.

Соединение на серверной стороне автоматически закрывается при перезагрузке страницы или если вы покидаете страницу. Но на клиентской стороне соединение все еще открыто. Как я могу закрыть соединение на клиентской стороне или проверить, есть ли уже открытое соединение?

ОБНОВЛЕНИЕ Я попробовал следующее: (клиентская сторона)

window.onbeforeunload = function(e) {
  socket.disconnect();
};

Это вызывает событие отключения на клиентской стороне, но я все равно получаю повторный или тройной ответ.

5 ответ(ов)

0

Вы пробовали использовать:

socket.disconnect();

на клиенте?

0

Для версии socket.io 1.4.5:

На сервере:

socket.on('end', function (){
    socket.disconnect(0);
});

На клиенте:

var socket = io();
socket.emit('end');

Этот код позволяет отправить событие 'end' с клиентской стороны на сервер. Когда сервер его получает, он отключает соединение с клиентом, вызывая метод socket.disconnect(0). Учтите, что в версии 1.4.5 стоит использовать socket.on('disconnect', ...) для обработки отключения, если необходимо выполнить какие-либо действия при отключении клиента.

0

На стороне сервера и/или клиента нет отдельного понятия "соединение". Существует лишь одно соединение. Если одна из сторон его закрывает, оно закрывается (и вы, очевидно, не можете отправить данные по закрытому соединению).

Браузер закрывает соединение, когда вы покидаете страницу (это не зависит от используемой на стороне сервера библиотеки, языка или ОС). Это, по крайней мере, верно для WebSockets (может быть, это не относится к long polling из-за keep-alive, но надеюсь, что socket.io обрабатывает это правильно).

Если происходит такая проблема, то я почти уверен, что в вашем собственном коде на стороне сервера есть ошибка. Возможно, вы накладываете несколько обработчиков событий там, где этого делать не следует.

0

В языке JavaScript для работы с сокетами, метод socket.disconnect() не завершает соединение окончательно. Он отключает клиентов и вызывает событие отключения на стороне клиента, однако при этом сокет продолжает оставаться в состоянии "подключения" и может автоматически попытаться переподключиться.

С другой стороны, метод socket.close() полностью закрывает соединение с клиентской стороны. При использовании этого метода клиент продолжит делать попытки переподключения, но само соединение будет закрыто, и будет невозможно отправлять сообщения до тех пор, пока не произойдет новое подключение.

Таким образом, если вам нужно временно отключить клиента, используйте socket.disconnect(), а если необходимо окончательно завершить соединение, — socket.close().

0

socket.disconnect() является синонимом socket.close(), который разрывает соединение с сокетом вручную.

Когда вы вводите на клиентской стороне:

const socket = io('http://localhost');

это открывает соединение с опцией autoConnect: true, что означает, что библиотека будет пытаться автоматически переподключиться, когда вы разорвёте сокет на сервере. Чтобы отключить автоматическое переподключение, вы можете сделать следующее:

const socket = io('http://localhost', { autoConnect: false });
socket.open(); // синоним для socket.connect()

Если вы хотите, вы можете вручную инициировать переподключение:

socket.on('disconnect', () => {
  socket.open();
});

Таким образом, используя указанные методы, вы можете контролировать поведение соединения и переподключения сокета в вашем приложении.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь