2012-03-14 26 views
10

Üretimde, oyun durumunu tutmak için bağlantı yerel değişkenlerini kullanan bir oyunum var. Ancak, bağlantıda belirli bir süre boşta kalırsam, mevcut durumu yitiren bağlantının kesildiğini ve yeniden bağlandığını fark ettim. Yerel bir ana bilgisayardaki testlerimde bu davranışı hiç fark etmedim. Bu, soket bağlantıları için normal davranış mıdır yoksa bağlantıların düşmesine neden olan başka bir şeydir.NodeJS + Socket.io bağlantıları düşüyor/yeniden bağlanıyor?

Normal bir davranışsa, bu genellikle nasıl ele alınır? Bağlantı değerleri global olarak saklanmalıdır, böylece bir kullanıcı düşürmeli/yeniden bağlanmalı mı?

cevap

22

Sorununuz soket zaman aşımları hakkında. Belirli bir sokette etkinlik yoksa, socket.io otomatik olarak kapanır.

Kolaylık (ve hackish) düzeltmesi, etkinlik oluşturmak ve soketin zaman aşımını durdurmak için bağlı istemciye bir kalp atışı göndermektir.

Sunucu:

function sendHeartbeat(){ 
    setTimeout(sendHeartbeat, 8000); 
    io.sockets.emit('ping', { beat : 1 }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.on('pong', function(data){ 
     console.log("Pong received from client"); 
    }); 
} 

setTimeout(sendHeartbeat, 8000); 

Müşteri:

Sen socket.io here.

EDIT yapılandırma hakkında daha fazla bilgi alabilirsiniz

:

Fazla Bilgi

socket.on('ping', function(data){ 
     socket.emit('pong', {beat: 1}); 
    }); 

Mark yorumladı ki eğer kullanıcı bağlantıyı kaybeder (bağlantı onun üzerine düşer İnternet sorunları nedeniyle sonlandırın), kullanıcıyı son durumuna geri yükleyebilmeniz gerekir.

Bunu yapmak için, en iyi yol kullanıcı verilerini, çerezleri ve oturumları depolamak için halihazırda yaygın olarak kullanılan bir yöntem kullanmak olacaktır.

Bu located here'un nasıl yapılacağı hakkında son derece iyi hazırlanmış bir eğiticidir. Kurabiyeleri ayarlamak için express kullanmasına rağmen, bunu herhangi bir şey kullanarak yapabilirsiniz (rayları kullanarak yapıyorum). Bu yöntemi kullanarak, kullanıcı verilerini bir çerezde saklayabilir ve el sıkışması sırasında getirebilirsiniz. Buradan socket.handshake.data'u kullanarak verilere erişebilirsiniz.

+0

Oldukça akıllı bir çözüm, teşekkürler :) –

+2

Bu akıllı bir çözümdür ancak sunucu ve istemci ping pong ile meşgul tutacaktır :-(başka bir çözüm? –

0

Yapmanız gereken, oturum başına (yeniden) bağlantı oluşturmak veya tanımlamaktır. Yukarıdaki Moox'un cevabı için yeniden bağlanma sayısını azaltabilirsiniz, ancak yine de hatalıdır - örn. Bir kullanıcı, bir bit vb. için wifi bağlantısını kaybeder. Başka bir deyişle - oturum başına kullanıcı meta verilerini her bir yuvaya göre değil, arada sırada bağlantı kesilmesini ve yeniden bağlanmayı bekler.

+0

Haklısınız, bunu dikkate almak için sorumu düzenledim. – Moox

+0

Uygulamamda yaptığım şey, oturum başına kullanıcı verilerini korumak ve socket.io bağlantısı değil, kullanıcı başına oturumları/bağlantıyı kesmek için oturumları yönetmektir.Ne, BTW, soket başına veri neden socket.io içerdiğine dair tüm sorunu ortaya çıkarır - Bu özelliğin socket.io'nun işleyiş biçiminde gerçekten "uyumlu" olduğunu sanmıyorum. Sabit bağlantı/yeniden bağlanma nedeniyle onu kullanmaya ve terk etmeye çalıştım. – Mark