sockjs закрывается через 140 секунд

Используя node.js и пример sockjs github под названием «echo» https://github.com/sockjs/sockjs-node, без изменений транспорт закрывается примерно через 130-150 секунд, как показано ниже на диаграмме. После попытки сердцебиения с разной частотой, есть ли у кого-то, имеющего некоторый опыт в этих вещах, какие-либо идеи, зачем мне нужна такая низкая частота сердцебиения? Или я упускаю что-то фундаментальное? Или действительно кто-то знает, что это нормальная скорость для производственной среды? Сервер находится в 204 мс от клиента, пробовал порты 8080 и 442.

Установка:

HTTP, Ubuntu 12.04, Linode VPS

Внесение небольших изменений для добавления пульса дает эти плохие результаты, указывая на необходимость примерно 5-секундного пульса для Chrome и 3-секундного пульса для IE. КЛЮЧ: unlim показывает положительный результат - транспорт не закрылся до окончания времени теста 20+ минут. приборные панели не проверял

Browser:Chrome  Trans:websocket
------------------------------------------
sec per beat    Closed (Port 8080)      Closed (Port 442)
30              150 s                       150 s
25              150 s                       150 s
15              135 s                       135 s
12              unlim                       130 s
10              130 s                       150 s
8               unlim                       unlim
6               unlim                       unlim   
5               unlim                       -
3               unlim                       -


Browser:IE-10  Trans:xhr-stream 
------------------------------------------
sec per beat    Closed (Port 8080)      Closed (Port 442)
30              180 s                       -
25              175 s                       -
15              150 s                       -
12              156 s                       -
10              150 s                       -
8               144 s                       -
6               90 s                        -
5               270 s                       256 s
3               unlim                       unlim

Вот исходный код сервера из примера sockjs, изменен только порт:

var http = require('http');
var sockjs = require('sockjs');
var node_static = require('node-static');

// 1. Echo sockjs server
var sockjs_opts = {sockjs_url: "http://cdn.sockjs.org/sockjs-0.3.min.js"};
var sockjs_echo = sockjs.createServer(sockjs_opts);
sockjs_echo.on('connection', function(conn) {
    conn.on('data', function(message) {
        conn.write(message);
    });
});

// 2. Static files server
var static_directory = new node_static.Server(__dirname);

// 3. Usual http stuff
var server = http.createServer();
server.addListener('request', function(req, res) {
    static_directory.serve(req, res);
});
server.addListener('upgrade', function(req,res){
    res.end();
});

sockjs_echo.installHandlers(server, {prefix:'/echo'});

console.log(' [*] Listening on 0.0.0.0:442' );
server.listen(442, '0.0.0.0');

Вот исходный клиентский код из примера sockjs (с изменениями, отмеченными в коде), в основном получающий inp.val() x 1000 в качестве бита для легкого тестирования.

<!doctype html>
<html><head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
    <style>
      .box {
          width: 300px;
          float: left;
          margin: 0 20px 0 20px;
      }
      .box div, .box input {
          border: 1px solid;
          -moz-border-radius: 4px;
          border-radius: 4px;
          width: 100%;
          padding: 0px;
          margin: 5px;
      }
      .box div {
          border-color: grey;
          height: 300px;
          overflow: auto;
      }
      .box input {
          height: 30px;
      }
      h1 {
          margin-left: 30px;
      }
      body {
          background-color: #F0F0F0;
          font-family: "Arial";
      }
    </style>
</head><body lang="en">
    <h1>SockJS Echo example</h1>

    <div id="first" class="box">
      <div></div>
      <form><input autocomplete="off" value=""></input></form>
    </div>

    <script>
        var sockjs_url = 'http://games.the-checkout-tech.com:442/echo';
        var sockjs = new SockJS(sockjs_url);
        $('#first input').focus();

        var div  = $('#first div');
        var inp  = $('#first input');
        var form = $('#first form');

        var print = function(m, p) {
            p = (p === undefined) ? '' : JSON.stringify(p);
            div.append($("<code>").text(m + ' ' + p));
            div.append($("<br>"));
            div.scrollTop(div.scrollTop()+10000);
        };

        sockjs.onopen    = function()  {print('[*] open', sockjs.protocol);};
        sockjs.onmessage = function(e) {print('[.] ', e.data); };
        sockjs.onclose   = function()  {print('[*] close');};

        form.submit(function() {
            print('[ ] sending', inp.val());
            // sockjs.send(inp.val());          // change
            startBeat();                        // change
            return false;
        });

        /******* Changes below ********/
        function startBeat() {
            window.setInterval(function() {
                sockjs.send(getTime());
            }, inp.val() * 1000);   
        }

        function getTime() {
            var d = new Date();
            output = d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();
            return output;
        }

    </script>
</body></html>

person ChrisAdmin    schedule 18.09.2013    source источник


Ответы (1)


Кажется, обслуживать файл index.html с Apache через порт 80 и общаться с sockjs (и socket.io в этом отношении) через порт 8080 — плохая идея. - без понятия почему.

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

var node_static = require('node-static');

// 2. Static files server
var static_directory = new node_static.Server(__dirname);
person ChrisAdmin    schedule 21.09.2013