Socket.io отправляет событие отключения с параметром

Я хочу отправить событие отключения вручную с настраиваемым параметром на сервер socket.io. Я использую эту функцию, но не работает:

// клиент

var userId = 23;
socket.disconnect(user);

// Сервер

socket.on('disconnect', function (data) {
        console.log('DISCONNECT: '+  data)
    })

Теперь, как я могу отправить дополнительные данные на сервер при отправке события отключения?


person Ehsan Ali    schedule 26.11.2016    source источник


Ответы (2)


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

Сначала вам нужно прослушать событие отключения. После того, как это событие было вызвано, вы должны испустить свое собственное событие, скажем, мы его называем myCustomEvent. После того, как это событие было вызвано, ваш клиент должен затем прослушивать ваш myCustomEvent и, услышав его, должен затем вывести данные, которые вы ему передали. . Например:

io.sockets.on('connection', function (socket) {
  const _id = socket.id
  console.log('Socket Connected: ' + _id)
  // Here we emit our custom event
  socket.on('disconnect', () => {
    io.emit('myCustomEvent', {customEvent: 'Custom Message'})
    console.log('Socket disconnected: ' + _id)
  })
})

Ваш клиент тогда будет слушать myCustomEvent вот так

socket.on('myCustomEvent', (data) => {
    console.log(data)
})

Надеюсь, это поможет :)

person Jackthomson    schedule 26.11.2016
comment
Но если клиент уже отправил событие отключения, какова гарантия, что он прослушает myCustomEvent? Значит, он не отключен? - person yaswanth; 07.09.2017
comment
Настраиваемое событие будет последним событием, сгенерированным перед его выходом, и каждый другой оставшийся сокет, который все еще подключен, услышит это событие. - person Jackthomson; 12.09.2017
comment
вызов socket.disconnect вызовет событие разъединения, и сервер отправит его на свои сокеты, но сокет, вызвавший событие, не получит его - person Krzysztof Krzeszewski; 22.10.2020
comment
после отключения myCustomEvent больше не излучает - person Zeeshan Ahmad Khalil; 11.06.2021

Мы можем управлять глобальным массивом на стороне сервера.

var sockets = [];
io.on('connection', function (socket) {
    const id = socket.id ;

    socket.on('user-join', function(data) {
         sockets[id] = res.id;
    });

    socket.on('disconnect', function(data) { 
        io.emit('user-unjoin', {user_id: sockets[id],status:'offline'}); 
    });
});

На стороне клиента,

socket.on('user-unjoin', function (data) {
    // update status of data.user_id according to your need.
});

Этот ответ основан на ответе Джектомсона.

person Satyandra Shakya    schedule 12.11.2020