2011-08-12 10 views
5

जो मुझे here समझा गया, "वी 8 में एक पीढ़ी का कचरा कलेक्टर है। वस्तुओं को यादृच्छिक रूप से बढ़ाता है। नोड को सॉकेट को लिखने के लिए कच्चे स्ट्रिंग डेटा को पॉइंटर नहीं मिल सकता है।" तो मुझे एक स्ट्रिंग में एक टीसीपी धारा से आने वाले डेटा को स्टोर नहीं करना चाहिए, विशेष रूप से यदि वह स्ट्रिंग Math.pow(2,16) बाइट्स से बड़ी हो जाती है। (उम्मीद है कि मैं अभी तक सही हूं ..)नोडजेएस: टीसीपी सॉकेट धाराओं को संभालने का सही तरीका क्या है? मुझे किस डिलीमीटर का उपयोग करना चाहिए?

टीसीपी सॉकेट से आने वाले सभी डेटा को संभालने का सबसे अच्छा तरीका क्या है? अब तक मैं _:_:_ को एक डेलीमीटर के रूप में उपयोग करने का प्रयास कर रहा हूं क्योंकि मुझे लगता है कि यह किसी भी तरह अद्वितीय है और अन्य चीजों के आसपास गड़बड़ नहीं करेगा।

डेटा का एक नमूना है कि आएगा something_:_:_maybe a large text_:_:_ maybe tons of lines_:_:_more and more data

होगा यह मैं करने की कोशिश की क्या है:

net = require('net'); 
var server = net.createServer(function (socket) { 
    socket.on('connect',function() { 
     console.log('someone connected'); 
     buf = new Buffer(Math.pow(2,16)); //new buffer with size 2^16 
     socket.on('data',function(data) { 
      if (data.toString().search('_:_:_') === -1) { // If there's no separator in the data that just arrived... 
       buf.write(data.toString()); // ... write it on the buffer. it's part of another message that will come. 
      } else {  // if there is a separator in the data that arrived 
       parts = data.toString().split('_:_:_'); // the first part is the end of a previous message, the last part is the start of a message to be completed in the future. Parts between separators are independent messages 
       if (parts.length == 2) { 
        msg = buf.toString('utf-8',0,4) + parts[0]; 
        console.log('MSG: '+ msg); 
        buf = (new Buffer(Math.pow(2,16))).write(parts[1]); 
       } else { 
        msg = buf.toString() + parts[0]; 
        for (var i = 1; i <= parts.length -1; i++) { 
         if (i !== parts.length-1) { 
          msg = parts[i]; 
          console.log('MSG: '+msg); 
         } else { 
          buf.write(parts[i]); 
         } 
        } 
       } 
      } 
     }); 
    }); 
}); 

server.listen(9999); 

जब भी मैं console.log('MSG' + msg) करने की कोशिश है, यह पूरे बफर बाहर प्रिंट होंगे, इसलिए यह है कुछ काम करने के लिए बेकार है।

मैं इस डेटा को उचित तरीके से कैसे संभाल सकता हूं? आलसी मॉड्यूल काम करेगा, भले ही यह डेटा लाइन उन्मुख नहीं है? क्या धाराओं को संभालने के लिए कुछ अन्य मॉड्यूल है जो रेखा उन्मुख नहीं हैं?

+1

प्रस्तुति के लिए जो आप लिंक के बारे में * लेखन * सॉकेट करने के लिए जानकारी बात कर रही है। आप इसे पढ़ रहे हैं, इसलिए चिंताएं अलग हैं। Node.js 0.4.6 में, डेटा कॉलबैक आपको पहले से काम करने के लिए एक बफर देता है, जब तक आप एक एन्कोडिंग निर्दिष्ट नहीं करते हैं, इस स्थिति में आपको एक स्ट्रिंग मिल जाएगी। इसके बाद आप डेटा को कैसे बनाए रखते हैं इस पर निर्भर करता है कि आपका वास्तविक लक्ष्य क्या है। –

+0

क्या इसका मतलब है कि मैं इनकमिंग बफर को एक बड़ी स्ट्रिंग के रूप में स्टोर कर सकता हूं और इसमें कोई प्रदर्शन समस्या नहीं है? –

उत्तर

4

यह वास्तव में कहा गया है कि अतिरिक्त काम चल रहा है क्योंकि नोड को उस बफर को लेना है और फिर उसे v8 में धक्का देना/इसे स्ट्रिंग में डालना है। हालांकि, बफर पर एक toString() करना कोई बेहतर नहीं है। जहां तक ​​मुझे पता है, इस पर इसका कोई अच्छा समाधान नहीं है, खासकर यदि आपका अंतिम लक्ष्य एक स्ट्रिंग और मूर्खतापूर्ण है। चीजों में से एक ने रयान ने उस क्षेत्र के रूप में @ nodeconf का उल्लेख किया जहां काम करने की आवश्यकता है।

डिलीमीटर के लिए, आप जो चाहें चुन सकते हैं। बहुत से बाइनरी प्रोटोकॉल एक निश्चित शीर्षलेख को शामिल करना चुनते हैं, जैसे कि आप चीजों को सामान्य संरचना में डाल सकते हैं, जिसमें कई बार लंबाई शामिल होती है। इस तरह, आप एक ज्ञात शीर्षलेख को अलग करते हैं और पूरे बफर पर पुन: प्रयास किए बिना शेष डेटा के बारे में जानकारी प्राप्त करते हैं। ऐसे ही एक योजना के साथ, एक जैसे उपकरण भी कर सकते हैं:

एक अलग रूप में के रूप में, बफ़र्स सरणी वाक्य रचना के माध्यम से पहुँचा जा सकता है, और उन्हें .slice() के साथ अलग कटाई भी जा सकती है।

अंत में, यहां जांचें: https://github.com/joyent/node/wiki/modules - एक ऐसा मॉड्यूल ढूंढें जो एक साधारण टीसीपी प्रोटोकॉल को पार करता है और ऐसा लगता है, और कुछ कोड पढ़ता है।

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