Подтвердить что ты не робот

Проблемы с реализацией сокета Node.js/Server.js

Не удается выполнить установку node.js/server.js

Я немного застрял прямо сейчас и надеюсь, что кто-то может пролить свет. Я относительно новичок в сокетах вообще, но программировал в javascript в течение нескольких лет, хотя и был настолько глубоким, насколько это необходимо для выполнения поставленной задачи. В результате мое понимание некоторых концепций, связанных с кучей javascript-стека, и сокетов в целом несколько ограничено. Хорошо. Здесь ситуация:

Я создал приложение, предназначенное для простого увеличения счетчика на нескольких машинах. Несколько пользователей могут нажать кнопку "Далее", и она будет мгновенно обновляться на всех машинах. Когда вы впервые подключаетесь, он извлекает текущий номер и вырывает его локально.

Я создал сервер здесь:

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);
}

Хорошо, вот здесь моя проблема. Это работает абсолютно нормально в каждой системе, которую я вложил, плавно и красиво - за исключением IE8. Если оставить в покое более 2-3 минут (без каких-либо действий), я получаю сообщение об ошибке "переполнение стека". Номер строки, на которой он появляется, колеблется (еще не определил задействованные факторы), но это всегда происходит на этом интервале. На некоторых рабочих станциях это занимает больше времени, и я начинаю думать, что он имеет прямую корреляцию с количеством оперативной памяти, имеющейся у компьютера, или, по крайней мере, на то, сколько выделяется веб-браузеру.

Я нашел онлайн-функцию, чтобы определить "максимальный размер стека", который, как я понимаю, не является точной наукой, однако я постоянно получал номер в области 3000. На моей машине IE11 со значительно большим количеством ресурсов я нашел ее чтобы быть в районе 20 000 человек. Это может быть не актуально, но я понял, что больше информации лучше:)

Чтобы избежать этой проблемы на данный момент, так что конечные пользователи не видят это сообщение об ошибке, я беру всего клиента script и помещаю его в iFrame, который перезагружается каждые 60 секунд, по существу, перезагружая стек, который так грязно сидит так близко к сетевой розетке, но купил мне время для публикации здесь. Я googled, пока я больше не могу google, но когда вы просматриваете "node.js" или "socket.io" вместе с "переполнением стека" в google, вы просто получаете много сообщений об этих двух темах которые размещены на веб-сайте stackoverflow dot com. ARG lol

Кто-нибудь?

ИЗМЕНИТЬ 18 НОЯБРЯ 2014 ГОДА КАК КОММЕНТАРИИ НИЖЕ:

сообщение об ошибке чаще всего запрашивает переполнение стека в строке 1056. IE Средства разработчика указывают на файл socket.io.js. Строка 1056:

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

который находится в этом разделе файла:

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)));
  }
};
4b9b3361

Ответ 1

Найти существующую проблему Вызывает "переполнение стека" в IE8 при использовании xhr-poll # 385.

Это было исправлено отключением Flash.

Также найдите Safari над клиентом Windows использует xhr-опрос вместо websocket - производительность сильно вредит # 1147. Хотя это Safari, он может применяться к IE8, поскольку использует аналогичный механизм.

Я сделал небольшой тест, используя ваш socket.io, но в IE 10 и эмулированный IE8 так что я мог хорошо отлаживать. Начнется захват сети на вкладке и заметил, что запросы регистрируются каждые несколько секунд. Только один для нескольких минут, и я вижу, что многие запросы вошли в систему. Вы не увидите этого в Chrome, поскольку он имеет настоящие WebSockets. Хотя IE8 не поддерживает WebSockets socket.io эмулирует использование простого HTTP GET/POST с использованием некоторых механизм. Поэтому моя теория заключается в том, что даже если socket.io работает с IE8, не надежно эмулирует сетевые сокеты

Мой совет - исключить IE 8 для долгого клиентского приложения. IE8 больше не поддерживается Microsoft.

Ответ 2

Из того, что я прочитал, кажется, что проблема с IE8 может быть связана со вспышкой. IE8 использует flashsocket в качестве конфигурации по умолчанию. Я предлагаю попробовать на стороне клиента следующее:

 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" );
 }

Это должно заставить IE8 использовать длительный опрос, в то время как все остальные машины используют лучший способ, которым они могут.

На стороне примечания: вы также можете рассмотреть возможность увеличения переменной "обслуживающий" на сервере.

Ответ 3

возможно, попробуйте заменить

""+String("00" + receivedServing).slice(-2)

с

('00' + receivedServing).slice(-2)