2012-05-06 15 views
5

मैं धूमकेतु प्रोग्रामिंग के लिए एक ढांचा विकसित करने वाला हूं, और मैं वेब सॉकेट, या सर्वर-प्रेषित घटनाओं का उपयोग नहीं कर सकता (क्योंकि ब्राउज़र समर्थन वास्तव में बेकार है)। इसलिए, मुझे HTTP कनेक्शन को जिंदा रखने की आवश्यकता है, और ग्राहक को वापस खंडित डेटा भेजना होगा।लाइटस्ट्रीमर के पीछे जादू क्या है?

हालांकि, समस्याओं के लिए खुद को दिखाने के रूप में आप काम में हो:

  1. XMLHttpRequest का उपयोग करते हुए इस तथ्य है कि आईई आप xhr.responseText नहीं देता है, जबकि xhr.readyState 3.
  2. एक है की वजह से संभव नहीं है, छुपा iframe उपयोगी नहीं हो सकता है, क्योंकि जब मैं क्लाइंट को डेटा भेजता हूं तो ब्राउजर लोडर दिखाता है।
  3. मैंने प्रत्येक बार फ़ंक्शन निष्पादन आदेश भेजने, क्लाइंट को एक जावास्क्रिप्ट फ़ाइल भेजने की कोशिश की, लेकिन ब्राउज़र पूरी तरह से लोड होने तक जावास्क्रिप्ट निष्पादित नहीं करेगा।

हालांकि, जब मैं Lightstreamer demo page को देखो, मैं देख रहा हूँ भेजता है कि एक जावास्क्रिप्ट वापस ग्राहक थोड़ा-थोड़ा करके और प्रत्येक चरण में फ़ाइल, यह फ़ंक्शन की कॉल भेजता है और उस समारोह बस मार डाला जाता है (मैं यह कर सकते हैं यह हिस्सा मत करो)। ऐसा लगता है कि लाइटस्ट्रीमर AJAX का उपयोग करता है, क्योंकि अनुरोध केवल फ़ायरबग के कंसोल टैब में दिखाई देता है, लेकिन यह आईई में भी आकर्षण की तरह काम करता है।

मैंने उनके अनुरोध पर सेट किए गए प्रत्येक HTTP शीर्षलेख फ़ील्ड का उपयोग करने का प्रयास किया, और नतीजा नहीं। मैंने HTTP प्राप्त करने के बजाय HTTP पोस्ट का उपयोग करने का भी प्रयास किया, लेकिन अभी भी कोई परिणाम नहीं मिला।

मैं लगभग कैसे धूमकेतु, को लागू करने पर 20 से अधिक लेख पढ़ा है, लेकिन कोई भी of'em मैं समस्याओं को हल करने के लिए प्रकट:

  1. यह क्रॉस-ब्राउज़र कैसे बनाने के लिए?
  2. सर्वर से नया डेटा कब पहुंचाया जाता है (मुझे किस घटना में शामिल होना चाहिए) अधिसूचित कैसे किया जाए?
  3. मेरा पृष्ठ उपयोगकर्ता को पूरी तरह से लोड करने के तरीके के रूप में कैसे दिखाई देता है (इसे कैसे कार्यान्वित किया जाए, ताकि ब्राउजर लोडिंग गतिविधि नहीं दिखाता)?

क्या कोई मदद कर सकता है? मुझे लगता है कि एक बहुत छोटी टिप या चाल होनी चाहिए जिसे मैं सभी अवधारणाओं को एक साथ चिपकाने के लिए यहां नहीं जानता हूं। क्या किसी को पता है कि इन समस्याओं को दूर करने के लिए लाइटस्ट्रीमर क्या करता है?

उत्तर

3

लेकिन ब्राउजर पूरी तरह से लोड होने तक जावास्क्रिप्ट निष्पादित नहीं करेंगे।

क्या आपने <script> टैग में लिपटे कोड को वापस भेजने का प्रयास किया है? उदाहरण के लिए, के बजाय के लिए:

<script type="text/javascript"> 
f(...data1...); 
f(...data2...); 

<script type="text/javascript">f(...data1...);</script> 
<script type="text/javascript">f(...data2...);</script> 
+0

