2010-08-09 12 views
5

मैं एक चैट प्रोग्राम है जो अपाचे/पीएचपी Node.js करने से JSON डेटा धक्का मिल गया है में विभाजित सॉकेट संदेशों से Node.js रखने के लिए, TCP सॉकेट के माध्यम से:कैसे छोटे विखंडू

// Node.js (Javascript) 
phpListener = net.createServer(function(stream) 
{ 
    stream.setEncoding("utf8"); 
    stream.on("data", function(txt) 
    { 
     var json = JSON.parse(txt); 

     // do stuff with json 
    } 
} 
phpListener.listen("8887", 'localhost'); 

// Apache (PHP) 
$sock = stream_socket_client("tcp://localhost:8887"); 
$written = fwrite($sock, $json_string); 
fclose($sock); 

समस्या है, यदि JSON स्ट्रिंग काफी बड़ी है (लगभग 8k से अधिक), आउटपुट संदेश एकाधिक हिस्सों में विभाजित हो जाता है, और JSON पार्सर विफल हो जाता है। PHP स्ट्रिंग की सही लंबाई के रूप में $ लिखित मान देता है, लेकिन डेटा इवेंट हैंडलर दो या उससे अधिक की आग लगता है।

क्या मुझे एक अलग घटना में फ़ंक्शन संलग्न करना चाहिए, या क्या घटना के आग में पाठ को कैश करने का कोई तरीका है, इस तरह से भारी भार के तहत दौड़ की स्थिति में कमी नहीं होगी? या कुछ अन्य समाधान मैंने सोचा नहीं है?

धन्यवाद!

उत्तर

2

डेटा को कैश करने के लिए आपको बफर का उपयोग करने का प्रयास करना चाहिए, क्योंकि नोड.जेएस प्रदर्शन को बेहतर बनाने के लिए डेटा को विभाजित करता है।

http://nodejs.org/api.html#buffers-2

आप अपने सभी अनुरोध बफ़र कर सकते हैं, और फिर इसे में संग्रहीत डेटा के साथ फ़ंक्शन को कॉल करें।

+2

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

+1

हाय, आप सही समय में हैं ओएस या सर्वर जो सामान को विभाजित करता है, लेकिन दस्तावेज पर नोट किया गया है, जैसा कि node.js प्रदर्शन के लिए इनपुट अनुरोधों को विभाजित करता है। मुझे उम्मीद है कि आईपीवी 6 के जंबो पैकेज हमें इससे बचने में मदद कर सकते हैं, लेकिन मेरा अनुमान यह है कि सर्वर प्रदर्शन कारणों से कम से कम (वेब ​​पर कम से कम) –

1

टीसीपी सॉकेट आपके लिए बफरिंग को संभाल नहीं लेते हैं। यह कैसे हो सकता है यह नहीं पता कि आप किस एप्लिकेशन लेयर प्रोटोकॉल का उपयोग कर रहे हैं और इसलिए कोई जानकारी नहीं है कि "संदेश" क्या है। यह आपके ऊपर एक और प्रोटोकॉल डिजाइन और कार्यान्वित करने के लिए है और किसी भी आवश्यक बफरिंग को संभालने के लिए है।

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

+2

नहीं, कोई भी नहीं, http मॉड्यूल आपके लिए पूरा संदेश नहीं बफर करता है। स्ट्रीमिंग डेटा के आसपास नोड बनाया गया है। क्योंकि यह अधिक कुशल है। तो आपको हर समय अपना खुद का बफर करना होगा या उच्च स्तर के ढांचे का उपयोग करना होगा जो आपके लिए यह करेगा। – Marco

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