Javascript Socket.io node.js,如何记录连接时间,避免或说明页面刷新/多个套接字?
现在,我完全被socket.io、socket实际上是什么等弄糊涂了。我需要能够做的是将两个通过“id”(作为URL参数)标识的用户连接到一个房间,也被定义为URL参数,如下所示:Javascript Socket.io node.js,如何记录连接时间,避免或说明页面刷新/多个套接字?,javascript,jquery,node.js,sockets,Javascript,Jquery,Node.js,Sockets,现在,我完全被socket.io、socket实际上是什么等弄糊涂了。我需要能够做的是将两个通过“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) {
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');
});
我在这里需要做的是记录这两个用户在特定“房间”中的连接时间和断开连接时间。连接和断开连接控制台语句可以工作,但它们最终会被记录多次,在页面刷新时,它们会被记录多次:
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
如何才能使每个用户只触发一次断开连接/连接事件,以便在服务器端可靠地记录事件?(最终保存到DB,但为了便于阅读而省略)。行
io.sockets.on('connection',function(socket){
…是套接字的主要事件处理程序,它只需启动一次,否则每次调用路由时都会重新创建处理程序。通常情况下,它如下所示:
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参数加入聊天室。由于套接字连接是由客户端进行的,因此在express中调用路由后会发生,因此客户端可以将这些参数发送到套接字。
(未经测试)简单化的例子
客户:
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.
});
});
我强烈建议您阅读,尤其是快速示例
此外,请考虑您将在网上阅读的许多关于Socket.IOThis的文档,当然是因为您正在为<代码>连接事件创建多个事件侦听器,然后将所有未来的连接加入到房间中。这个设置将不起作用,您需要完全改变它。为此按routing,而是使用socket.io发射和事件来处理它。这看起来不像纯节点…你对它进行了express还是什么?无论如何,从每次访问页面时的外观来看,你创建了一个侦听器。所以基本上第一次访问时,你添加了一个侦听器,所以它会记录一次。第二次添加另一个,所以我t记录两次。等等。你需要将侦听器代码放在应用程序之外。获取部分。@zozo抱歉,是的,使用express。好的,我会看看我如何通过发射和事件完成它。我不知道,有人做到了……我还没有尝试过。我很感谢你的回答,我会让你知道我是如何做到的。我做了一点手脚,但这似乎可以做到这正是我所需要的,非常感谢,省去了我一大堆挠头的麻烦。