em-websocket gem with Ruby on Rails

4.5k Views Asked by At

I started developing a web-socket based game using the em-websocket gem.

To test the application I start the server by running

$> ruby server.rb

and then I just open two browsers going directly to the html file (no web server) and start playing.

But now I want to add a web server, some database tables, an other Ruby on Rails based gems.

How an achieve communication between my web-socket server and my Ruby on Rails application? Should they run in the same server and run as a single process? Run in separate servers and communicate through AJAX?

I need to support authentication and other features like updating the database when a game is finished, etc.

Thanks in advance.

3

There are 3 best solutions below

0
On BEST ANSWER

There is an issue created about this:

https://github.com/igrigorik/em-websocket/issues/21

0
On

I am working on a gem that may be helpful with your current use case. The gem is called websocket-rails and has been designed from the ground up to make using WebSockets inside of a Rails application drop dead simple. It is now at a stable release.

Please let me know if you find this helpful or have any thoughts on where it may be lacking.

0
On

Here is the deal. I also wanted to develop a websocket server client with ruby on rails framework. However ruby-on-rails is not very friendly with eventmachine. I have struggeled with having a websocket client, so I managed to copy/cut/paste with from existing lib, and end up with the following two escessential ones.

Em-Websocket server

https://gist.github.com/ffaf2a8046b795d94ba0

ROR friendly websocket client

https://gist.github.com/2416740

have the server code in script directory, the start like the following in ruby code.

    # Spawn a new process and run the rake command
    pid = Process.spawn("ruby", "web_socket_server.rb",
       "--loglevel=debug", "--logfile=#{Rails.root}/log/websocket.log",
        :chdir=>"#{Rails.root}/script") #, 
        :out => 'dev/null', :err => 'dev/null'
    Process.detach pid # Detach the spawned process

Then your client can be used like this

ws = WebSocketClient.new("ws://127.0.0.1:8099/import")
Thread.new() do
  while data = ws.receive()
    if data =~ /cancel/
      ws.send("Cancelling..")
      exit
    end
  end
end
ws.close

I wish there is a good ROR friendly em-websocket client, but couldn't fine one yet.

Once you made server/client works well, auth. and database support must not be very different from other rails code. (I mean having client side with some auth/db restrictions)