2012-02-14 8 views
8

मैं वेबसाइकिल के माध्यम से क्लाइंट और सर्वर के बीच कनेक्शन स्थापित करने के लिए नोडजेस + वेबस्केट मॉड्यूल का उपयोग कर रहा हूं। सर्वर क्लाइंट को कई बार डेटा उत्सर्जित करता है: मुझे पता है कि यह एक टीसीपी कनेक्शन है, लेकिन मुझे इसके बारे में हर संदेह को हटाने दें। क्या "उत्सर्जित" अनुक्रमिक हैं? यदि पहली बार "उत्सर्जित" समय 1s पर किया गया था और दूसरी बार "emit" समय 2s पर किया गया था, तो क्लाइंट निश्चित रूप से पहले उत्सर्जक और फिर दूसरा प्राप्त करेगा? क्या होता है यदि पहले उत्सर्जन अभी तक प्राप्त नहीं हुआ है और दूसरा उत्सर्जित है? कॉल अवरुद्ध कर रहे हैं?वेबसाइट: क्या सर्वर डेटा समकालिक रूप से भेजा जाता है?

+0

http://stackoverflow.com/q/11804721/632951 – Pacerier

उत्तर

21

वेबसाकेट टीसीपी पर बनाया गया है। टीसीपी पैकेट की डिलीवरी और ऑर्डरिंग की गारंटी देता है। इसके अलावा, टीसीपी के विपरीत, वेबस्केट्स संदेश आधारित है जिसका अर्थ है कि वेबसाकेट संदेश पूरे संदेश के रूप में प्राप्त होते हैं (टीसीपी स्ट्रीमिंग है और 'संदेश' श्रोता के परिप्रेक्ष्य से खंडित हो सकता है)

नोड.जेएस में, दो उत्सर्जक उसी संदर्भ से कहा जाता है (वही कार्य) एक दूसरे के बाद उस क्रम में वितरित किया जाएगा। हालांकि, यदि आपके उत्सर्जन दो अलग-अलग कॉलबैक में हैं, तो आप हमेशा गारंटी नहीं दे सकते कि Node.js उन कॉलबैक को शेड्यूल करेगा और इसलिए उत्सर्जित पुन: आदेश प्राप्त हो सकते हैं क्योंकि निर्धारित कॉलबैक को फिर से आदेश दिया गया है।

अद्यतन:

fs.readFile(file1,function(e,data) { ws.send(data); }); 
fs.readFile(file2,function(e,data) { ws.send(data); }); 

आदेश:

यहाँ क्यों Node.js की घटना संचालित प्रकृति WebSocket की आश्चर्य की बात फिर से आदेश देने में हो सकता है पर विस्तार करने के लिए एक उदाहरण है/भेजता का उत्सर्जन करता है ब्राउज़र में फ़ाइल 1 और फ़ाइल 2 वितरित किया जाएगा अनुमानित नहीं है (यहां तक ​​कि फाइल का आकार कैशिंग, फाइल-सिस्टम विखंडन इत्यादि जैसी चीजों के कारण आग लगने की गारंटी नहीं है)। भले ही फ़ाइल 2 के readFile को एक सेटटाइमआउट का उपयोग करके 1 सेकंड बाद कहा जाता है, फिर भी ब्राउज़र उन्हें ऑर्डर से बाहर कर सकता है (उदाहरण के लिए यदि फ़ाइल 1 बहुत बड़ा है और पढ़ने के लिए 3s लेता है तो फ़ाइल 1 के भेजने के बाद फ़ाइल 2 के लिए भेजा जाएगा) ।

तो हाँ, नोड्स.जेएस में कॉल किए जाने वाले क्रम में ब्राउजर में उत्सर्जित/भेज दिया जाएगा, लेकिन नोड.जेएस की असीमित घटना संचालित प्रकृति के कारण उत्सर्जन/भेज आपके क्रम में नहीं हो सकता है उम्मीद करते हैं।

नोड.जेएस की असीमित घटना संचालित प्रकृति नोड.जेएस उत्कृष्ट दक्षता और प्रदर्शन प्रदान करती है, लेकिन यदि आप इस प्रकार के कॉलबैक आधारित प्रोग्रामिंग के लिए उपयोग नहीं करते हैं तो इसमें कुछ आश्चर्यजनक परिणाम हो सकते हैं।

+0

"हालांकि, यदि आपके उत्सर्जन दो अलग-अलग कॉलबैक में हैं, तो आप हमेशा गारंटी नहीं दे सकते कि Node.js उन कॉलबैक को शेड्यूल करेगा और इसलिए उत्सर्जित पुन: आदेश प्राप्त हो सकते हैं क्योंकि निर्धारित कॉलबैक को फिर से आदेश दिया गया है।" - अगर कॉलबैक 1 कॉलबैक 2 से पहले भाग गया, और वे प्रत्येक उत्सर्जित करते हैं, तो कॉलबैक 1 की उत्सर्जन * कॉलबैक 2 के उत्सर्जन से पहले * चलाएगी। – einaros

+1

@ इनारोस, यह सच है लेकिन मेरा मुद्दा यह है कि कॉलबैक स्वाभाविक रूप से असीमित हैं ताकि आप उस आदेश की गारंटी नहीं दे सकें जिसमें वे आग लगाएंगे। यहां तक ​​कि यदि आप कॉलबैक बी पंजीकृत करने से पहले कॉलबैक ए 1 सेकंड पंजीकृत करते हैं, तो कॉलबैक ए के साथ नियमित रूप से पूरा होने में 3 सेकंड लगते हैं और बी केवल 1 सेकंड लेता है, तो बी पहले से पंजीकृत होने के बावजूद ए से पहले होगा। और आई/ओ पूरा होने पर गोलीबारी कर रहे किसी भी कॉलबैक में अक्सर अप्रत्याशित समय होगा। – kanaka

+0

यह देखते हुए कि एक विशिष्ट घटना के लिए किसी विशिष्ट क्रम में पंजीकृत कॉलबैक हमेशा उस क्रम में निष्पादित होंगे, मैं बिल्कुल नहीं देखता कि शेष में से कोई भी ओपी के प्रश्न से कैसे संबंधित है। यह स्पष्ट है कि यदि उत्सर्जन ट्रिगर करने वाली घटनाएं ऑर्डर बदलती हैं; उत्सर्जन भी आदेश बदल जाएगा। – einaros

4

संदेश सही क्रम में क्लाइंट में आते हैं।

+2

तो "सही क्रम" क्या है? यदि दो प्रक्रियाएं ** simulatenously ** 1 नैनोसेकंद अलग भेजती हैं, तो क्या सर्वर उस क्रम में कॉल प्राप्त करता है? – Pacerier

+3

@Pacerier आपका प्रश्न शर्तों में एक विरोधाभास प्रस्तुत करता है। – EJP

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

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