railsからsocket.ioへemitする
はじめに
今回やりたかったことは、railsサーバーからsocket.ioにつないでいるブラウザにemitしてメッセージを送るとういこと。ちょっと調べたら「socket.io-ruby-emitter」というgemがあったのでこれつかったらいけた。
で、環境としては以下。
・railsサーバー
・socket.ioサーバー
・redisのpub/subを使用
redisのインストール
【socket.io】複数サーバーへの対応メモ - とりあえずphpとか
ここに書いたとおり。
rails
socket.io-emmiterをインストール
Gemfile
・・・ gem 'socket.io-emitter'
class SampleController < ApplicationController def index @emitter = SocketIO::Emitter.new( redis: Redis.new( :host => 'redis host', :port => 'redis port' ) ) @emitter.emit("server2client", {value:'message from rails'}) render :text => 'OK' end end
socket.io
socket.ioインストール
$ npm install socket.io sockt.io-redis
server.js
var io = require("socket.io").listen(3000); var redis = require("socket.io-redis"); io.adapter(redis({ host: "redis host", port: "redis port" })); io.sockets.on("connection", function(socket) { socket.on("client2server", function(data) { socket.broadcast.emit("server2client", data); }); });
html
<input type="text" id="text" /> <input type="button" value="send" onclick="send();"/> <div id="messages"></div> <script src="/node_modules/socket.io-client/dist/socket.io.js"></script> <script> var web = "socket.io host"; var socket = io.connect("http://" + web + ":3000/"); function send() { var value = document.getElementById("text").value; socket.emit("client2server", { "value": value }); } socket.on("server2client", function(data) { var messages = document.getElementById("messages"); var text = document.createTextNode(data.value); messages.appendChild(text); }); </script>
はまったところとしては、rails → ブラウザなの、上記の例だとでrailsからはserver2clientをemitしなくてはならないところがわかりずらかった。
「redis-cli monitor」で、各クライアントがどのようにpublishしてきているかを見ながらやるといいかも。以上です。