2013-04-12 10 views
6

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

var http = require('http'); 
var sys = require('sys'); 
var fs = require('fs'); 
var qs = require('querystring'); 

var server = http.createServer(); 

var connections = []; 

server.on('request', function(req, res) { 

    console.log(req.url); 

    if(req.url == '/index') { 

     fs.readFile(__dirname + '/index.html', function(err, data){ 
      if(err) { 
       res.writeHead(err, data); 
       return res.end('Error loading index.html'); 
      } 

      res.writeHead(200); 
      res.end(data); 
     }); 
    } else if(req.url == '/sendData') { 
     if (req.method == 'POST') { 
      var body = ''; 
      req.on('data', function (data) { 
       body += data; 
      }); 
      req.on('end', function() { 

       var POST = qs.parse(body); 
       console.log(POST); 
       res.writeHead(200); 
       res.end(""); 
       broadcastData(POST); 
      }); 
     } 

    } else { 
     connections.push(res); 
    } 
}); 

function broadcastData(data) { 
    for(var i = 0; i < connections.length; i++) { 
     connections[i].writeHead(200); 
     connections[i].end(JSON.stringify({'message': data})); 
    } 
} 

process.openStdin().addListener('data', function(chunk) { 
    for(var i = 0; i < connections.length; i++) { 
     connections[i].writeHead(200); 
     var message = chunk.toString(); 
     connections[i].end(JSON.stringify({'message': {'name': message}})); 
    } 
}); 

server.listen(4000); 

ग्राहक के पक्ष:

function doComet() { 
    $.getJSON('/', function(events){ 
     doComet(); 
     console.log(events); 
     $('#content').append(events.message.name); 
    }); 
} 

function sendData(data) { 
    $.ajax({ 
     type: "POST", 
     url: "/sendData", 
     contentType: 'application/javascript; charset=UTF-8', 
     data: { name: "John", location: "Boston" } 
    }).done(function(msg) { 
     console.log(msg) 
    }); 
} 

तो वहाँ है एक श्रोता जो डेटा जो मैं stdin पर लिख सकते हैं और यह भी ग्राहक के पक्ष पर एक बटन सर्वर को डेटा भेजेंगे जो वहाँ भेजता है और सर्वर इसे सभी ग्राहकों को भेजता है।

मेरा प्रश्न यह है कि यदि बहुत सी घटनाएं वास्तव में कम समय में होती हैं? मेरा मतलब है कि सर्वर से एक प्रतिक्रिया मिलने के तुरंत बाद एक और AJAX अनुरोध भेजा जाता है लेकिन क्लाइंट अभी तक कनेक्ट नहीं होने पर थोड़ी सी अवधि होनी चाहिए और यदि उस समय कुछ ऐसा होता है तो ग्राहक के पास ताजा डेटा नहीं होगा।

तो क्या मेरे विचार इस बारे में सही हैं? इस मामले में किसी भी तरह से मुझे यह सुनिश्चित करने के लिए डेटा को ठीक से सिंक करना चाहिए कि हर कोई इसे प्राप्त कर लेता है। क्या कोई जानता है कि इसे ठीक से कैसे किया जाए?

आपकी मदद के लिए धन्यवाद!

+0

आप अपना खुद का धूमकेतु क्यों लागू कर रहे हैं? आपको उन कई पुस्तकालयों में से एक का उपयोग करना चाहिए जो आपके लिए इसे संभालते हैं जैसे कि http://socket.io/ – generalhenry

+3

मुझे क्यों चाहिए? मुझे कोई दिलचस्पी है कि बिना किसी ज्ञान के इसका उपयोग करने से पहले ये चीजें कैसे काम करती हैं। – stomseven

+0

मेरे पास आपके कोड को थोड़ा सा साफ करने के रूप में गेटटन है: http://runnable.com/UWhebgy1CIBlAACD अभी भी बाढ़ के मुद्दे – generalhenry

उत्तर

13

धूमकेतु सभी पुराने HTTP- आधारित हैक्स के लिए एक छतरी शब्द है और यह एक वाक्यांश है जिसे हम छुटकारा पाने के लिए चाहते हैं। वेबसाकेट वे हैं जहां हम बनना चाहते हैं; ब्राउज़र और परे। इसलिए, यदि आप रीयलटाइम समाधान बनाने में रूचि रखते हैं तो आपको शायद पहले वेबस्केट की जांच करनी चाहिए और फिर HTTP स्ट्रीमिंग और HTTP लांग-पोलिंग जैसे फ़ॉलबैक से निपटना चाहिए। अधिक जानकारी के लिए Realtime Web Technology Transport Mechanisms देखें।

