2013-08-15 6 views
6

अगर मैं एक बड़ी Blob या ArrayBuffer एक जावास्क्रिप्ट WebSocket से अधिक भेज रहा है अपने send विधि के माध्यम से ... डेटा नहीं भेजा जाता जब तक send विधि कॉल ब्लॉक करता है, या यह डेटा की एक प्रतिलिपि पड़ता है तो कॉल एसिंक्रोनस रूप से भेजने के लिए तुरंत वापस आ सकते हैं?जावास्क्रिप्ट WebSocket.send विधि ब्लॉक करता है?

एक संबंधित (अनुत्तरित) सवाल यह है कि मैं इसे व्याख्या, की एक तेजी से श्रृंखला भेजता कारण होगा onmessage घटनाओं में देरी हो करने के लिए, के रूप में किसी को मोबाइल सफारी में क्या हो रहा वर्णित है लगता है कि क्या से, है: Apparent blocking behaviour in JavaScript websocket on mobile Safari

उत्तर

3

के आधार पर bufferedAmount विशेषता का वर्णन, मैं निष्कर्ष निकाला है कि send तुरंत लौटना चाहिए, क्योंकि अन्यथा bufferedAmount हमेशा शून्य हो जाएगा। यदि यह शून्य नहीं है, तो भेजने के लिए पूर्व कॉल से डेटा बफर किया जाना चाहिए, और यदि बफर डेटा भेजते हैं, तो इसके लिए ब्लॉक करने का कोई कारण नहीं है।

http://dev.w3.org/html5/websockets/

से bufferedAmount विशेषता आवेदन डेटा के बाइट्स (UTF-8 पाठ और बाइनरी डेटा) कि पंक्तिबद्ध कर दिया है भेजने का उपयोग कर की संख्या() लेकिन वह लौटना चाहिए, आखिरी बार घटना लूप ने को कार्य निष्पादित करना शुरू किया था, अभी तक नेटवर्क पर प्रेषित नहीं किया गया था। (यह इस प्रकार वर्तमान कार्य के निष्पादन के दौरान भेजे गए किसी भी पाठ भी शामिल है, कि क्या उपयोगकर्ता एजेंट स्क्रिप्ट निष्पादन के साथ अतुल्यकालिक रूप से पाठ संचारित करने के लिए। में सक्षम है की परवाह किए बिना) यह तैयार भूमि के ऊपर प्रोटोकॉल द्वारा किए गए, या बफरिंग किया शामिल नहीं है ऑपरेटिंग सिस्टम या नेटवर्क हार्डवेयर द्वारा। यदि कनेक्शन बंद है, तो यह विशेषता का मान केवल पर भेजने के लिए प्रत्येक कॉल के साथ बढ़ेगा() विधि (कनेक्शन बंद होने के बाद संख्या शून्य पर रीसेट नहीं होती है)।

इस सरल उदाहरण में, bufferedAmount विशेषता कि अद्यतन एक अद्यतन की दर हर 50ms पर या तो भेजा जाता है, अगर नेटवर्क है कि दर संभाल कर सकते हैं, या जो कुछ भी दर नेटवर्क कर सकते हैं पर सुनिश्चित करने के लिए प्रयोग किया जाता है हैंडल, अगर वह बहुत तेज़ है।

var socket = new WebSocket('ws://game.example.com:12010/updates'); 
socket.onopen = function() { 
    setInterval(function() { 
     if (socket.bufferedAmount == 0) 
      socket.send(getUpdateData()); 
    }, 50); 
}; 

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

+0

मैं यह देखने जा रहा हूं कि कितने वोट, अगर कोई हैं, तो यह उत्तर मिलता है। ऐसा लगता है कि तार्किक रूप से, आम तौर पर ब्लॉक करने का कोई कारण नहीं होता है, लेकिन मुझे नहीं पता कि यह बहुत बड़े ब्लॉब्स या ऐरेबफर के साथ कैसे व्यवहार करेगा, जैसे कि यह अधिकतम अधिकतम स्वीकृत बफर्ड राशि से अधिक था। विनिर्देश कहता है कि यदि उपयोगकर्ता को भेज दिया जाता है और बफर भर जाता है तो उपयोगकर्ता एजेंट को पूर्वाग्रह के साथ वेबसाईट बंद करना होगा। – Triynko

+1

लगता है कि कुछ कार्यान्वयन में 2 जीबी की सीमा है: "तो हम अपने दस्तावेज़ों में उल्लेख करना चाहेंगे कि वर्तमान में हम इनकमिंग/आउटगोइंग दोनों में 2 जीबी वेब सॉकेट संदेशों का समर्थन करते हैं।यह सैद्धांतिक सीमा है - मॉलोक इस तरह के आकार के लिए मोबाइल पर असफल होने के लिए निश्चित है, जिस स्थिति में (spec mandates के रूप में) websocket विफल हो गया है। "- https://bugzilla.mozilla.org/show_bug.cgi?id=711003 – Triynko

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