Как я могу отключить сокет как на стороне сервера, так и на стороне клиента в socket.io 1.0

#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. Извините, я не видел вашего ответа. Я только что попробовал ваш сценарий, и для меня он вел себя так, как ожидалось. Возможно, вам следует задать вопрос об этой конкретной проблеме (имея только необходимый код для ее воспроизведения)?