बिना क्लाइंट रिक्वेस्ट के सर्वर से क्लाइंट में डेटा पुश करना?


11

मैंने स्टैक एक्सचेंज को ब्राउज़ करते समय देखा है कि "3 नए संदेश, दिखाने के लिए क्लिक करें" जैसी गतिशील सूचनाएं हैं। मैं इस बात के लिए इस तरह का गतिशील अद्यतन करना चाहता हूं कि मैं क्या समझाऊं।

मान लीजिए कि मैं 10 हालिया समाचार लेखों का एक हिंडोला / स्लाइड शो बनाना चाहता हूं। मैं चाहता हूं कि यह हिंडोला प्रति घंटा, एक कतार में अद्यतन किया जाए। नए लेख पुराने लेखों को कतार से बाहर धकेल देंगे। मेरे सिर के ऊपर से समाधान होगा।

  1. उपयोगकर्ता क्लाइंट के लिए लॉग ऑन करता है।
  2. ग्राहक अगले घंटे के निशान तक # मिनट की गणना करता है और घंटे पर निष्पादित करने के लिए टाइमर सेट करता है।
  3. घंटे के निशान पर, किसी भी नए समाचार लेख के बारे में सर्वर को अनुरोध भेजें जो पहले से हिंडोला में नहीं था।
  4. प्रतिक्रिया संभालें।
  5. टाइमर को रीसेट करें।

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


4
सिग्नलआर पर एक नजर।
रॉबर्ट हार्वे

मेरा सुझाव है कि आप विचारों के लिए RSS और AJAX को पढ़ें । RSS सदस्यता फ़ीड्स के लिए एक मानक प्रोटोकॉल का एक उदाहरण है, और AJAX पृष्ठ को फिर से लोड किए बिना क्लाइंट (ब्राउज़र) को अपडेट करने के लिए एक उच्च-स्तरीय अवधारणा है। मैं शर्त लगाता हूं कि स्टैक एक्सचेंज कैसे काम करता है।

1
@Snowman स्टैक एक्सचेंज WebSocket का उपयोग करता है देखें meta.stackexchange.com/questions/10369/...
रॉबर्ट हार्वे

क्या क्लाइंट एक ब्राउज़र, एक कस्टम क्लाइंट या कुछ और है?
आउटीस जूल

यह कुछ हद तक शत्रुतापूर्ण है, लेकिन आप HTML पेज को हर 15 मिनट या तो ताज़ा कर सकते हैं। अधिकांश समाचार वेब पेज ऐसा करते हैं।
गिल्बर्ट ले ब्लैंक

जवाबों:


7

डेटा को पुश करने के लिए, आपको क्लाइंट की पहचान करनी होगी, और जो क्लाइंट को सर्वर से सब्सक्राइब करके किया जाएगा। एक बार ऐसा करने के बाद आपके पास लगातार कनेक्शन के साथ सब्सक्राइबर क्लाइंट की एक सूची होगी।

आप जो हासिल करना चाहते हैं, उसके आधार पर, मैं कहूंगा कि क्लाइंट के लिए सर्वर से अनुरोध करना सबसे अच्छा है, ताकि आपको एक निरंतर कनेक्शन बनाए रखने और HTTP के रूप में अनुरोध / प्रतिक्रिया संचार प्रोटोकॉल का उपयोग न करना पड़े।

एक उदाहरण जो लगातार कनेक्शन रखने के लिए दिमाग में आता है वह एक लाइव चैट / इंस्टेंट मैसेजिंग सिस्टम होगा, क्योंकि संचार वास्तविक समय में होना चाहिए।

इस बात का ध्यान रखें कि आमतौर पर कनेक्शन का उपयोग करके किया जाता है sockets, जो आपके स्वयं के संचार प्रोटोकॉल, एन्क्रिप्शन आदि को लागू करने में एक ओवरले जोड़ता है।


2

मूल रूप से आपको क्लाइंट को डेटा पुश करने की आवश्यकता होती है, और जैसा कि एक अप्रत्यक्ष संचार http प्रोटोकॉल के दायरे में नहीं है, इसे अपने दम पर लागू करना आसान नहीं है।

आपकी समस्या का समाधान socket.io है

जैसा कि इसकी वेबसाइट बताती है,

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

आशा है कि यह आपकी समस्या को हल करेगा।


7
यह उपयोगी होगा, यदि आप यह बताते हैं कि क्या और कैसे आप सॉकेट के साथ संबद्ध हैं। यह कैसे और यह आपके ज्ञान / अनुभव के आधार पर प्रश्नकर्ता समस्या को हल करने में मदद करेगा (वेबसाइट के "मिशन बयान" के विपरीत)
बेनी जूल

वेब सॉकेट्स सॉकेट के लिए सख्ती से बेहतर हैं। अब सभी प्रमुख ब्राउज़र मानक लागू करते हैं। अधिकांश प्रमुख भाषाओं में वेबसोकेट कार्यान्वयन हैं, लेकिन सॉकेट नहीं हैं। Socket.io संदेशों में अतिरिक्त संरचना जोड़ता है, इसलिए यह आसानी से संगत नहीं है।
एलेक्स रिंकिंग

1

मैं यह नहीं बता सकता कि एसई इसे कैसे करता है, क्योंकि यह एक वेबसाइट है, ऐसे कई तरीके हैं जिनसे वे डेटा को पुश करने के लिए घंटे पर php / asp / what-have-script को चलाने के लिए एक क्रॉन जॉब सेट कर सकते हैं। लेकिन यह तब होगा जब आप एक वेब केवल समाधान के लिए देख रहे थे।

लेकिन जब से आप एक ग्राहक का उल्लेख कर रहे हैं, तो आप शायद उस ग्राहक को नवीनतम समाचार अपडेट की तारीख / समय के साथ एक फ़ाइल बना सकते हैं और ग्राहक को उक्त फ़ाइल में संग्रहीत मूल्य की जांच कर सकते हैं और यह देखने के लिए उपयोगकर्ता के सिस्टम समय की तुलना कर सकते हैं कि क्या एक घंटा है पिछले अद्यतन के बाद से पारित कर दिया है। यदि कम से कम एक घंटा हो गया है, तो ग्राहक आपके सर्वर से नवीनतम समाचार स्ट्रीम का अनुरोध करता है जो फिर ग्राहक को नवीनतम समाचार स्ट्रीम लौटाता है।

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

मैं माफी माँगता हूँ अगर मैं गलत समझा जो आप के लिए जा रहे थे के रूप में मैं पूरी तरह से निश्चित नहीं हूँ कि आप क्या करने जा रहे हैं। लेकिन उम्मीद है कि किसी भी तरह से आप के लिए यहाँ मूल्य का कुछ है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.