Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.io node.js,如何记录连接时间,避免或说明页面刷新/多个套接字?_Javascript_Jquery_Node.js_Sockets - Fatal编程技术网

Javascript Socket.io node.js,如何记录连接时间,避免或说明页面刷新/多个套接字?

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) {

现在,我完全被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) {
        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。好的,我会看看我如何通过发射和事件完成它。我不知道,有人做到了……我还没有尝试过。我很感谢你的回答,我会让你知道我是如何做到的。我做了一点手脚,但这似乎可以做到这正是我所需要的,非常感谢,省去了我一大堆挠头的麻烦。