2013-08-08 2 views
30

Как закрыть соединение сокета на стороне клиента?Node.js: socket.io закрыть клиентское соединение

Я использую:

  • socket.io 0,9
  • node.js 0.10.15
  • выразить 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(); 
}; 

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

+0

Как вы обрабатывать 'getInitData' события? –

+0

'getInitData' возвращает некоторые значения из моего собственного аддона написанного узла. эти значения устанавливаются в форме (флажок, текстовое поле и т. Д.) , но я только узнал, что соединение на сервере запускается несколько раз. Каждый раз, когда я перезагружаю страницу, добавляется новое соединение, даже если соединение закрыто. – baam

+1

Нет такой связи, как соединение со стороны сервера и браузера. Существует только одно соединение. Если одна из сторон закрывает ее, то она закрывается (и вы не можете передавать данные в соединение, которое закрыто, очевидно). Теперь браузер закрывает соединение, когда вы покидаете страницу (это не зависит от используемой библиотеки), это, по крайней мере, верно для WebSockets. Если возникает такая проблема, я уверен, что в вашем собственном коде есть ошибка (на стороне сервера). Возможно, вы укладываете некоторые обработчики событий, в которых вы не должны. – freakish

ответ

7

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

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

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

+7

*« Если одна из сторон закрывает его, затем закрывается "* - как его программно закрыть с каждой стороны ..?Я не нашел никакой документации –

57

Пробовали ли вы:

socket.disconnect() 

на клиенте?

+0

Нет, я не сделал. Я думал, что это просто вызовет событие разъединения на стороне сервера? И когда я это вызвал? – baam

+0

Я пропустил это в вашем вопросе, но когда вы хотите закрыть соединение с клиентом? –

+0

Каждый раз, когда соединение с сервером закрывается. (перезагрузка/обновление и разгрузка страницы/отпуск) – baam

1

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

socket.conn.close() 

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

0

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

socket.close(); 

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

socket.connect(); 
5
socket.disconnect() 

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

socket.close() 

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

0

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

+0

Что должен делать истинный аргентин? – netpoetica

13

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

На сервере:

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

На клиенте:

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

Привет. Это работает, спасибо. Но он также удаляет пользователя из подключенного массива пользователей? – user3304007

+0

Он должен удалить, но я не уверен. Попытка печати массива пользователей после закрытия соединения. –

+0

Готово. Как я могу напечатать массив пользователей? До этого я использовал этот, чтобы удалить отключенного пользователя. удалить пользователей [socket.nickname] – user3304007

Смежные вопросы