簡體   English   中英

Socket.io node.js,如何記錄連接時間以避免或考慮頁面刷新/多個套接字?

[英]Socket.io node.js, how to log connection times avoid or account for page refresh/multiple sockets?

到目前為止,我完全對socket.io,套接字的實際用途等感到困惑。我需要做的是將通過“ 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');
        });

我需要在此處執行的操作是記錄該特定“房間”中這2個用戶的連接時間和斷開時間。 連接和斷開連接控制台語句可以工作,但是最終導致它們多次被記錄,並且在刷新頁面后,它們開始被記錄很多次:

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

如何到達每個用戶僅觸發一次斷開/連接事件的地步,以便可以在服務器端可靠地記錄該事件? (最終保存到數據庫,但為了便於閱讀而省略了)。

io.sockets.on('connection', function(socket){ ...)行是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參數來加入房間。 由於套接字連接是由客戶端建立的 ,它是在快速調用路由之后發生的,因此,客戶端可以將這些參數發送到套接字。 (未經測試的)簡單示例。

客戶:

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.
    });
});

我強烈建議您閱讀文檔 ,尤其是Express示例。

另外,請考慮您將在線閱讀的許多文檔都是關於Socket.IO <1.0的,並且語法上也有一些區別。 在這里閱讀以避免混淆

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM