#javascript #node.js #socket.io
#javascript #node.js #socket.io
Вопрос:
Рассмотрим следующее:
//client side:
var socket = io('http://localhost');
//disconnecting client side 5 seconds after connecting
setTimeout(function(){
socket.disconnect();
},5000);
//Server side:
var io = ......
io.on('connection', function (socket) {
setInterval(function(){
console.log(socket.id);//this will continue outputting the socket.id forever.
},1000);
});
Теперь мой вопрос в том, как я буду отключаться от обоих серверов / клиентов, поскольку один только клиентский подход, похоже, не работает.
Спасибо.
Ответ №1:
Что касается вашего фактического вопроса: не нужно ничего делать, клиент отключен от сервера. Однако проблема, с которой вы сталкиваетесь, заключается не в том, что клиент не отключен, а в том, что вы создали интервал. В JavaScript обратный вызов setInterval будет продолжать выполняться до тех пор, пока вы не прикажете ему остановиться.
Таким образом, решение состоит в том, чтобы указать ему останавливаться при отключении клиента:
//Server side:
var io = ......
io.on('connection', function (socket) {
var intervalId = setInterval(function(){
console.log(socket.id); //this will continue outputting the socket.id until clearInterval() is called
},1000);
socket.on('disconnect', function() {
clearInterval(intervalId);
});
});
Комментарии:
1. затем я неправильно объяснил свою проблему. 1.) я знаю, какие интервалы я использовал interval только для демонстрации этого сокета. идентификатор остается действительным даже после отключения. 2.) не нужно ничего делать.. он отключается сам по себе.. ну, я не знаю, я имею в виду,
on("disconnect"
срабатывает, но сокет все еще жив .. так что это странно2. Что ж, это наверняка делает мой ответ бесполезным. Но что вы имеете в виду, говоря «сокет все еще активен»? Даже если объект все еще существует (что всегда будет, поскольку у вас есть ссылка на него) Я почти уверен, что сокет. io просто не отправляет данные в пустоту. После отключения,
socket.connected = false
,socket.disconnected = false
и сокет не включенio.sockets.connected
. Каким образом сокет недостаточно разряжен для вас? Или, скорее: какую проблему вы на самом деле пытаетесь решить?3. когда я подключаюсь к двум разным браузерам — у меня будет 2
io.on("connection"
срабатывания — что имеет смысл, если я остановлю приложение и немедленно перезапущу его после того, как оно попытается повторно подключиться к этим двум сокетам. теперь, отображая ту же ситуацию, только перед перезапуском сервера я отключаю один из браузеров, а затем перезагружаю сервер, чего вы ожидаете, так это того, что он повторно подключится только к одному сокету, но он повторно подключит их обоих..4. Извините, я не видел вашего ответа. Я только что попробовал ваш сценарий, и для меня он вел себя так, как ожидалось. Возможно, вам следует задать вопрос об этой конкретной проблеме (имея только необходимый код для ее воспроизведения)?