Websocket on Rails
-
Upload
jeroen-rosenberg -
Category
Technology
-
view
8.106 -
download
0
description
Transcript of Websocket on Rails
![Page 1: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/1.jpg)
Websocket on railsBuilding realtime webapps
![Page 2: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/2.jpg)
![Page 3: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/3.jpg)
I'm a Java Developer who likes to ride the rails!
![Page 4: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/4.jpg)
The future is now!
![Page 5: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/5.jpg)
What's so great about Websocket?
![Page 6: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/6.jpg)
HTTP is half-duplex
![Page 7: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/7.jpg)
Asynchronous full-duplex communicationWebsocket is asynchronous & full-duplex
![Page 8: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/8.jpg)
So, a little less of this...
![Page 9: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/9.jpg)
So instead of this...
Or this...
![Page 10: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/10.jpg)
Or this...
![Page 11: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/11.jpg)
You tell me... what's new?
![Page 12: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/12.jpg)
Push
![Page 13: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/13.jpg)
So, how to ride the rails with this?
![Page 14: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/14.jpg)
Introducing websocket-rails
1. echo "gem 'thin'" >> Gemfile2. echo "gem 'websocket-rails'" >> Gemfile3. bundle install4. rails g websocket_rails:install
![Page 15: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/15.jpg)
![Page 16: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/16.jpg)
Ruby eventmachine
![Page 17: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/17.jpg)
![Page 18: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/18.jpg)
Map events to controller actions
WebsocketRails::EventMap.describe do # You can use this file to map incoming events to controller actions. # One event can be mapped to any number of controller actions. The # actions will be executed in the order they were subscribed. namespace :rsvp do subscribe :new, :to => RsvpController, :with_method => :rsvp endend
![Page 19: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/19.jpg)
Use rails-like controllers
class RsvpController < WebsocketRails::BaseController def initialize_session # initialize application scoped variables here @rsvp_yes_count = 0 end
def rsvp @rsvp_yes_count += 1 if message broadcast_message :new_rsvp, @rsvp_yes_count endend
![Page 20: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/20.jpg)
Trigger and bind to events in the client
$ -> dispatcher = new WebSocketRails('localhost:3000/websocket')
dispatcher.on_open = (data) -> console.log "Connection has been established: #{data}"
$('#rsvp_yes').bind 'click', (message) => dispatcher.trigger 'rsvp.new', true
dispatcher.bind 'new_rsvp', (rsvp_yes_count) => $('#rsvp_yes_count').html rsvp_yes_count
![Page 21: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/21.jpg)
Broadcast to anyone out there, or...
![Page 22: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/22.jpg)
...only push to whom is interested
![Page 23: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/23.jpg)
Use complex messages and channels (1)
class RsvpController < WebsocketRails::BaseController ... def rsvp @rsvp_yes_count += 1 if message[:attending] rsvp = { :yes => @rsvp_yes_count } WebsocketRails[:rsvp].trigger 'new', rsvp endend
![Page 24: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/24.jpg)
Use complex messages and channels (2)
$ -> dispatcher = new WebSocketRails('localhost:3000/websocket')
$('#rsvp_yes').bind 'click', (message) => rsvp = attending: true dispatcher.trigger 'rsvp.new', rsvp
channel = dispatcher.subscribe 'rsvp' channel.bind 'new', (rsvp) => $('#rsvp_yes_count').html rsvp.yes
![Page 25: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/25.jpg)
Dem
o
![Page 26: Websocket on Rails](https://reader036.fdocuments.net/reader036/viewer/2022081505/555a278cd8b42ab3088b4b3d/html5/thumbnails/26.jpg)
References
Websocket spec● http://dev.w3.org/html5/websockets/
Websocket-rails project page● http://danknox.github.com/websocket-rails/
My project● https://github.com/jeroenr/followup
Ruby eventmachine● http://rubyeventmachine.com/