環境
node v0.9.3
express 3.0.4
socket.io 0.9.13
socket.ioの1.0.0がもうすぐ出るらしいところでチャットを試してみた
CentOS5.8にnodebrewでnode.jsをインストール
リファレンス
参考書
socket.io日本語公式
準備
1 2 3 | mkdir mychat cd mychat npm install express socket.io |
node_modulesというディレクトリにライブラリがダウンロードされる
expressはnode.jsのウェブフレームワーク.今回は静的なページを提供するのに使う.
サーバー側~express
まずexpress
app.coffee
1 2 3 4 5 6 7 | express = require 'express' app = express() app.configure -> #express環境設定 app.use express.static "public" #静的なページはpublicに server = app.listen 3000 |
これでpublicディレクトリにindex.htmlを適当につくってcoffee app.coffeeを実行すれば簡易なウェブサーバができる
socket.ioのイベント駆動
onでイベントを受けたときの処理を書いて、emitでイベントを発生させる
これを交互にやり取りする
connectとdisconectとmessageは特別なイベントでその他は自由に名付けてよい
1 2 3 4 5 6 7 | イベントを受けたときの処理 socket.on "イベント", (data) -> 処理 イベントを送る socket.emit "イベント", data 全ソケットに送るときは、サーバから 複数形に注意 io.sockets.emit "イベント", data |
サーバー側~socket.io
1 2 3 4 5 | io.sockets.on "connection", (socket) -> console.log "connected: #{socket.id}" socket.on 'data', (data) -> console.log "data: #{data}" socket.emit 'data', data |
つながったソケットのidをログに流して、dataイベントが送られてきたらdataをログに流してオウム返しする
このidからsocketオブジェクトを作れるのかな?
クライアント側
npmでインストールすると、socket.io/socket.io.jsでライブラリをロードできるようになる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Hello</title> <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> <script type="text/javascript" src="socket.io/socket.io.js"></script> <script type="text/javascript" src="client.js"></script> </head> <body> <input type="text" name="message" id="message"> <input type="submit" id="submit" /> <ul id="messages"> </ul> </body> </html> |
client.coffee(Makeしてclient.jsをつくっておく)
ほんとはサニタイズとかしないと
1 2 3 4 5 6 7 8 9 10 | $ -> sock = io.connect 'http://192.168.1.7:3000' #自分のサーバのアドレス sock.on 'data', (data) -> console.log(data) $('#messages').append("<li>#{data}</li>") $("#submit").click -> message = $('#message').val() console.log message sock.emit 'data', message |
接続者全員にメッセージを流したいので修正
app.coffee
1 | io.sockets.emit 'data', data |
app.coffeeの全部ソース
なんか再現しようとしたらうまく動かなかったので、下のは動いた.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | express = require 'express' app = express() app.configure -> #express環境設定 app.use express.static "public" #静的なページはpublicに server = app.listen 3000 io = require('socket.io').listen server io.sockets.on "connection", (socket) -> console.log "connected: #{socket.id}" socket.on 'data', (data) -> console.log "data: #{data}" io.sockets.emit 'data', data console.log 'Started server' |
情報
stackoverflow.com/questions/12244436/preventing-csrf-for-websockets