如何在Node.Js中同步全局变量访问nodejs是聊天室应用程序开发的正确选择吗?

时间:2012-12-22 13:15:50

标签: node.js chatroom cometd

NodeJS能否支持多聊天室应用程序,客户通过HttpLongPolling和WebSocket订阅聊天室?当我考虑聊天室解决方案时,我确实看到在diff处收到消息时向长轮询请求和套接字连接广播时需要同步块。频率。 AFAIK在JS中没有多线程和同步块概念,但仍然要在JS中访问全局变量,我们需要同步块。我的问题不是开发聊天室解决方案,而是类似于它,即及时向不同用户订阅频道的消息广播。 NodeJs是一个正确的选择吗?

我分析了CometD,它似乎是这个解决方案的正确选择,它带有系统中内置的通道概念解决方案。但是CometD具有扩展能力问题,所以我正在尝试看似很轻但需要在NodeJ上开发这个解决方案的nodejs。我不必处理消息,只是将其传递给浏览器客户端。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我使用静态文件,longpolling(彗星),套接字,多种语言的网页框架(c,PHP,节点)完成了几个多用户/多房间应用程序,今天最好的体验来自NodeJS + Socket.IO。 / p>

这太容易了......因为Socket.IO适应了可用的客户端限制,使用从longpolling到websockets或flashsockets取决于他。然而,你越少依赖longpolling,最好。

您创建Socket.IO服务器,配置它,以及2个房间进入和离开事件(在您要管理的其他事件旁边)。这个应用程序的快速骨架就是这个。您需要控制用户列表,用户名等...但是可以通过socket.id轻松完成索引用户数据并使用connect / disconnect事件管理该哈希。 “fn”是客户端回调函数。

var http      = require('http')
  , ioo       = require('socket.io')
  ;

var app = http.createServer();
var io  = ioo.listen(app);

// ... Place here Socket.IO configuration...

var port = 8080;
app.listen( port, function() { console.log( 'Server started' ); } );

io.sockets.on( 'connection', function( socket ) {
    // Management messages
    socket.on( 'connect', function( name, fn ) { connect( socket, name, fn ); });
    socket.on( 'disconnect', function() { disconnect( socket.id ); });

    socket.on( 'joinRoom', function( roomName, fn ) { joinRoom( socket, roomName, fn ); });
    socket.on( 'leaveRoom', function( roomName, fn ) { leaveRoom( socket, roomName, fn ); });
} );


...


function joinRoom( socket, roomName, fn ) {
    socket.join( roomName );
    socket.broadcast.to( roomName ).emit( 'serverMessage', 'a user enters' );
    socket.emit( 'message', 'You enter in room ' + roomName );
}

function leaveRoom( socket, roomName, fn ) {
    socket.leave( roomName );
    socket.broadcast.to( roomName ).emit( 'serverMessage', 'a user leaves' );
    socket.emit( 'message', 'You leave room ' + roomName );
}

有关函数Socket.IO rooms

的完整说明,请参阅Socket.IO网站