2013-01-05 77 views
2

之前我使用Node.js的做HTML5遊戲和socket.ioSocket.io需要很長的時間觸發斷開事件

我決定舉辦它Heroku

Heroku不允許使用WebSockets,所以我必須設置xhr-polling來代替。 (Socket-io on Heroku

io.configure(function() { 
    io.set("transports", ["xhr-polling"]); 
    io.set("polling duration", 10); 
}); 

之前,我用網絡套接字只

io.set("transports", ["websocket"]); 

現在,當一個客戶端斷開連接(關閉他的窗口或刷新他的網頁)事件「斷開」不觸發立即在服務器上(它看起來像在等待客戶端心跳超時)。

client.on("disconnect", onClientDisconnect); 

如果客戶端重新加載,我得到多個連接事件以前斷開點火。 我的問題在這裏。

你有什麼想法,爲什麼xhr-polling不會觸發斷開事件? 這是一個錯誤的socket.io配置?

謝謝。

+1

沒有辦法知道使用xhr-polling的客戶端是否斷開連接,直到他們不響應心跳,因爲它不使用持久連接。 –

回答

1

它說here,你可以配置心跳。要正確配置它,您必須在服務器和客戶端(它被給予here)兩者上調整心跳。

嘗試降低心跳。它可以解決你的問題。 另一方面,appfog似乎支持websocket。

+0

好吧,我會盡量減少心跳來減少我的問題。 Appfog似乎也很酷,並且可以解決我的問題,但我想用Heroku來表達個人的理由。謝謝。 –

0

只需配置會話身份驗證,並且始終可以知道客戶端已連接。例如。

io.set('authorization', function(handshakeData, ack) { 
    var cookies = require(...); 
    var signedCookies = parseCookies(cookies, secret); 
    sessionStore.get(signedCookies['connect.sid'], function(err, sessionData) { 
     handshakeData.session = sessionData || {}; 
     handshakeData.sid = signedCookies['connect.sid'] || null; 
     ack(err, err ? false : true); 
    }); 
});