Skip to content

Instantly share code, notes, and snippets.

@alexspeller
Created September 7, 2013 12:19
Show Gist options
  • Save alexspeller/6475123 to your computer and use it in GitHub Desktop.
Save alexspeller/6475123 to your computer and use it in GitHub Desktop.
require 'bundler/setup'
Bundler.require
# Gem versions:
# celluloid (0.15.1)
# celluloid-io (0.15.0)
# nio4r (0.5.0)
# timers (1.1.0)
class Server
attr_reader :users
include Celluloid::IO
include Celluloid::Logger
finalizer :shutdown
trap_exit :actor_died
def initialize
@users = []
@server = TCPServer.new '0.0.0.0', 1024
@server.listen 10
async.start
end
def start
info "listening on port 1024"
loop { handle_connection @server.accept }
end
def handle_connection socket
user = User.new_link socket
users.push user
end
def actor_died(actor, reason)
p "#{actor.inspect} has died because of a #{reason.class}"
end
def shutdown
@server.close
end
end
class User
class CrashyError < StandardError; end
attr_reader :socket
include Celluloid::IO
include Celluloid::Logger
finalizer :close_connection!
def initialize socket
@socket = socket
info "New user connected"
async.start
end
def start
info "Starting main loop"
# command = readline.other_method_that_does_not_exist
loop do
command = socket.gets.strip
info "Received command #{command}"
case command
when "crash"
raise CrashyError
when "exit"
terminate
else
# echo
socket.puts command
end
end
end
def server
Actor[:server]
end
def close_connection!
info "Closing connection"
socket.close
server.users.delete current_actor
info "Removed user from user list"
end
end
class SupervisionGroup < Celluloid::SupervisionGroup
supervise Server, as: :server
end
SupervisionGroup.run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment