2012-03-02 20 views
16

我已經嘗試過socket.io,我發現當客戶端的html頁面加載時,一個新的套接字連接created.When刷新頁面時,我發現一個新的套接字連接創建,然後舊的連接斷開連接。如何避免在html頁面刷新後在socket.io中創建新的套接字連接?

我的問題是如何避免這種情況?因爲我正在構建一個聊天室應用程序。當用戶進入房間頁面時,在「連接」服務器側發出「歡迎用戶xxx來了!」,並且在「斷開」事件發出「用戶xxx離開」。但是,當用戶刷新當前頁面時,這將再次觸發'disconnect'事件並填充'connected'事件。它會發出「歡迎用戶xxx來!」和「用戶xxx離開」。消息一起。

如何忽略頁面刷新事件呢,就像HTTP會話?


更新:我已經找到辦法來解決這個問題。從這個問題Handle browser reload socket.io

回答

19

你不能阻止刷新頁面,並且當用戶刷新頁面時也無法避免socket.io斷開連接。

我會建議增加超時:

  • 當用戶看到斷開,啓動一個定時器,說10-30秒
  • 如果用戶返回到聊天,而計時器還沒有結束,不要做任何
  • 如果用戶計時器結束後一直沒有返回,則顯示「用戶已離開」的消息
+0

對於這個問題,是否存在「會話式」解決方案? – qichunren 2012-03-02 07:56:07

+3

我真的不知道你的意思。客戶端的套接字位於瀏覽器中,當頁面重新加載時,該頁面的所有客戶端JS代碼和狀態基本上被丟棄。 – 2012-03-02 10:32:18

8

您可以使用會話。即使套接字在發生刷新時斷開連接,仍然可以保留該特定用戶的一些數據,並在套接字再次連接時使用該數據。

這裏是你如何使用會話:

var express = require('express');  
var MemoryStore = require('express').session.MemoryStore; 

app.use(express.cookieParser()); 
app.use(express.session({ secret: "keyboard cat", store: new MemoryStore({ reapInterval: 60000 * 10 })})); 

app.get('/', function(req,res){ 
    req.session.name ="clients_name"; 
    res.render(__dirname + '/index.jade',{user:req.session.name}); 
}); 

,你應該用玉或任何其他「搜索引擎」來獲得傳遞給頁面的數據。

相關問題