Подтвердить что ты не робот

Node.js: connection.io закрыть соединение с клиентом

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

Я использую:

  • 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('open socket: ' + socket);

  socket.on('disconnect', function () {
    console.log('disconnected event');
    //socket.manager.onClientDisconnect(socket.id); --> endless loop with this disconnect event on server side
    //socket.disconnect(); --> same here
  });
});

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

var socket = io.connect('http://localhost:3000/test');
socket.on('disconnect', function () {
   console.log('disconnect client event....');
});

socket.emit('getInitData', function (data) {
  .. do something with data
});

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

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

UPDATE
Я попробовал теперь следующее: (клиентская сторона)

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вы пытались:

socket.disconnect() 

на клиенте?

Ответ 3

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

На сервере:

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

На клиенте:

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

Ответ 4

socket.disconnect()

Только перезагрузка события отключения отключения соединения на стороне клиента. Но снова подключается.

socket.close()

Отключите соединение от клиента. Клиент будет продолжать пытаться подключиться.

Ответ 5

Я пытаюсь закрыть подключение пользователей в версии 1.0 и нашел этот метод:

socket.conn.close()

Разница между этим методом и отключением() заключается в том, что клиент будет продолжать пытаться подключиться к серверу.

Ответ 6

попробуйте это, чтобы закрыть соединение:

socket.close();

и если вы хотите снова открыть его:

socket.connect();

Ответ 7

Просто попробуйте socket.disconnect(true) на стороне сервера, испустив любое событие с клиентской стороны.