Slide 28
Slide 28 text
listener = Actor::TCP.listen(HOST, PORT, :filter => :line)
puts "Listening on #{HOST}:#{PORT}"
# The main loop handles incoming connections
loop do
# Spawn a new actor for each incoming connection
Actor.spawn(listener.accept) do |sock|
puts "#{sock.remote_addr}:#{sock.remote_port} connected"
# Connection handshaking
begin
sock.write "Please enter a nickname:"
nickname = sock.read
server << T[:register, Actor.current, nickname]
# Flip the socket into asynchronous "active" mode
# This means the Actor can receive messages from
# the socket alongside other events.
sock.controller = Actor.current
sock.active = :once
# Main message loop
loop do
Actor.receive do |filter|
filter.when(T[:tcp, sock]) do |_, _, message|
server << T[:say, Actor.current, message]
sock.active = :once
end