まめしみ

やったことを淡々と書く

Category : node.js


 

当然のことながらアプリを再起動すると変数が初期化されます。
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


 

centOSでsocket.ioをnpmインストールするとエラーになった。

npm install socket.io

=====
npm ERR! tar "-mvxpf" "-" "-o" "-C"
=====

 

centOSのtarはバージョンが古い。
yumでインストールできるのは1.1系。
1.2系が必要なのでソースからtarを入れた。

cd ~/parts
wget http://ftp.gnu.org/gnu/tar/tar-1.26.tar.gz
tar zxf tar-1.26.tar.gz
cd tar-1.26

#古いものをuninstall
sudo rpm -e --nodeps tar

./configure
make
sudo make install

インストールできたがtarコマンドのパスがおかしくなって使えなくなった。
ついでにOSアップデートもしてたのでrebootしたらパス通りました。。。

 

sokect.ioインストール

npm install socket.io

うまくいきました!


 
node.jsとnpm(node package manager)をインストールします。
 
isaacs/node – GitHub
isaacs/npm – GitHub

 

node.js & npmインストール

1.node.jsインストール

wget http://nodejs.org/dist/node-v0.4.11.tar.gz
tar zxvf node-v0.4.11.tar.gz
cd node-v0.4.11
./configure
make
sudo make install

 

2.npmインストール

curl http://npmjs.org/install.sh |sudo sh

 
こんなエラーが出た。。。

npm cannot be installed without nodejs.
Install node first, and then try again.

Maybe node is installed, but not in the PATH?
Note that running as sudo can change envs.

PATH=/usr/bin:/bin

 
sudoしたときにPATHが引き継がれていない模様。
sudoの設定にenv_keepというところがあるので、そこに「PATH」を追加します。

sudo visudo
===============================================
Defaults    env_keep = "PATH COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY"
===============================================

 
リトライ!

curl http://npmjs.org/install.sh |sudo sh

 
うまくいきました。

/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm.js
/usr/local/bin/npm_g -> /usr/local/lib/node_modules/npm/bin/npm.js
/usr/local/bin/npm-g -> /usr/local/lib/node_modules/npm/bin/npm.js
npm@1.0.27 /usr/local/lib/node_modules/npm
It worked