javascript - Node.js/Server.js सॉकेट कार्यान्वयन की समस्याएं




sockets stack (2)

एक node.js / server.js सेटअप को लागू करने में कठिनाई हो रही है

मैं अभी थोड़ा फंस गया हूं, और उम्मीद करता हूं कि कोई कुछ प्रकाश डाल सकता है। मैं आम तौर पर सॉकेट के लिए अपेक्षाकृत नया हूं, लेकिन कई वर्षों तक जावास्क्रिप्ट में प्रोग्रामिंग चालू और बंद कर रहा हूं, हालांकि कार्य को पूरा करने के लिए केवल उतना ही गहराई है जितना आवश्यक है। नतीजतन, जावास्क्रिप्ट स्टैक ढेर के आस-पास की कुछ अवधारणाओं की मेरी समझ, और सामान्य रूप से सॉकेट कुछ हद तक सीमित हैं। ठीक है यहाँ स्थिति है:

मैंने कई मशीनों पर काउंटर को बढ़ाने के उद्देश्य से एक एप्लिकेशन बनाया है। कई उपयोगकर्ता "अगला" बटन पर क्लिक कर सकते हैं और यह तुरंत सभी मशीनों पर अपडेट हो जाएगा। जब आप पहली बार कनेक्ट करते हैं, तो यह वर्तमान संख्या को पुनर्प्राप्त करता है, और इसे स्थानीय रूप से थूकता है।

मैंने यहां सर्वर बनाया है:

var io = require("socket.io");
var sockets = io.listen(8000);
var currentlyServing=0;
sockets.on("connection", function (socket)
{ 
    console.log("client connected");
    socket.emit("receive", currentlyServing);
    socket.on("update", function(serving)
    {
        currentlyServing=serving;
        if(currentlyServing>100)
            currentlyServing=0;
        if(currentlyServing<0)
            currentlyServing=99;
        socket.broadcast.emit("receive", currentlyServing);
        console.log("update received: "+currentlyServing);
    });
});
console.log("Server Started");

ग्राहक पक्ष से प्रासंगिक (मुझे उम्मीद है) अंश यहां दिया गया है:

var socket = io.connect("http://www.sampledomain.com:8000");

//function to update the page when a new update is received
socket.on("receive", function(receivedServing)
{
    document.getElementById('msgs').value=""+String("00" + receivedServing).slice(-2);
    document.getElementById('nowServing').value=receivedServing;
});

//this is called in an onClick event in the HTML source
//sends the new number to all other stations except this one (handled by server side)
function nextServing() 
{
    var sendServing = parseInt(document.getElementById('nowServing').value)+1;
    socket.emit("update", sendServing);
    document.getElementById('nowServing').value=sendServing;
    document.getElementById('msgs').value=""+String("00" + sendServing).slice(-2);
}

ठीक है तो मेरी समस्या यहाँ है। आईई 8 को छोड़कर - यह हर प्रणाली में इसे ठीक से चलाता है, जिसे मैंने आसानी से और खूबसूरती से रखा है। यदि 2-3 मिनट से अधिक के लिए अकेला छोड़ दिया जाता है (बिना किसी गतिविधि के), तो मुझे अंततः "स्टैक ओवरफ़्लो" त्रुटि प्राप्त होती है। यह संख्या जो उतार-चढ़ाव पर दिखाई देती है (अभी तक शामिल कारकों को निर्धारित नहीं किया है), लेकिन यह हमेशा अंतराल पर होता है। कुछ वर्कस्टेशनों में यह अधिक समय लगता है, जो मुझे लगता है कि मशीन के पास phsyical RAM की मात्रा के साथ सीधा सहसंबंध है, या कम से कम वेब ब्राउज़र को कितना आवंटित किया जा रहा है।

मुझे "अधिकतम स्टैक आकार" निर्धारित करने के लिए एक ऑनलाइन फ़ंक्शन मिला, जिसे मैं महसूस करता हूं कि एक सटीक विज्ञान नहीं है, हालांकि मुझे 3000 के क्षेत्र में लगातार संख्या मिली है। मेरे आईई 11 मशीन पर अधिक संसाधनों के साथ, मुझे यह पता चला 20,000 का क्षेत्रफल। यह प्रासंगिक नहीं हो सकता है, लेकिन मैंने अधिक जानकारी को बेहतर समझा :)

