Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

node.js setInterval doesn't work

With node.js, I'm trying to send the current server_time to all clients in every second. Therefore, I wanted to use setInterval() to emit an event to all clients and sending the time, but it doesn't work. Did I define the setInterval function at the right place or did missed something else?

var http = require("http");
var socketIO = require('socket.io');
var connect = require('connect');

//keep track of every connected client
var clients = {};

//create Server 
var httpServer = connect.createServer(
    connect.static(__dirname)
).listen(8888);


//socket
var io = socketIO.listen(httpServer);
io.sockets.on('connection', function (socket) {

    //add current client id to array
    clients[socket.id] = socket;
    socket.on('close', function() {
        delete clients[socket.fd]; // remove the client.
    });

    //send news on connection to client
    socket.emit('news', { hello: 'world' }); 

    //this one works fine!
    //send server time on connection to client
    socket.emit("server_time", { time: new Date().toString() });

});

//this doesn't work!
// Write the time to all clients every second.
setInterval(function() { 
    var i, sock;
    for (i in clients) {
        sock = clients[i];
        if (sock.writable) { // in case it closed while we are iterating.
            sock.emit("server_time", {
                console.log("server_time sended");
                time: new Date().toString()

            });
        }
    }
}, 1000);       //every second
like image 842
rikner Avatar asked Oct 19 '25 13:10

rikner


2 Answers

May I suggest a workaround/improvement that should fix the problem. Add the clients to a chat room. Somewhere in:

io.sockets.on('connection', function (socket) {

add a

socket.join('timer');

Then the setIntervall would be

setInterval(function() { 
    io.sockets.in('timer').emit("server_time", { time: new Date().toString() })
}, 1000); 

Hope this works for you!

like image 93
Martin Avatar answered Oct 22 '25 02:10

Martin


The problem is the following function:

if (sock.writable) { // in case it closed while we are iterating.
  sock.emit("server_time", {
    // console.log("server_time sended"); // get rid of this line -> invalid code
    time: new Date().toString()
  });
}

sock.writable is undefined and therefore the emit event is never sent. Set the property to true on connection and to false on close.

like image 44
zemirco Avatar answered Oct 22 '25 02:10

zemirco