2010-07-26 16 views
10

मैं नोडजेस का उपयोग करके एक साधारण क्लाइंट-सर्वर कनेक्शन को जानना चाहता हूं। लेकिन मुझे निम्न समस्या का सामना करना पड़ा है।नोडज स्ट्रीमिंग

कोड पर विचार करें

server.js:

var net = require('net'), 
    sys = require('sys'); 

    net.createServer(onConnection).listen(8124); 

    function onConnection(socket) { 
    socket.setNoDelay(true); 

    socket.addListener("connect", function() { 
     sys.puts('client connected: ' + this.remoteAddress); 
    }); 

    socket.addListener("data", function (data) { 
     sys.puts("message: \n" + data + "\n - end of msg."); 
    }); 

    socket.addListener("end", function() { 
     sys.puts('end of connection'); 
     this.end(); 
    }); 
    } 

    sys.puts('Server running at 127.0.0.1:8124'); 

client.js:

var net = require('net'), 
sys = require('sys'); 

var stream = net.createConnection(8124); 
stream.addListener("connect", function(){ 
sys.puts('connected'); 

stream.write('a'); 
    stream.flush(); 
stream.write('b'); 
    stream.flush(); 

}); 

stream.addListener("data", function(data){ 
sys.puts("Message: \n" + data + "\n - end of msg."); 
}); 

जब मैं client.js चलाने मैं कभी कभी केवल एक संदेश 'अब' के बजाय मिल दो संदेश 'ए' और 'बी'।

क्या इससे निपटने के लिए कुछ 'सही विधि' है?

+0

आपको 'बा' भी मिल सकता है !! आपके द्वारा भेजे जाने वाले क्रम में डेटा प्राप्त करने के लिए कोई अनुदानदाता नहीं है। –

+4

@MortezaM। असल में टीसीपी/आईपी * गारंटी देता है * डेटा भेजा गया आदेश पर प्राप्त किया जाएगा, इसलिए इस मामले में यह हमेशा 'ab' होगा। – Kornel

उत्तर

10

टीसीपी धारा प्रोटोकॉल है। पाइप के एक छोर पर एकल write परिणामस्वरूप दूसरे छोर पर कई "पढ़ता है" और दूसरी तरफ। आपको या तो स्पष्ट रूप से दूसरी तरफ बता देना होगा कि संदेश में लंबाई सहित आप कितने बाइट भेज रहे हैं; या आसानी से पहचानने योग्य संदेश delimiters प्रदान करते हैं। किसी भी मामले में आपको एक लूप में पढ़ने की जरूरत है।

+0

तो, आने वाली डेटा को समेकित करने और इसे पूरी तरह से पार्स करने का एकमात्र 'सही तरीका' है? मैंने इसके बारे में सोचा, बस यह सुनिश्चित करना चाहते हैं कि कोई अन्य तरीका नहीं है :) – Dan

+2

आपको इसे एक धारा के रूप में पेश करना होगा। जब वे आते हैं तो बाइट को पार्स करें, पूर्ण संदेश मिलने पर प्रतिक्रिया दें। –

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