2014-07-03 4 views
14

मैं सर्वर-प्रेषित घटनाओं का उपयोग करने वाली प्रोजेक्ट पर काम कर रहा हूं और कुछ दिलचस्प में चला गया हूं: क्रोम और फ़ायरफ़ॉक्स के बीच कनेक्शन हानि को अलग-अलग संभाला जाता है।क्या एक इवेंटसोर्स (एसएसई) अनिश्चित काल से फिर से कनेक्ट करने का प्रयास करना चाहता है?

क्रोम 35 या ओपेरा 22 पर, यदि आप सर्वर से अपना कनेक्शन खो देते हैं, तो यह सफल होने तक हर कुछ सेकंड अनिश्चित काल से फिर से कनेक्ट करने का प्रयास करेगा। दूसरी तरफ फ़ायरफ़ॉक्स 30 पर, यह केवल एक बार कोशिश करेगा और फिर आपको पृष्ठ को रीफ्रेश करना होगा या उठाए गए त्रुटि ईवेंट को मैन्युअल रूप से फिर से कनेक्ट करना होगा।

मैं क्रोम या ओपेरा के तरीके को पसंद करता हूं, लेकिन http://www.w3.org/TR/2012/WD-eventsource-20120426/#processing-model पढ़ना पसंद करता है, ऐसा लगता है कि एक बार इवेंटसोर्स नेटवर्क त्रुटि या अन्य कारणों से फिर से कनेक्ट होने और विफल होने का प्रयास करता है, तो उसे कनेक्शन को पुनः प्रयास नहीं करना चाहिए। यकीन नहीं है कि अगर मैं सही ढंग से कल्पना समझ रहा हूं, हालांकि।

मुझे उपयोगकर्ताओं को फ़ायरफ़ॉक्स की आवश्यकता पर सेट किया गया था, ज्यादातर इस तथ्य के आधार पर कि आपके पास क्रोम पर खुले यूआरएल से इवेंट स्ट्रीम के साथ कई टैब नहीं हो सकते हैं, लेकिन यह नया खोज शायद एक मुद्दा होगा। हालांकि, अगर फ़ायरफ़ॉक्स spec के अनुसार व्यवहार करता है तो मैं किसी भी तरह से इसके आसपास भी काम कर सकता हूं।

संपादित करें:

मैं अब के लिए लक्षित कर फ़ायरफ़ॉक्स रखने के लिए जा रहा हूँ। यह मैं कैसे reconnections से निपटने कर रहा हूँ है:

var es = null; 
function initES() { 
    if (es == null || es.readyState == 2) { // this is probably not necessary. 
     es = new EventSource('/push'); 
     es.onerror = function(e) { 
      if (es.readyState == 2) { 
       setTimeout(initES, 5000); 
      } 
     }; 
     //all event listeners should go here. 
    } 
} 
initES(); 

उत्तर

3

मैं आप के रूप में मानक उसी तरह पढ़ा लेकिन, भले ही नहीं, वहाँ पर विचार करने के ब्राउज़र कीड़े, नेटवर्क त्रुटियों, सर्वर मर लेकिन सॉकेट खुला रखने के हैं, इत्यादि। इसलिए, मैं आमतौर पर एसएसई प्रदान करता है कि पुनः कनेक्ट के शीर्ष पर एक जीवित रहते हैं।

क्लाइंट साइड मैं वैश्विक की एक जोड़ी और एक सहायक समारोह के साथ यह कर पर:

var keepaliveSecs = 20; 
var keepaliveTimer = null; 

function gotActivity(){ 
if(keepaliveTimer != null)clearTimeout(keepaliveTimer); 
keepaliveTimer = setTimeout(connect,keepaliveSecs * 1000); 
} 

तब मैं connect() के शीर्ष पर gotActivity() फोन, और फिर हर बार जब मैं एक संदेश मिलता है।

सर्वर साइड पर (connect() मूल रूप से सिर्फ new EventSource() करने के लिए कॉल करता है), यह या तो एक टाइमस्टैम्प (या कुछ और) प्रत्येक 15 सेकंड थूक से बाहर कर सकते हैं, सामान्य डाटा प्रवाह की चोटी पर, या एक टाइमर ही इस्तेमाल करते हैं और थूक से बाहर एक टाइमस्टैम्प (या कुछ) यदि सामान्य डेटा प्रवाह 15 सेकंड के लिए शांत हो जाता है।

1

मैंने जो देखा है (कम से कम क्रोम में) यह है कि जब आप close() फ़ंक्शन का उपयोग करके अपना एसएसई कनेक्शन बंद करते हैं, तो यह फिर से कनेक्ट करने का प्रयास नहीं करेगा।

var sse = new EventSource("..."); 
sse.onerror = function() { 
    sse.close(); 
}; 
संबंधित मुद्दे