まめしみ

やったことを淡々と書く

Category : express


 

当然のことながらアプリを再起動すると変数が初期化されます。
Bear : まめしみGAMEでは累計アクセス数をリセットしたくないので変数の値をファイルに保持して永続化してみました。

app.jsから抜粋

//import
var express = require('express');
var app = module.exports = express.createServer()
var io = require('socket.io').listen(app);-
var fs = require('fs');

var totalFile = __dirname + '/tmp/total.txt';
var total = function(){
    var ret = 0;
    //ここは起動時の処理なので同期処理を使用する
    //一度a+モードで開く。
    //ファイルがなければファイルが作成される。
    var fd = fs.openSync(totalFile, 'a+');
    fs.closeSync(fd);
    //totalファイル読み込む。
    data = fs.readFileSync(totalFile, 'utf-8');
    if(data){
        ret = parseInt(data);
    }
    return ret;
}();

//イベント
io.sockets.on('connection', function(socket){
    total++;
    //totalファイルに記録しておく
    fs.writeFile(totalFile, ''+total, function(err){
        if(err){
            throw err;
        }
    });
}

起動したときに変数totalの値をファイルから読み込んでいます。

コメントにも書いてありますが起動時の処理なので同期処理にしています。
ここで非同期にするメリットは何もありません。
totalの値を確定させることが大事。

connectionイベントでtotalをインクリメントしてファイルに書き込むようにします。

 

DBを使うよりお手軽に永続化できます。


 

nodejs + express + socket.io でゲーム作った

Bear : まめしみGAME
 

ゲーム内容はあれですが、、、
以下のことが気になっていたのでそこそこデータのやり取りしているゲームつくりました。

  • どれくらいリアルタイムなのか?
  • websocketとxhr-pollingでどれくらい違うのか?
  • 3G回線ではどうか?
  • 各ブラウザの挙動は?
  • サーバーの負荷は?

 

通信方式、サーバーのload average、メモリ使用量とかも表示しています。

敵、アイテム位置情報はサーバー側で管理しているので当たり判定はサーバーでしています。
なかなかリアルタイムで出来てると思いますがどうでしょう?
さすがにスマフォで3G回線カクつきます。。。

 

みなさんも複数ブラウザ立ち上げてどんなもんか見てみてください。

 
Bear : まめしみGAME