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してきているかを見ながらやるといいかも。以上です。