2011-12-28 1 views
2

이상적으로, 내 사이트에 연결된 모든 웹 클라이언트가 현재 온라인 상태 인 다른 사람의 실시간 상태를 유지할 수있는 간단하고 가벼운 코드를 찾고 싶습니다.웹 사이트의 "현재 상태"구현에 대한 조언?

ejabberd는이 작업을 수행하지만 다른 많은 작업을 수행한다는 것을 알고 있으며 성능 특성을 사용자 정의하고 이해할 수 있도록 작은 코드 공간을 선호합니다.

node.js의 비 차단 측면이 마음에 들고,이 모든 논리를 수행하는 오픈 소스 프로젝트가 있는지 궁금합니다.

또한 클라이언트 측에서이 모델을 유지 관리하는 JavaScript 구현을보고 싶습니다.

답변

5

실시간 상태의 경우 socket.io을 사용하십시오. 누군가 연결할 때마다 연결된 사용자 목록에 추가하십시오. 정확한 통계를 얻으려면 사용자 세션을 추적해야합니다. http://www.danielbaulig.de/socket-ioexpress/

var onlineUsers = {}; 
var online = 0; 

io.sockets.on('connection', function (socket) { 
    onlineUsers[socket.handshake.sessionID] = socket.handshake.session; 
    online = Object.keys(onlineUsers).length; 
    socket.broadcast.emit('online', online); 

    socket.on('disconnect', function() { 
    delete onlineUsers[socket.handshake.sessionID]; 
    online--; 
    socket.broadcast.emit('online', online); 
    }); 
}); 
0

미래에 이것을 읽는 사람에게. fent으로 작성된 답변으로 시작했지만 답변이 게시 된 이후로 개입 된 6 년 동안 상황이 변경되었으므로 수정이 필요했습니다.

세션 정보를 저장하는 데 Object이 아닌 Map을 사용했습니다. 즉, sessionID은 더 이상 필요하지 않습니다.

const onlineUsers = new Map(); 

io.on('connection', function (socket) { 
    console.log('connection initiated'); 

    socket.on('userInfo', userInfo => { 
     console.log('userInfo', userInfo); 

     onlineUsers.set(socket, userInfo); 

     io.emit('onlineUsers', Array.from(onlineUsers.values())); 
    }); 

    socket.on('disconnect', function() { 
     console.log(onlineUsers.get(socket)); 

     onlineUsers.delete(socket); 

     io.emit('onlineUsers', Array.from(onlineUsers.values())); 
    }); 
});