-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathserver.rb
executable file
·64 lines (51 loc) · 1.68 KB
/
server.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#! /usr/bin/ruby
# redis server command
# /usr/local/bin/redis-server ~/.redis_conf &
# EM server command
# ./server.rb
require 'rubygems'
require "bundler/setup"
require 'eventmachine'
require 'em-websocket'
require 'em-hiredis'
require 'sinatra/base'
require 'thin'
require 'json'
@sockets = []
class DemoApp < Sinatra::Base
get '/' do
send_file File.join(settings.public_folder, 'index.html')
end
end
EventMachine.run do
EventMachine::WebSocket.start(:host => '0.0.0.0', :port => 8080) do |socket|
socket.onopen do
@sockets << socket
@sockets.each{ |s| s.send( { :type => :Connect, :data => "#{@sockets.size} clients connected"}.to_json ) }
end
socket.onmessage do |mess|
puts "Message received: #{mess}, sockets: #{@sockets.size}"
# send to all sockets except the one that sent the message
@sockets.each{ |s| next if s == socket; s.send( { :type => :Message, :data => mess }.to_json ) }
end
socket.onclose do
@sockets.delete socket
@sockets.each{ |s| s.send( { :type => :Connect, :data => "#{@sockets.size} clients connected"}.to_json ) }
end
end
redis = EM::Hiredis::PubsubClient.new
redis.connect
redis.errback do |code|
puts "Error code: #{code}"
end
redis.subscribe("change")
redis.subscribe("chat").callback do # |type, channel, message|
puts "Subscribed to chat and change channels"
end
redis.on(:message) do |channel, message|
puts "message on #{channel}: #{message}"
@sockets.each{ |s| s.send( { :type => channel, :data => message}.to_json ) }
end
puts ">> WebSocket server listening on 0.0.0.0:8080"
Thin::Server.start DemoApp, '0.0.0.0', 4000, signals: false
end