Created
September 7, 2013 12:19
-
-
Save alexspeller/6475123 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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