इस समस्या से बचने के लिए ताकि अंतिम उपयोगकर्ताओं को यह त्रुटि संदेश दिखाई न दे, मैंने पूरी क्लाइंट स्क्रिप्ट ली है, और इसे एक आईफ्रेम में डाल दिया है जो हर 60 सेकंड में खुद को पुनः लोड करता है, अनिवार्य रूप से स्टैक को रीसेट कर रहा है, जो बहुत गंदा लगता है एक वेब सॉकेट के बहुत करीब बैठे, लेकिन मुझे यहां पोस्ट करने का समय खरीदा है। जब तक मैं Google पर "स्टैक ओवरफ्लो" के साथ "node.js" या "socket.io" खोजता हूं, तब तक मैं गुगल हो जाता हूं, आपको बस दो विषयों के बारे में बहुत सारी पोस्ट मिलती हैं stackoverflow डॉट कॉम वेबसाइट पर होस्ट किया गया। एआरजी लॉल

किसी को?

नीचे टिप्पणियों के अनुसार नवंबर 18 नवंबर 2014 को संपादित करें:

त्रुटि संदेश अक्सर 1056 लाइन पर स्टैक ओवरफ़्लो का दावा करता है। आईई डेवलपर टूल फ़ाइल socket.io.js की ओर इंगित करता है। रेखा 1056 है:

return fn.apply(obj, args.concat(slice.call(arguments)));

जो फ़ाइल के इस खंड को insdie है:

var slice = [].slice;

/**
 * Bind `obj` to `fn`.
 *
 * @param {Object} obj
 * @param {Function|String} fn or string
 * @return {Function}
 * @api public
 */


module.exports = function(obj, fn){
  if ('string' == typeof fn) fn = obj[fn];
  if ('function' != typeof fn) throw new Error('bind() requires a function');
  var args = slice.call(arguments, 2);
  return function(){
    return fn.apply(obj, args.concat(slice.call(arguments)));
  }
};

जो मैंने पढ़ा है, उससे ऐसा लगता है कि आईई 8 पर समस्या फ्लैश से संबंधित हो सकती है। यह IE8 फ्लैशसेट को डिफ़ॉल्ट कॉन्फ़िगरेशन के रूप में उपयोग करता है। मैं ग्राहक पक्ष पर निम्न कोशिश करने का सुझाव देता हूं:

 if(navigator.appName.indexOf("Internet Explorer")!=-1 && navigator.appVersion.indexOf("MSIE 8")==-1 ){      
      socket = io.connect("http://www.sampledomain.com:8000", {
           transports: ['xhr-polling']
      });
 }
 else
 {
       socket = io.connect("http://www.sampledomain.com:8000" );
 }

इससे आईई 8 लंबे मतदान का उपयोग करना चाहिए जबकि अन्य सभी मशीनें सबसे अच्छी विधि का उपयोग कर सकती हैं।

एक तरफ ध्यान दें: आप सर्वर पर "सेवारत" चर बढ़ाने में भी विचार करना चाहेंगे।


मौजूदा समस्या का पता लगाएं here

यह फ्लैश को अक्षम करके तय किया गया था।

वेबसाईट के बजाय विंडोज क्लाइंट एक्सफर-एक्सपिंग पर सफारी को भी ढूंढें - प्रदर्शन को गंभीर रूप से नुकसान पहुंचाया गया है # 1147 । हालांकि यह सफारी है, यह आईई 8 पर लागू हो सकता है क्योंकि यह समान तंत्र का उपयोग कर रहा है।

मैंने आपके सॉकेट.io का उपयोग करके एक छोटा परीक्षण किया लेकिन आईई 10 में और आईई 8 नकल किया ताकि मैं अच्छी तरह से डीबग कर सकूं। टैब में नेटवर्क को कैप्चर करना प्रारंभ किया और प्रत्येक कुछ सेकंड लॉग इन करने के अनुरोधों को देखा। कुछ मिनटों के लिए अकेले रहें और मुझे बहुत से अनुरोध लॉग इन दिखाई देते हैं। आप इसे क्रोम में नहीं देख पाएंगे क्योंकि इसमें सच्चे वेबसाकेट हैं। जबकि IE8 WebSockets socket.io का अनुकरण नहीं करता है कि कुछ तंत्र का उपयोग करके सादे HTTP GET / POST का उपयोग करना। तो मेरा सिद्धांत यह है कि यदि socket.io IE8 के साथ काम करता है तो यह विश्वसनीय रूप से वेब सॉकेट का अनुकरण नहीं करता है

मेरी सलाह है कि लंबे समय तक चल रहे क्लाइंट एप्लिकेशन के लिए आईई 8 को रद्द करना है। आईई 8 अब माइक्रोसॉफ्ट द्वारा समर्थित नहीं है







stack-overflow