NodeとExpress3とSocket.IOでチャット

ようやく、Express3でチャットサンプルを動作させることができたのでメモる。

Express3では、Socket.ioまわりの扱いが変更になっているので注意。

 

動作環境

OS: CentOS6.3 64bit

Node.js: v0.8.12

Express: 3.0.0rc5

Socket.io: 0.9.10

 

Expressアプリを作成する。

テンプレートエンジンは、ejsを使用する。

# express -e chatdemoapp

 

Socket.IOをインストールする。

# cd chatdemoapp

# npm install socket.io

 

依存関係を解決する。

# npm install -d

 

app.jsを修正してサーバ側を実装する。

app.js

 var express = require('express')

  , routes = require('./routes')

  , user = require('./routes/user')

  , http = require('http')

  , path = require('path');

 

var app = express();

 

app.configure(function() {

  app.set('port', process.env.PORT || 3000);

  app.set('views', __dirname + '/views');

  app.set('view engine', 'ejs');

  app.use(express.favicon());

  app.use(express.logger('dev'));

  app.use(express.bodyParser());

  app.use(express.methodOverride());

  app.use(app.router);

  app.use(express.static(path.join(__dirname, 'public')));

});

 

app.configure('development', function(){

  app.use(express.errorHandler());

});

 

// index.ejsで変数portが参照できるように変更

// app.get('/', routes.index);

app.get('/', function(req, res) {

  res.render('index', { locals: { port: app.get('port') } });

});

 

app.get('/users', user.list);

 

// ここを変更

//http.createServer(app).listen(app.get('port'), function(){

//  console.log("Express server listening on port " + app.get('port'));

//});

var server = http.createServer(app).listen(app.get('port'), function(){

  console.log("Express server listening on port " + app.get('port'));

});

 

// ここからSocket.IO周りの実装を追加 =====>

// Express3では、Http.ServerインスタンスをSocket.IOにアタッチしないとだめみたい

// 参照:http://socket.io/#how-to-use

var io = require('socket.io').listen(server);

io.sockets.on('connection', function(socket) {

  console.log('connect');

  socket.on('message', function(msg) {

    socket.emit('message', msg);

    socket.broadcast.emit('message', msg);

  });

  socket.on('disconnect', function() {

    console.log('disconnect');

  });

});

// <===== ここまで

 

// ここ追加

console.log('Server running at http://localhost:' + app.get('port') + '/');

  

views/index.ejsを修正してクライント側を実装する。

サーバ側でSocket.IOをListenできてれば、クライアントは、/socket.io/socket.io.js

でSocket.IOを参照できるようになる。

 

views/index.ejs

<!DOCTYPE html>

<html>

  <head>

    <title>hoge</title>

        <script type="text/javascript" src="https://www.google.com/jsapi"></script>

        <script type="text/javascript">google.load("jquery", "1.4.4");</script>

        <script type="text/javascript" src="/socket.io/socket.io.js"></script>

        <script type="text/javascript">var port = <%= port %>;</script>

        <script type="text/javascript" src="/javascripts/client.js"></script>

    <link rel='stylesheet' type="text/css" href='/stylesheets/style.css' />

  </head>

  <body>

        <form action="" id="form">

          <input type="text" name="message" id="message" />

          <input type="submit" />

        </form>

        <hr />

        <dl id="list"></dl>

  </body>

</html>

 

クライアント用のJavaScriptファイルを新規作成する。

public./javascripts/client.js

 $(function() {

    var socket = io.connect(null, { port: port });

    socket.on('connect', function() {

        console.log('connect');

    });

    socket.on('message', function(msg) {

        var date = new Date();

        $('#list').prepend($('<dt>' + date + '</dt><dd>' + msg + '</dd>'));

    });

    socket.on('disconnect', function() {

        console.log('disconnect');

    });

 

    $('#form').submit(function() {

        var message = $('#message');

        socket.send(message.val());

        message.attr('value', '');

        return false;

    });

});

 

サーバを起動する。

# node app.js

 

クライアントから接続する。

ブラウザから、

にアクセスすればOK