socket.io 名前空間ってよくわからん。
動的に名前空間を生成できるらしいんだけど、よくわからんかったので、前もって、ルーム番号を作って、それを渡している。
クライアントから部屋番号が見えてしまうのが問題。
クライアント。面倒なので、ベタ書き。
<?php echo $chatuser; ?> <input id="user"> <input id="css"> <input id="text"> <div id="typing"></div> <script> // Socket.IO Serverに接続する var socket = io.connect("http://localhost:8080"); socket.on('connect', function() { var yourname="<?php echo h($chatuser); ?>"; var yourid="<?php echo h($chatid); ?>"; var yourroom="<?php echo h($chatroom); ?>"; alert("ようこそ"+yourname); console.log(yourname); console.log('connected'); socket.json.emit('init',{'yourname':yourname,'yourid':yourid,'yourroom':yourroom}); $(document).ready(function() { $('#text').keydown(function(event) { // エンターキーで発言をサーバに送信する if (event.keyCode === 13) { // イベント名'all'でメッセージをサーバに送信する socket.emit('all', { action: 'post', user: $('#user').val(), css: $('#css').val(), text: $('#text').val() }); // タイピング中というステータスをサーバに送信する } else { // イベント名'others'でメッセージをサーバに送信する socket.emit('others', { action: 'typing', user: $('#user').val() }); } }); // サーバからのイベント'msg'を受信する socket.on('msg', function(data) { switch (data.action) { case 'post': // 発言の描画 $('<li></li>').text(data.user + ': ' + data.text) .attr('style', data.css) .appendTo('body'); break; case 'typing': // タイピング中ステータスの描画 $('#typing').text(data.user + 'さんがタイピング中です...'); clearTimeout(timer); timer = setTimeout(function() { $('#typing').empty(); }, 3000); break; } }); }); }); </script>
サーバー
var io = require('socket.io').listen(8080); var chat=io.sockets.on('connection',function(socket){ console.log('connected'); socket.on('init',function(req){ //クライアントに各種データをひもづける。 socket.set('yourname',req.yourname); console.log(req.yourname); socket.set('yourid',req.yourid); console.log(req.yourid); socket.set('yourroom',req.yourroom); console.log(req.yourroom); //部屋に入れる。 socket.join(req.yourroom); }); //クライアントからイベントallを受信。イベント名msgでルームの全員に送る。 socket.on('all', function(data){ //紐付けしたデータを引っ張る。 var yourroom,yourname; socket.get('yourroom',function(err,_yourroom){ yourroom=_yourroom; }); socket.get('yourname',function(err,_yourname){ yourname=_yourname; }); chat.to(yourroom).emit('msg',data); }); //同様にして、イベント'others'を受信。自分以外の全てのクライアントに送信 socket.on('others',function(data){ var yourroom,yourname; socket.get('yourroom',function(err,_yourroom){ yourroom=_yourroom; }); socket.get('yourname',function(err,_yourname){ yourname=_yourname; }); //どうやらブロードキャストのメソッドはないっぽい?わからん。 chat.to(yourroom).emit('msg',data); }); });
考えられる解決策。
nodejs側で、DB操作を行う。
ただ、ユーザー認識のためのIDなりデータは渡す必要があると思う。
クエリストリングで部屋番号渡す方法もあるらしいけど、それもセキュアではない気がする……。
あとは、あいてが接続を切ったら部屋から出して、部屋を消してやれば良いのかな。まぁ、どっちにしても、nodejsのサーバー側で、DB操作したほうがすっきりしてる気がする。
うーん。修業が必要。
あと、viewに吐き出される奴を自動でエスケープしてくれる
https://github.com/k1LoW/escape
こんなん見つけた。
いちいちh()するのあれだし、忘れてしまうかもしらんしね。
ruby on railsはデフォでエスケープなのに。
参考
http://d.hatena.ne.jp/hekyou/20111222/p1
http://d.hatena.ne.jp/ngmy/20111009/1318164221
ほとんど丸パクリ、オマージュです。