हाँ, मैंने कोशिश की, लेकिन यह केवल तभी काम करता है जब आप एमआईएमई प्रकार * टेक्स्ट/एचटीएमएल * पर सेट करते हैं। दूसरे शब्दों में, आपको एक और HTML दस्तावेज़ का अनुरोध करना चाहिए। यदि आप ** आवेदन/जावास्क्रिप्ट ** या ** एप्लिकेशन/एक्स-जावास्क्रिप्ट ** या ** टेक्स्ट/जावास्क्रिप्ट ** पर प्रतिक्रिया सेट करते हैं तो यह काम नहीं करेगा। इसके अलावा यह मेरी समस्याओं का समाधान नहीं करता है। मैं जावास्क्रिप्ट स्निपेट वाली HTML फ़ाइल का अनुरोध करने के लिए XMLHttpRequest का उपयोग कर सकता हूं। हालांकि, यह आईई में काम नहीं करता है। मैं 'iframe' का उपयोग कर सकता हूं, लेकिन यह लोडर दिखाता है। लाइटस्ट्रीमर हर जगह काम करता है, और लोडर चिह्न नहीं दिखाता है। –

+0

कृपया ध्यान दें कि यदि मैं कभी-कभी लोड होने वाली HTML फ़ाइल प्राप्त करने के लिए 'XMLHttpRequest' का उपयोग करता हूं जिसमें' 'जावास्क्रिप्ट स्निपेट, उन्हें निष्पादित नहीं किया जाएगा। मेरा मतलब है, ब्राउजर जावास्क्रिप्ट टैग के अंदर जावास्क्रिप्ट कोड निष्पादित करता है, लेकिन केवल सामान्य अनुरोधों में, AJAX अनुरोध नहीं। –

1

आपके मामले में सबसे अच्छा विकल्प की कोशिश JSONP + लांग सर्वर साइड पर खींच उपयोग करने के लिए किया जाएगा। आपको बस किसी भी समय कनेक्शन बूंदों (बार-बार) को फिर से कनेक्ट करना याद रखना होगा या आपको प्रतिक्रिया प्राप्त होगी। jQuery में

उदाहरण कोड:

function myJSONP(){ 
    $.getScript(url, { 
     success: function(){ 
      myJSONP(); //re-connect 
     }, 
     failure: function(){ 
      myJSONP(); //re-connect 
     } 
    }) 
} 

जाहिर सर्वर से अपनी प्रतिक्रिया है जावास्क्रिप्ट कोड है कि अपने वैश्विक कार्यों की कॉल करेंगे किया जाना है।

वैकल्पिक रूप से आप कुछ jquery JSONP प्लगइन का उपयोग कर सकते हैं।

या इस परियोजना http://www.meteor.com/ पर एक बार देख ले (बहुत अच्छा है, लेकिन यह कोशिश नहीं की)

+0

मैं प्रति अद्यतन ** एक कनेक्शन (अनुरोध) बनाना नहीं चाहता **। मुझे केवल एक कनेक्शन खोलना होगा, और उस एकल कनेक्शन के माध्यम से क्लाइंट के ब्राउज़र को अपडेट करना होगा। मेरे प्रश्न में लिंक देखें और फायरबग में इसकी जांच करें। –

4

तरीकों आप चाहते हैं streaming है।

इसे क्रॉस-ब्राउज़र कैसे बनाएं?

अधिकांश ब्राउज़रों को ध्यान में रखते हुए, कोई निरंतर तरीका नहीं है। आपको ब्राउज़र के अनुसार उचित परिवहन चुनना होगा। इससे भी बदतर, आपको ब्राउजर पर भरोसा करना है कि यह पहचानने के लिए कि कौन सा ब्राउजर इस्तेमाल किया जा रहा है, और फीचर डिटेक्शन इस बारे में कुछ भी नहीं गिना जाता है। आप IE8 + के लिए XDomainRequest का उपयोग कर सकते हैं, आईई 6+ के लिए गैर-आईई और आईफ्रेम के लिए XMLHttpRequest। यदि संभव हो तो आईफ्रेम परिवहन से बचें।

सर्वर से नया डेटा कब पहुंचाया जाता है (मुझे किस घटना में शामिल होना चाहिए) अधिसूचित कैसे किया जाए?

यह उपयोग किए जाने वाले परिवहन के अनुसार भिन्न होता है। उदाहरण के लिए, XDomainRequest प्रगति घटना को सक्रिय करता है, XMLHttpRequest ओपेरा और आईई को छोड़कर चंक आ गया है जब readystatechange घटना आग लगती है।

कैसे मेरा पेज बनाने के लिए के रूप में पूरी तरह से उपयोगकर्ता के लिए भरी हुई दिखाई देते हैं (कैसे, इसे लागू करने के लिए इतना है कि ब्राउज़र लोड हो रहा है गतिविधि नहीं दर्शाता)?

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

