2012-04-26 3 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

FYI, 전송에 xhr 폴링을 사용하는 경우 연결 해제 전에 상당한 시간이 걸릴 수 있습니다. –

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"); 
    }); 
}); 
관련 문제