2011-12-28 5 views
2

理想的には、自分のサイトに接続しているすべてのWebクライアントが、現在オンラインになっている他の人物のリアルタイムステータスを維持できるようにするシンプルで軽量なコードを探したいと思います。ウェブサイトの "プレゼンス"を実装する上でのアドバイス?

私は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())); 
    }); 
}); 
関連する問題