Socket.io node.js,如何logging连接时间避免或占用页面刷新/多个套接字?

到目前为止,我完全被socket.io所困惑,sockets实际上是什么,等等。我需要做的是将通过“id”(作为URL参数)标识的两个用户连接到一个房间定义为一个URL参数,如下所示:

http://www.example.com/room1/user1 http://www.example.com/room1/user2 

客户端:

 var socket = io(); 

在服务器上:

 app.get('/:id/:role', function(request, response) { var room = request.params.id; var user = request.params.role; io.sockets.on('connection', function(socket){ socket.join(room); console.log(user+' has connected to '+room) socket.on('disconnect', function(){ socket.leave(room); console.log(user +' has disconnected from '+room); }); }); response.render('pages/room'); }); 

我需要做的就是在这个特定的“房间”中logging这两个用户的连接时间和断开时间。 连接和断开控制台语句的工作,但他们最终得到logging多次,并在页面刷新时,他们开始logging许多次:

 11:20:23 web.1 | user1 has connected to room1 at 1439220023347 //user1 connects 11:20:41 web.1 | user1 has disconnected from room1 at 1439220041842 //user 1 navigates away from page 11:20:44 web.1 | user1 has connected to room1 at 1439220044447 //user 1 returns back to page via back button 11:21:01 web.1 | user1 has connected to room1 at 1439220061168 //user 2 connects to room creates 2 new connection log events? 11:21:01 web.1 | user2 has connected to room1 at 1439220061168 11:23:04 web.1 | user1 has disconnected from room1 at 1439220184527 //user 1 hits 'refresh' all hell breaks loose 11:23:04 web.1 | user1 has connected to room1 at 1439220184727 11:23:04 web.1 | user2 has connected to room1 at 1439220184727 11:23:04 web.1 | user1 has connected to room1 at 1439220184727 

我怎样才能达到一个断点/连接事件只触发一次为每个用户,所以我可以logging事件(S)可靠的服务器端? (最终保存到一个数据库,但为便于阅读而被遗漏)。

io.sockets.on('connection', function(socket){ …)是您的套接字的主要事件处理程序,只需触发一次,否则每次调用路由时都会重新创build一个处理程序。通常它看起来像这样:

 app.get('/', function (req, res) { res.sendfile(__dirname + '/index.html'); }); io.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); socket.on('my other event', function (data) { console.log(data); }); }); 

正如你所看到的,路由处理完全独立于套接字事件处理。

现在,您要使用URL参数来join会议室。 由于套接字连接是由客户端build立的 ,因此路由被快速调用之后才会发生,因此客户端可以将这些参数发送给套接字。 (未经testing)的简单例子。

客户:

 var socket = io.connect('http://localhost:5000'); //adjust to the port your server is listening on socket.on('auth',function(){ socket.emit('userParameters',{room:room,user:user}); }); 

服务器:

 app.get('/:id/:role', function(request, response) { response.render('pages/room'); }); io.on('connection', function(socket){ socket.emit('auth'); //will be emitted only once to each socket. socket.on('userParameters',function(params){ socket.join(params.room); socket.user = params.user; console.log(socket.user+' has connected to '+params.room) }); socket.on('disconnect', function(){ console.log(socket.user+' has disconnected'); //disconnecting automatically removes the socket from the room. }); }); 

我强烈build议您阅读文档 ,尤其是Express示例。

另外,请考虑一下你在网上阅读的大量文档是关于Socket.IO <1.0的,在语法上有一些差异。 请阅读此处以避免混淆