我已经使用静态文件、长轮询(彗星)、套接字、多种语言(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 站点