Socket.io send disconnect event with parameter
Asked Answered
I

2

8

I want to send disconnect event manually with custom parameter to socket.io server. I use this function but won't work:

//client

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

//Server

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

Now how can I send a additional data to server when disconnect event sent?

Icbm answered 26/11, 2016 at 8:14 Comment(0)
S
11

Socket IO's disconnect event is fired internally but you can emit a custom event when it is called.

You need to first listen for the disconnect event. Once this event has been called, you should then emit your own custom event say we call it myCustomEvent Once this event has been called, your client should then be listening out for your myCustomEvent and on hearing it, should then output the data you passed it. For example:

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)
  })
})

Your client would then listen for myCustomEvent like so

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

I hope this helps :)

Supermundane answered 26/11, 2016 at 11:5 Comment(4)
But if the client sent a disconnect event already, what is the guarantee that he'll listen to myCustomEvent? That means he is not disconnected right?Arctic
The custom event will be the last event emitted before it leaves and every other remaining socket that is still connected will hear that eventSupermundane
calling socket.disconnect will trigger the disconenct event and the server will send it to it's sockets, but socket that triggered the event will not receive itKristopherkristos
after disconnect myCustomEvent is not emitting anymoreCatamnesis
O
2

We can manage a global array at server side.

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'}); 
    });
});

On clients side,

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

This answer is inspired from Jackthomson's answer.

Objection answered 12/11, 2020 at 4:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.