2013-10-12 93 views
-1

我正在創建一個socket.io應用程序。當我在firefox上創建一個連接到套接字時,它建立得很好。當我使用Chrome瀏覽器初始化到插座另一個連接,第一個客戶端斷開連接,然後將兩個客戶端再次重新連接(使用相同的socket.id)Socket.io:第一個客戶端斷開第二個連接

這是我一直在努力與代碼:

app.post('/auth', function(req, res){ // routes.auth(hash, db, io, pseudoArray, connections, Session)); 
    var username = req.body.username, 
     password = req.body.password; 
    if (username != "" && password != ""){ 
     authenticate(username, password, db, hash, function(err, user){ 
      if (user) { 
       // Regenerate session when signing in 
       // to prevent fixation 
       console.log('user authenticated'); 
       req.session.regenerate(function(){ 
        req.session.user = user.name; 
        req.session.success = 'Authenticated as ' + user.name 
        + ' click to <a href="/logout">logout</a>. ' 
        + ' You may now access <a href="/restricted">/restricted</a>.'; 

        var Session = connect.middleware.session.Session; 
        io.sockets.on('connection', function (socket) { 
         var hs = socket.handshake; 
         console.log('A socket with sessionID ' + hs.sessionID + ' connected!'); 

         socket.set('pseudo', req.session.user, function(){ 
          pseudoArray.push(req.session.user); 
          socket.emit('pseudoStatus', req.session.user); 
          console.log("user " + req.session.user + " connected"); 
         }); 

         socket.on('pseudoOk', function(data){ 
         // connections[data] = socket; 
          connections[data] = socket.id; // connected user with its socket.id 
          connectedUsers[socket.id] = socket; 

          console.log('----CONNECTIONS----'); 
          console.log(connections); 
          console.log('++ USERS ++ '); 
          console.log(connectedUsers); 
          console.log('----END CONNECTIONS----'); 
         }); 

         socket.on('disconnect', function() { 
          console.log('A socket with sessionID ' + hs.sessionID + ' disconnected!'); 

          // clear the socket interval to stop refreshing the session 
          // clearInterval(intervalID); 
         }); 
        }); 

        res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }); 
        res.redirect('home'); 
       }); 
      } else { 
       console.log('auth failed'); 
       req.session.error = 'Authentication failed, please check your ' 
        + ' username and password.' 
        + ' (use "tj" and "foobar")'; 
       res.redirect('login'); 
      } 
     }); 
    } else { 
     res.redirect('connect'); 
    } 
}); 

任何線索?

的主要問題是:將一臺計算機(本地主機)上的套接字連接在兩個不同的瀏覽器上運行在同一臺機器上?我在想,因爲我在一臺機器上使用了兩個瀏覽器,所以我得到了兩個瀏覽器的相同套接字ID。是這樣嗎?

+0

請問您可以發佈您的代碼嗎? – vbrmnd

+0

我已將代碼添加到帖子中。 – amit

+0

@amit你正在從HTTP請求處理程序中設置'socket.io'連接處理程序,這不是應該如何完成的,並且很可能會導致各種未定義行爲(可能會導致內存泄漏)。 – robertklep

回答

1

您正在爲每個POST請求的socket.io connection事件創建事件偵聽器,並將其發送到/auth。這將導致未定義的行爲和可能的內存泄漏。 Express和socket.io是在同一個服務器應用程序中運行的兩個獨立的子系統。因此,他們不應該這樣混合。

「正常」快遞/ socket.io設置是這樣的:

// your Express routes 
app.post('/auth', function(req, res) { ... }); 
... 

// socket.io setup (completely separate) 
io.sockets.on('connection', function(socket) { 
    ... 
}); 

如果你想分享Express和socket.io之間的會話對象:這是不平凡的。就像我之前說過的那樣,兩個系統應該被認爲是相互分離的。然而,有一些聰明的人​​3210。不過,我不知道最新的博客帖是什麼,它需要對Express和socket.io有深入的瞭解。

+0

非常感謝。我將把這兩者分開並報告。只有一件事,同一臺機器上的兩個不同的瀏覽器能夠使用單獨的ID創建它們之間的套接字連接? – amit

+0

@amit瀏覽器無法直接建立連接,如果這是你的意思;但如果你的意思是如果同一臺計算機上的兩個不同的瀏覽器可以連接到你的服務器並獲得一個單獨的ID,那麼是的(實際上,每個新的連接都會得到一個新的ID,即使這些連接是由同一個瀏覽器構建的,但也許在不同的標籤頁/窗口中) – robertklep

相關問題