socket.send outside of io.sockets.on( )

14,984

Solution 1

I think that this will successfully solve your problem

io.sockets.emit('hello')

Solution 2

Improving previous answer from @Nyxynyx

io.sockets.emit('hello')

It is equivalent to:

io.of('/').emit('hello');

If you need a different route, change the of function parameter.

Documentation: https://socket.io/docs/v3/server-api/index.html#server-sockets

Share:
14,984

Related videos on Youtube

Nyxynyx
Author by

Nyxynyx

Hello :) I have no formal education in programming :( And I need your help! :D These days its web development: Node.js Meteor.js Python PHP Laravel Javascript / jQuery d3.js MySQL PostgreSQL MongoDB PostGIS

Updated on June 06, 2022

Comments

  • Nyxynyx
    Nyxynyx almost 2 years

    I have a loop that querys a database continuously. When the query returns a result, the node.js app will send a message to every client connected to the node server via socket.io v0.8.

    Problem: io.sockets.broadcast.send('msg') is called in the middle of a setInterval() loop so it is not within an io.sockets.on()'s callback function and thus this will not work. When io.sockets.send('msg') is used, no message seems to be sent to the client.

    Node.js code

    setInterval(function() {
        util.log('Checking for new jobs...');
        dbCheckQueue(function(results) {
            if (results.length) {
                io.sockets.broadcast.send('hello');
            }
        });
    }, 10*1000);
    

    However, if the setInterval is to be called from within io.sockets.on('connection',..), every connected client will create an additional loop!

    Node.js code

    io.sockets.on('connection', function(socket) {
        setInterval(function() {
            util.log('Checking for new jobs...');
            dbCheckQueue(function(results) {
                if (results.length) {
                    io.sockets.send('hello');
                }
            });
        }, 10*1000);
    });
    

    Clientside JS

            socket.on('hello', function() {
                console.log('HELLO received');
            })
    

    *How can I get a SINGLE loop to run, but still be able to send a message to all connected clients?

    • Eliasdx
      Eliasdx over 12 years
      io.sockets can be accessed outside of io.sockets.on.
    • Nyxynyx
      Nyxynyx over 12 years
      @Eliasdx When I use io.sockets.broadcast.send('hello') outside, I get the error TypeError: Cannot call method 'send' of undefined
    • Eliasdx
      Eliasdx over 12 years
      you can only use broadcast on a socket, e.g. socket.broadcast.send within a io.sockets.on-callback. however i think you can send to all clients with io.sockets.send (with io. and without broadcast).
    • Nyxynyx
      Nyxynyx over 12 years
      It appears that none of the clients can receive it if I use io.sockets.send('hello')
    • Eliasdx
      Eliasdx over 12 years
      Hum. if you want to use socket.on('hello',...) you must use socket.emit instead of socket.send.
    • Nyxynyx
      Nyxynyx over 12 years
      If I want to send a message to all clients outside of the io.sockets.on callback function, is io.sockets.send() the only function I can use? If so, what should I use on the client side instead of socket.on('hello', ...)
    • Eliasdx
      Eliasdx over 12 years
      Just use io.sockets.emit('hello') to send the msg. socket.io/#how-to-use
    • Nyxynyx
      Nyxynyx over 12 years
      @Eliasdx Awesome, that works.
    • Deepak M
      Deepak M over 6 years
  • Hossein
    Hossein over 9 years
    Thanks! you saved my day.
  • Kyle Corbin Hurst
    Kyle Corbin Hurst over 2 years
    For anyone in the future: io.of('/').emit('hello'); is actually the better function to use if you're using the redis adapter and rooms: io.of('/').adapter.remoteJoin(user.socket_id, data.conversation.id);. The reason being is that io.sockets will emit for every person that joins a room.