らくがきガレージ
オタライダーの管理人がバイクとかアニメとかゲームの話を垂れ流したり、描いたらくがきをUPしてみたりする、そんなブログ。旧らくがき部隊
node.js + socket.io + redis で違うプロセスのnode.jsにpushしてみる
node.jsが複数立ち上がってる状態で、別プロセスやサーバで立ち上がってるnode.jsにも
メッセージをpushしたいなーしたいなーと思ったらredisを使えよという宣託を受けたので
試してみました。
socket.io-redisのインストール
サーバ側
クライアント側
※改行タグ等、エスケープしても有効になってしまうので全角にしている箇所があります。
試す時は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
メッセージを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
この記事にコメントする
プロフィール
HN:
hiro
性別:
男性
pixivブックマーク
pixivで見つけた素敵画像あれこれ
最新記事
(01/03)
(07/20)
(05/24)
(05/17)
(05/07)
