2015-05-20 11 views
11

को समझने की शुरुआत में मैंने हाल ही में एक नई परियोजना में शामिल हो गए हैं जहां मुझे वेब सॉकेट का उपयोग करके स्ट्रीमिंग डेटा को लागू करने के लिए कार्य किया जा रहा है। विचार है कि जानकारी का एक समूह वर्तमान में HTTP अनुरोधों (एक यथार्थ तरीके से) के माध्यम से खुलासा किया जा रहा है कि वे वेब सॉकेट के माध्यम से उजागर करना चाहते हैं।वेब सॉकेट और http अनुरोध (और STOMP)

मैं वेब सॉकेट और STOMP के बारे में पिछले 48 घंटों में अनुसंधान के एक झुंड किया है और कुछ बिंदुओं पर कुछ स्पष्टीकरण प्राप्त करना चाहता था है

  1. एक ग्राहक के लिए

    तो और एक के माध्यम से कनेक्ट करने के लिए एक सर्वर एक HTTP अनुरोध/प्रतिक्रिया के बजाय वेब सॉकेट, उन्हें पहले उनके बीच एक वेब सॉकेट कनेक्शन स्थापित करने के लिए सहमत होना चाहिए। क्या यह एचटीटीपी जीईटी के माध्यम से किया गया है जिसमें एक अद्वितीय शीर्षलेख पारित किया गया है जो कहता है कि वे इसके बजाय वेब सॉकेट कनेक्शन का उपयोग करना चाहते हैं?

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

मुझे लगता है कि ये मेरे दो मुख्य प्रश्न हैं और मुझे यकीन है कि इन उत्तरों के जवाब मुझे इस विषय के बारे में और अधिक सीखने के लिए सही दिशा में इंगित करेंगे। मैं किसी भी अच्छे नमूना कोड उदाहरण खोजने की कोशिश कर रहा हूं लेकिन मैं इसे सप्ताह के भीतर लागू करने के लिए पर्याप्त रूप से समझने की कोशिश कर रहा हूं।

+0

यदि आप वास्तव में वेबसॉकेट संचार को लागू करना चाहते हैं तो आप निश्चित रूप से spec को पढ़ना चाहेंगे: https://tools.ietf.org/html/rfc6455। मुझे यकीन है कि आपने इसे देखा है लेकिन बस यह सुनिश्चित करना चाहता था। – Randy

+1

यदि आपको केवल वेबस्केट संचार (spec को लागू करने की आवश्यकता नहीं है) का उपयोग करने की आवश्यकता है तो वहां बहुत सारी पुस्तकालय हैं जो आपके लिए सभी कड़ी मेहनत को समाहित करेंगे। Socket.io शायद बेहतर Node.js लाइब्रेरीज़ में से एक है क्योंकि यह वेब सॉकेट का समर्थन नहीं करता है, इस स्थिति में गिरावट का उपयोग करता है। – Randy

+0

इस आलेख को जांचें: https://blog.pusher.com/websockets-from-scratch – niba

उत्तर

9

तो एक ग्राहक और सर्वर के लिए HTTP अनुरोध/प्रतिक्रिया के बजाय वेब सॉकेट के माध्यम से कनेक्ट करने के लिए, उन्हें पहले उनके बीच एक वेब सॉकेट कनेक्शन स्थापित करने के लिए सहमत होना चाहिए। क्या यह एचटीटीपी जीईटी के माध्यम से किया गया है जिसमें एक अद्वितीय शीर्षलेख पारित किया गया है जो कहता है कि वे इसके बजाय वेब सॉकेट कनेक्शन का उपयोग करना चाहते हैं?

हां, अधिक या कम। हेडर हैं:

Connection: Upgrade 
Upgrade: websocket 
Sec-WebSocket-Key: <random string, base64 encoded> 
Sec-WebSocket-Version: <version> 

आमतौर version 13 इन दिनों है, हालांकि मेरा मानना ​​है कि 8 भी उपयोग में भी है।

सर्वर WebSocket करने के लिए सहमत हैं, तो यह HTTP कोड 101 वापस आ जाएगी निम्नलिखित हेडर के साथ:

Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: <base64 encoded hash based on Sec-WebSocket-Key> 

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

ऐसा लगता है जैसे आप इसे समझते हैं, लेकिन मैं बताउंगा कि आप केवल एक जीईटी के साथ वेबस्केट शुरू कर सकते हैं।

जो आपने वर्णन किया है, उससे यह स्पष्ट नहीं है कि वेबसाकेट वास्तव में आप चाहते हैं। वेबस्केट का उपयोग सर्वर और क्लाइंट के बीच दो-तरफा संचार के लिए किया जाता है। यदि आप सर्वर से क्लाइंट तक स्ट्रीम करने में सक्षम होना चाहते हैं, तो आपके पास सर्वर-प्रेषित ईवेंट के साथ एक बहुत आसान समय होगा।

+0

कहानी के लिए आवश्यकताएं सर्वर भेजे गए ईवेंट पर वेब सॉकेट की तरफ झुक रही हैं। तो इस "हैंडशेक" के बाद कोई और http अनुरोध भेजने की आवश्यकता नहीं है? वे सिर्फ 101 प्राप्त करते हैं और लाइव फीड शुरू होती है? – user3037172

+0

@ उपयोगकर्ता3037172 हां। नोट, हालांकि, यदि कोई कनेक्शन तोड़ दिया गया है तो आपको मैन्युअल रूप से फिर से कनेक्ट करना होगा और जब आप चले गए थे तो मिस्ड संदेशों से निपटना होगा। –

0

मुझे इसके चारों ओर अपने सिर को वास्तव में प्राप्त करने में 48 घंटे से अधिक समय लगे। यह AJAX से एक बड़ा बदलाव है।

आप शायद निम्न स्तर पर सोच रहे हों। यदि आप कई ब्राउज़रों में संदेश प्रसारित कर रहे हैं, तो कई संदेश कतार सिस्टम हैं जो websockets (कई या सभी STOMP का उपयोग कर) पर बात कर सकते हैं।

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

शुभकामनाएं, और उत्तर में नहीं सीखे गए किसी भी चीज़ के साथ अपने स्वीकृत उत्तर पर अपना प्रश्न या टिप्पणी अपडेट करें ताकि अन्य लोग इससे सीख सकें।

अद्यतन: वेबसेट के .NET के कार्यान्वयन पर अधिक जानकारी वाले किसी व्यक्ति को कृपया कुछ विवरणों के साथ उत्तर दें जिन्हें मैं नहीं जानता और जांच करने का समय नहीं है। मेरा जवाब पूरा नहीं हुआ है, मेरे पास बक्षीस की समयसीमा समाप्त होने से ठीक पहले जवाब देने का समय नहीं है।

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