忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

node.js + socket.io + redis で違うプロセスのnode.jsにpushしてみる

node.jsが複数立ち上がってる状態で、別プロセスやサーバで立ち上がってるnode.jsにも
メッセージをpushしたいなーしたいなーと思ったらredisを使えよという宣託を受けたので
試してみました。

socket.io-redisのインストール
npm install socket.io-redis

サーバ側
var http = require('http').createServer(function(req, res) {
	  res.writeHead(200, {'Content-Type': 'text/html'});
	});

//socket.io読み込み+指定ポートで待ち受け
var socketio = require("socket.io");
var io = socketio.listen(3000);

//socket.io-redis読み込み+socket.ioのアダプタにするために設定
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

//接続したときのイベント
io.sockets.on("connection", function (socket) {
 
	//initイベント発生したら
	socket.on('init', function(req) {
		//渡されてきたreq.roomに指定されたroomに参加
        socket.room = req.room;        
	    socket.join(req.room);
	});	
	
  // メッセージ送信(送信者にも送られる)
  socket.on("sendMessage", function (data) {
	//現在参加しているroomを取得
      var room, name;
      room = socket.room;	  
	  //room内全員に送信(io.sockets.in)
      io.sockets.in(room).emit("pushMessage", {value:data.message});
  });
 
  // ブロードキャスト(送信者以外の全員に送信)
  socket.on("sendMessageByBroadCast", function (data) {
	  //現在参加しているroomを取得
      var room, name;
      room = socket.room;
	  //room内の自分以外に送信(socket.to)
      socket.to(room).emit("pushMessage", {value:data.message});
  });
  
 
});

クライアント側
<!DOCTYPE HTML>
<html>
<head>
	<meta charset="UTF-8">
	<title>node.js + redis test</title>
	
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
	<script src="http://default.vmhost:3000/socket.io/socket.io.js"></script>
	<!-- node.js クライアント -->
	<script type="text/javascript">
	$(function(){
		
	//接続先サーバ
		var socket = io.connect('http://default.vmhost:3000');
		
			//サーバから受け取るイベント
			socket.on("connect", function () {
				socket.json.emit('init', { 'room': 'mogamoga', 'name': "fumofumo" });
			});
			
			//メッセージ受信+書き込み
			socket.on("pushMessage",function(data){
				var messageArea = $(".messageArea").text();
				$(".messageArea").prepend(data.value+"<br>");
			});
			
			//送信(全員)
			$("#sendAll").on("click",function(){
				var message = $(".message").val();
				$(".message").val("");
				socket.emit("sendMessage",{message:message});
			});
			
			//送信(自分以外)
			$("#sendBroadcast").on("click",function(){
				var message = $(".message").val();
				$(".message").val("");
				socket.emit("sendMessageByBroadCast",{message:message});
			});
		});
	</script>
	
</head>

<body>
<div class="messageArea" style="width:600px;height:200px;border:1px solid black; overflow:auto;">
</div>

<input type="text" name="message" class="message"><br>
<input type="button" value="send all" onchange="sendMessage();" id="sendAll">
<input type="button" value="send broadcast" onchange="sendMessageByBroadcast();" id="sendBroadcast">

</body>
</html>


※改行タグ等、エスケープしても有効になってしまうので全角にしている箇所があります。

試す時はredis-serverを起動してから、nodeのサーバ実行します。
上記サンプルのポート指定部分(3000)を3001の物を用意して同時に送受信させてもお互いのデータを受け取れていたので、多分うまくいっているんじゃないかなあと思います。
redisサーバとnode.jsの個々のサーバを全部別に出来れば良かったんだけど、多分大丈夫じゃろ、、、redisのアダプタ部分消してから実行するとメッセージやり取り出来なくなってたから。

つか実験するよりブログに書くのに整形したりする方が時間かかった、、、orz

参考URI
http://qiita.com/n0bisuke/items/c248af316ca3f27daf92
http://jxck.hatenablog.com/entry/20110730/1312042603
http://qiita.com/n0bisuke/items/c248af316ca3f27daf92
PR