उपर्युक्त प्रश्नों के अलावा आपको कुछ मुद्दों पर विचार करना होगा।

  1. इवेंट-संचालित सर्वर - सर्वर असीमित रूप से संसाधित करने में सक्षम होना चाहिए।
  2. परिवहन आवश्यकताएं - सर्वर आवश्यक परिवहन के लिए अलग-अलग व्यवहार करता है।
  3. स्ट्रीम प्रारूप - यदि सर्वर एक ही हिस्से में बड़ा संदेश या एकाधिक संदेश भेजने जा रहा है, तो एक सिंगल खंड का मतलब एकल डेटा नहीं है। यह एक डेटा या कई डेटा के concatenation के टुकड़े हो सकता है। डेटा को पहचानने के लिए, प्रतिक्रिया स्वरूपित की जानी चाहिए।
  4. त्रुटि प्रबंधन - इफ्रेम परिवहन डिस्कनेक्शन के लिए कोई सबूत प्रदान नहीं करता है।
  5. ...

अंतिम नहीं लेकिन कम से कम, स्ट्रीमिंग लागू करने के लिए बहुत थकाऊ की तुलना में यह लंबे समय से मतदान के साथ विपरीत लग रहा है। मैं आपको socketio, sockjs और jquery socket जो मैंने बनाया और प्रबंधित किया है, करने के लिए ठोस ढांचे का उपयोग करने की सलाह देते हैं।

शुभकामनाएं।

5

यहां सॉकजेएस लेखक।

  • यह क्रॉस-ब्राउज़र कैसे बनाने के लिए?

यह कठिन है, स्ट्रीमिंग रही ओपेरा और IE पर transports पर कुछ महीनों के खर्च करने की आशा। जब नए डेटा सर्वर (मैं में क्या घटना हुक चाहिए) से आया है

  • कैसे सूचना पाने के लिए?

किसी विशेष ब्राउज़र के आधार पर कई तकनीकें हैं। एक अच्छे परिचय के लिए सॉकेट.आईओ और सॉकजेएस द्वारा समर्थित विभिन्न फ़ॉलबैक प्रोटोकॉल पर एक नज़र डालें।

  • कैसे मेरा पेज बनाने के लिए के रूप में पूरी तरह से उपयोगकर्ता के लिए भरी हुई दिखाई देते हैं (कैसे, इसे लागू करने के लिए इतना है कि ब्राउज़र लोड हो रहा है गतिविधि नहीं दर्शाता)?

फिर, ब्राउज़र-विशिष्ट चालें हैं। एक ऑनलोड घटना के बाद AJAX लोड करने में देरी है। अन्य डीओएम से आईफ्रेम को बांधना और अनइंड करना है। आदि। यदि आपको अभी भी सोकजेएस या सॉकेट.ओ कोड पढ़ने में दिलचस्पी है।

क्या कोई मदद कर सकता है? मुझे लगता है कि एक बहुत छोटी टिप या चाल होनी चाहिए जिसे मैं सभी अवधारणाओं को एक साथ चिपकाने के लिए यहां नहीं जानता हूं। क्या किसी को पता है कि इन समस्याओं को दूर करने के लिए लाइटस्ट्रीमर क्या करता है?

मूल रूप से, जब तक कि आपके पास बहुत मजबूत कारण न हो, पहिया को पुन: पेश न करें। सॉकजेएस, सॉकेट.ओओ, फेय, या किसी अन्य दर्जन परियोजनाओं का उपयोग करें जो पहले से ही इस समस्या को हल करते हैं।

+0

मरेक, सवाल यह है कि "लाइटस्ट्रीमर में जादू क्या है" - क्या आप कह रहे हैं कि सॉकजेएस या ऐसा जादू है? (उदाहरण के लिए हमें लाइटस्ट्रीमर की आवश्यकता नहीं है क्योंकि सॉकजेएस क्रॉस प्लेटफ़ॉर्म जेएस क्लाइंट को संभालता है)? लाइटस्ट्रीमर सर्वर के बारे में क्या, क्या यह जादू करता है? – Jonesome

+0

मैं इस प्रश्न के कारण पूछ रहा हूं: http://stackoverflow.com/questions/19667644/level-of-difficulty-to-recreate-lightstreamer-server-and-three-client-pieces – Jonesome

संबंधित मुद्दे