आपके द्वारा प्रदान किया गया उदाहरण HTTP लंबे मतदान के रूप में वर्गीकृत किया जाएगा।

क्या होगा यदि वास्तव में बहुत सी घटनाएं बहुत कम समय में होती हैं? मेरा मतलब है कि सर्वर से एक प्रतिक्रिया मिलने के तुरंत बाद एक अन्य AJAX अनुरोध भेजा जाता है लेकिन क्लाइंट अभी तक कनेक्ट नहीं होने पर थोड़ी सी अवधि होनी चाहिए और यदि उस समय कुछ ऐसा होता है तो ग्राहक के पास ताजा डेटा नहीं होगा

यह HTTP लंबी-मतदान के साथ सीमाओं में से एक है और HTTP स्ट्रीमिंग एक बेहतर समाधान क्यों है, और वेबसाकेट अभी भी बेहतर हैं - डेटा भेजा जाने पर कनेक्शन बंद नहीं होता है। मतदान के किसी भी प्रकार के समाधान के साथ आपको शायद एक समाधान की आवश्यकता होगी जो सुनिश्चित करता है कि मतदान अनुरोधों के दौरान मतदान संदेश प्राप्त किए गए और भेजे गए संदेश मतदान केंद्र द्वारा याद नहीं किए जाते हैं।

  1. उपयोग सत्र अंतिम संदेश है कि एक विशेष ग्राहक के लिए भेजा गया था का ट्रैक रखने के:

    समाधान के एक जोड़े हैं। जब वे दोबारा जांचते हैं कि कौन से संदेश आखिरी बार भेजे गए थे, तो कौन से संदेश मिस्ड और भेज दिए गए हैं।

  2. क्लाइंट मतदान के हिस्से के रूप में lastMessageId भेजें। जब सर्वर इसे प्राप्त करता है तो आप यह देखने के लिए जांच सकते हैं कि वह अंतिम संदेश है या नहीं। यदि नहीं, तो आप किसी भी मिस्ड संदेशों के साथ जवाब दे सकते हैं।

रीयलटाइम वेब प्रौद्योगिकियों वाली जटिलताओं में से एक सभी संभावित कनेक्शन परिदृश्यों को संभालने में सक्षम है। इसलिए, यदि आप इसे सीखने के अनुभव के रूप में कर रहे हैं तो यह निश्चित रूप से फायदेमंद और मजेदार है। लेकिन यदि आप उत्पादन में जाने के लिए एक आवेदन बना रहे हैं तो मैं मौजूदा रीयलटाइम ढांचे की सिफारिश करूंगा। realtime web tech guide देखें।

+0

आपके उत्तर के लिए धन्यवाद, धन्यवाद। हां, मैं websockets का उपयोग कर रहा हूं हालांकि इसे व्यापक रूप से समर्थित होने के लिए समय चाहिए। यही कारण है कि मैं यह समझने की कोशिश कर रहा हूं कि इसे और अधिक ब्राउज़र संगत तरीके से कैसे किया जाए। मैं आपके द्वारा लिखे गए एक ही समाधान के बारे में सोचता हूं लेकिन इससे पहले कि मैं इसे लागू कर दूं, यह जानना चाहता था कि ऐसा करने का एक बेहतर तरीका है या नहीं। – stomseven

+0

वेबसाकेट बहुत व्यापक रूप से समर्थित हैं। Http://caniuse.com/#feat=websockets देखें, मैं कहूंगा कि यह पुशर के लिए काम कर रहे मेरे अनुभव के आधार पर 70% से अधिक है। हालांकि हमें लगभग 100% समर्थन के लिए HTTP- आधारित फ़ॉलबैक की आवश्यकता है। क्या मेरी प्रतिक्रिया आपके प्रश्न का उत्तर देती है? – leggetter

+0

@leggetter तो क्या आप "धूमकेतु" शब्द लागू करेंगे यदि आप WebsSockets का उपयोग करते हैं और संतुष्ट करने के लिए HTTP- आधारित फ़ॉलबैक का उपयोग करने की आवश्यकता होती है, उदाहरण के लिए एक बहु-प्लेटफ़ॉर्म एप्लिकेशन जिसमें अभी भी वेबसॉकेट सीमा है? साथ ही, क्या कोई पुस्तकालय पर काम कर रहा है जो इसके साथ रहता है? – Shane

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