2012-04-26 36 views
26

Tôi đã thực hiện một bộ đếm khách truy cập thời gian thực đơn giản.socket.io: ngắt kết nối sự kiện không được kích hoạt

Bạn có thể tải xuống từ this repository.

Điều gì xảy ra là sự kiện ngắt kết nối (ngay cả sau khi trình duyệt đóng) trên máy chủ sẽ không bao giờ được kích hoạt.

server.js là:

(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 trên máy khách là:

script(type='text/javascript') 

     var socket = io.connect(); 

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

Trả lời

44

Đặt trên ngắt kết nối mã của bạn bên trong của bạn trên khối kết nối và chỉnh sửa nó một chút như vậy:

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

Bằng cách này bạn đang phát hiện khi một ổ cắm cụ thể (cụ thể là ổ cắm bạn chuyển đến chức năng ẩn danh của bạn đang chạy trên kết nối) bị ngắt kết nối.

+0

Bạn có nhận thấy rằng tôi đã viết socket.on ở trên không? – swiecki

+0

Tuyệt vời, bây giờ nó hoạt động tốt –

+5

FYI, nếu xhr-polling đang được sử dụng cho việc vận chuyển, có thể có khá chậm trễ trước khi ngắt kết nối. –

2

Từ Socket.IO 1.0 thuộc tính io.engine.clientsCount có sẵn. Thuộc tính này cho bạn biết số lượng kết nối mở mà ứng dụng của bạn hiện có.

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

Lưu ý: Sử dụng .once thay vì .on và người nghe sẽ được gỡ bỏ tự động từ các socket những gì là tốt cho chúng ta bây giờ, vì sự kiện ngắt kết nối chỉ bắn một lần mỗi socket.

0

Chỉ trong trường hợp bất kỳ ai khác thực hiện sai lầm ngớ ngẩn này: hãy đảm bảo rằng bất kỳ phần mềm trung gian ổ cắm nào bạn đã xác định cuộc gọi next() ở cuối hoặc nếu không trình xử lý ổ cắm khác sẽ chạy.

// 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"); 
    }); 
}); 
Các vấn đề liên quan