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


ほとんど丸パクリ、オマージュです。