2012-04-26 14 views
26

निकाल दिया गया है मैंने एक साधारण रीयलटाइम विज़िटर काउंटर बनाया है।socket.io: डिस्कनेक्ट ईवेंट

आप इसे this repository से डाउनलोड कर सकते हैं।

क्या होता है कि सर्वर पर डिस्कनेक्ट ईवेंट (ब्राउज़र बंद होने के बाद भी) कभी नहीं निकाल दिया जाता है।

server.js है:

(function() { 
var app, count, express, io; 

express = require('express'); 
io = require('socket.io'); 

app = module.exports = express.createServer(); 

app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(require('stylus').middleware({ 
     src: __dirname + '/public' 
    })); 
    app.use(app.router); 
    return app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function() { 
    return app.use(express.errorHandler({ 
     dumpExceptions: true, 
     showStack: true 
    })); 
}); 
app.configure('production', function() { 
    return app.use(express.errorHandler()); 
}); 

io = require('socket.io').listen(app); 

count = 0; 

io.sockets.on('connection', function (socket) { 
    count++; 
    io.sockets.emit('count', { 
     number: count 
    }); 
}); 

io.sockets.on('disconnect', function() { 
    console.log('DISCONNESSO!!! '); 
    count--; 
    io.sockets.emit('count', { 
     number: count 
    }); 
}); 


app.get('/', function (req, res) { 
    return res.render('index', { 
     title: 'node.js express socket.io counter' 
    }); 
}); 
if (!module.parent) { 
    app.listen(10927); 
    console.log("Express server listening on port %d", app.address().port); 
} 

}).call(this); 

ग्राहक पर लिपि है:

script(type='text/javascript') 

     var socket = io.connect(); 

     socket.on('count', function (data) { 
      $('#count').html(data.number); 
     }); 

उत्तर

44

कनेक्ट खंड पर अपने अंदर अपने डिस्कनेक्ट पर कोड डालें और इतने की तरह एक सा इसे संपादित:

io.sockets.on('connection', function (socket) { 
    count++; 
    io.sockets.emit('count', { 
     number: count 
    }); 

    socket.on('disconnect', function() { 
     console.log('DISCONNESSO!!! '); 
     count--; 
     io.sockets.emit('count', { 
      number: count 
     }); 
    }); 
}); 

इस तरह आप यह पता लगा रहे हैं कि एक विशिष्ट सॉकेट (विशेष रूप से सॉकेट जो आप चलाए गए अज्ञात फ़ंक्शन पर जाते हैं कनेक्शन पर) डिस्कनेक्ट है।

+0

आप नोटिस किया कि मैं ऊपर socket.on लिखा है? – swiecki

+0

बिल्कुल सही, अब यह ठीक काम करता है –

+5

एफवाईआई, यदि परिवहन के लिए एक्सएचआर-मतदान का उपयोग किया जा रहा है, तो डिस्कनेक्ट होने से पहले देरी हो सकती है। –

2

Socket.IO 1.0 से io.engine.clientsCount संपत्ति उपलब्ध है। यह संपत्ति आपको बताती है कि वर्तमान में आपके ऐप में कितने खुले कनेक्शन हैं।

io.sockets.on('connection', function (socket) { 
    io.sockets.emit('count', { 
     number: io.engine.clientsCount 
    }); 

    socket.once('disconnect', function() { 
     io.sockets.emit('count', { 
      number: io.engine.clientsCount 
     }); 
    }); 
}); 

नोट: उपयोग .once बजाय .on और श्रोता, socket क्या अब हमारे लिए अच्छा है से स्वचालित रूप से हटा दिया जाएगा क्योंकि डिस्कनेक्ट घटना एक बार सॉकेट प्रति केवल निकाल दिया जाता है।

0

बस किसी और ने यह मूर्खतापूर्ण गलती की है: सुनिश्चित करें कि आपके द्वारा परिभाषित कोई सॉकेट मिडलवेयर अंत में next() पर कॉल करता है, अन्यथा कोई अन्य सॉकेट हैंडलर नहीं चलेंगे।

// make sure to call next() at the end or... 
io.use(function (socket, next) { 
    console.log(socket.id, "connection middleware"); 
    next(); // don't forget this! 
}); 

// ...none of the following will run: 

io.use(function (socket, next) { 
    console.log(socket.id, "second middleware"); 
    next(); // don't forget this either! 
}); 

io.on("connection", function (socket) { 
    console.log(socket.id, "connection event"); 
    socket.once("disconnect", function() { 
     console.log(socket.id, "disconnected"); 
    }); 
});