node.js と 'echo' https://github.com/sockjs/sockjs-nodeと呼ばれる sockjs github の例を使用し、変更を加えないと、下のグラフに示すように、トランスポートは約 130 ~ 150 秒で閉じます。さまざまなレートで心拍数を試した後、これらの経験のある人は、なぜそんなに低い心拍数が必要なのか考えていますか? それとも、基本的な何かが欠けていますか? それとも、これが実稼働環境の通常のレートであることを実際に知っている人はいますか? サーバーはクライアントから 204 ミリ秒離れており、ポート 8080 と 442 を試しました。
セットアップ:
HTTP, Ubuntu 12.04, Linode VPS
ハートビートを追加するためにいくつかの小さな変更を加えると、これらの悪い結果が得られます。これは、Chrome では約 5 秒、IE では 3 秒のハートビートが必要であることを示しています。キー: 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 の例の元のクライアント コードです (コードに変更が記載されています)。
<!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>