前回に引き続きnode.jsのお勉強です。

socket.ioという楽しげなパッケージがあるので、

ためしにチャットツールを作ってみます。

socket.ioインストール

D:\nodejs>mkdir chat

D:\nodejs>cd chat

D:\nodejs\chat>npm install socket.io

D:\nodejs\chat>npm install socket.io-client

なんか、結構時間がかかるうえに警告が出まくりました。

大丈夫なんでしょうか。

動作確認

インストールが不安なので、動作確認用の超簡単サーバ・クライアントを作ってみます。

サーバ

なんか繋がってきたら”someone connect”を表示します。

コメントが無理がある英語なのは、vimで日本語の入力のやり方がわからないからです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
var http=require('http').createServer(handler);
var io= require('socket.io')(http);

// start http server
http.listen(3333,function(){
        console.log("listen 3333");
});

// http handler
function handler(req,res){
        res.end("chat server"); //just response simple string
}

// socket.io connection handler
io.on("connection",function(socket){
        console.log("someone connect"); // heartbeat
});

クライアント

とにかく繋げるだけです。

クライアントはブラウザに実装することが多いようですが、今回はとりあえずnode.jsで作ります。

1
var client=require('socket.io-client')("http://localhost:3333");

Node.js command promptを2つ立ち上げ、かたっぽでサーバ、もう一方でクライアントを実行します。

うまくいくと、

こんな感じに、サーバ側に反応が出ます。

チャットっぽくする

パッケージの動作確認ができたら、あとはチャットっぽい機能を追加します。

サーバ

  • メッセージを受け付ける
  • 来たメッセージを接続されてるクライアントにばらまく

クライアント

  • ユーザーからの入力受付
  • サーバに送信
  • サーバからのメッセージ表示

ができればOKでしょう。

socket.ioでのメッセージの送信はemitでやり、

受信はonハンドラで補足するみたいです。イベント名は自由に設定可能っぽい。

てことでとりあえずチャットっぽくできたのがこちら。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var http=require('http').createServer(handler);
var io= require('socket.io')(http);

// start http server
http.listen(3333,function(){
    console.log("listen 3333");
});

// http handler
function handler(req,res){
    res.end("chat server");     //just response simple string
}

// socket.io connection handler
io.on("connection",function(socket){
    console.log("someone connect");     // heartbeat
    ////////////////////////////
    // properties by socket
    var userName="nanashi";

    //////////////////////////////////////
    // set socket event handlers

    // start chatting
    socket.on("hello",function(user){
        userName=user;
        io.emit("message", "New user joined:" + user);
    });

    // nomal message
    socket.on("say",function(msg){
        console.log(msg);
        io.emit("message",userName + ":" + msg);
    });

});
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var client=require('socket.io-client')("http://localhost:3333");
// param
var userName=process.argv[2];
if( !userName ){
    userName="Nanashi";
}

// create user interface
var ui= require("readline").createInterface({
    input: process.stdin,
    output: process.stdout
});
ui.setPrompt(">>");
ui.prompt();

ui.on('line',function(line){
    //console.log(line);
    //send message
    client.emit("say",line.toString());
    ui.prompt();
});

ui.on('close',function(){
    console.log("bye!");
    process.exit(0);
});

// start chatting
client.emit("hello",userName);

// wait message
client.on("message",function(message){
    console.log(message.toString());
    ui.prompt();
});

サーバ一個とクライアント複数立ち上げればチャット風なことができます。

意外とはまったのがコンソールからの入力を受けるところ、readlineってのを使うのが楽で良いらしい。

自分的にはrubyよりとっつきやすいです。何に使うかは不明。