0

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

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

有什么建议吗?

4

1 回答 1

1

我已经使用静态文件、长轮询(彗星)、套接字、多种语言(c、PHP、节点)的 websockets 完成了几个多用户/多房间应用程序,今天最好的体验来自 NodeJS + Socket.IO。

这太容易了……因为 Socket.IO 会根据他的情况使用从 longpolling 到 websockets 或 flashsockets 来适应可用的客户端限制。尽管如此,您对长轮询的依赖越少越好。

您创建 Socket.IO 服务器,对其进行配置,以及 2 个房间进出事件(在您要管理的其余事件旁边)。应用程序的快速框架就是这个。您需要控制用户列表、用户名等……但可以轻松地通过 socket.id 索引用户数据并使用连接/断开连接事件管理该哈希。“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 房间功能的完整描述,请参阅 Socket.IO 站点

于 2013-01-28T11:34:26.897 回答