2012-03-02 8 views
16

मैं socket.io की कोशिश की है, मैंने पाया जब ग्राहक html पृष्ठ लोड, एक नया गर्तिका कनेक्शन created.When मैं पेज को ताज़ा, मैंने पाया एक नया सॉकेट कनेक्शन बनाने, और फिर पुराने कनेक्शन डिस्कनेक्ट।एचटीएमएल पेज रीफ्रेश के बाद socket.io में नया सॉकेट कनेक्शन बनाने से कैसे बचें?

मेरे समस्या यह कैसे से बचने के लिए है? क्योंकि मैं चैट रूम एप्लिकेशन बना रहा हूं। जब कोई उपयोगकर्ता रूम पेज में प्रवेश करता है, तो "कनेक्शन" सर्वियर साइड उत्सर्जित होता है "स्वागत उपयोगकर्ता xxx आओ!", और 'disconnec' ईवेंट उत्सर्जित करें "उपयोगकर्ता xxx leaved।" लेकिन जब कोई उपयोगकर्ता वर्तमान पृष्ठ को रीफ्रेश करता है, तो यह 'डिस्कनेक्ट' ईवेंट और फिर से 'कनेक्ट' ईवेंट को आग लग जाएगा। और यह "आपका स्वागत है उपयोगकर्ता xxx आओ!" और "उपयोगकर्ता xxx leaved।" एक साथ संदेश।

पेज रीफ्रेश ईवेंट को अनदेखा कैसे करें? और बस http सत्र की तरह?


अद्यतन: मैं पहले से ही इस समस्या का समाधान करने के लिए जिस तरह से मिल गया है। इस सवाल का Handle browser reload socket.io

उत्तर

19

से आप पृष्ठ को रीफ़्रेश नहीं रोक सकते हैं, और वहाँ कोई रास्ता नहीं है जब कोई उपयोगकर्ता या तो पेज ताज़ा करता socket.io डिस्कनेक्ट से बचना है।

मैं एक समय समाप्ति जोड़ने का सुझाव होगा:

  • एक उपयोगकर्ता को डिस्कनेक्ट देखा जाता है, एक टाइमर शुरू करते हैं, का कहना है कि 10-30 सेकंड
  • यदि चैट करने के लिए कोई उपयोगकर्ता जबकि टाइमर समाप्त नहीं हुआ है , कुछ भी
  • एक उपयोगकर्ता टाइमर समाप्त होने के बाद नहीं वापस आ गया है, तो संदेश क्या करते हो नहीं, तो प्रदर्शित "उपयोगकर्ता छोड़ दिया है"
+0

वहाँ एक 'सत्र की तरह' इस समस्या के लिए समाधान है? – qichunren

+3

मुझे वास्तव में पता नहीं है कि इसका मतलब क्या है .. ग्राहक की सॉकेट ब्राउज़र में है, और जब कोई पृष्ठ पुनः लोड किया जाता है, तो उस पृष्ठ के लिए सभी क्लाइंट-साइड जेएस कोड और स्थिति अनिवार्य रूप से त्याग दी जाती है। –

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

और आप जेड या किसी अन्य "देखें इंजन" का उपयोग करना चाहिए डेटा पेज के लिए पारित किया पाने के लिए:

का तरीका यहां बताया सत्रों का उपयोग है।