Skip to content

Instantly share code, notes, and snippets.

@andoriyu
Created May 1, 2011 08:11
Show Gist options
  • Select an option

  • Save andoriyu/950343 to your computer and use it in GitHub Desktop.

Select an option

Save andoriyu/950343 to your computer and use it in GitHub Desktop.
require 'eventmachine'
class Connection < EventMachine::Connection
attr_accessor :fiber, :name
def initialize
# FYI: Этот метод вызывается когда инициируется новый коннект
# Создаем для каждого нового коннекта свой Fiber
# Каждому fiber надо дать метод
# В нашем случаее это poll
@fiber = Fiber.new { poll }
@name = nil
end
def post_init
# Этот метод вызывается после того как прошла инициализация
# Создаем массив кликнтов
(@@connections ||= []) << self
# Возобновляем fiber
@fiber.resume
end
def poll
#Этот метод используется внутри fiber
# Выводимпервую строчку
send_data( "What is your name?" )
# Тут мы используем магию о которой я не знал, до того как начал капать
# Мы присваиваем @name зачение которое будет передано вместе с возобовлением
# Тут же мы останаливаем fiber
@name = Fiber.yield
# Отправляем еще одно сообщение клиенту
send_data( "OK, your name is #{@name}\n")
# Начинаем бесконечный цикл
loop do
# Точно такая же магия как и раньше
msg = Fiber.yield
# Посылаем каждому клиенту то, что сказал текущий клиент
@@connections.each do |conn|
conn.send_data( "#{@name} said: #{msg}\n")
end
end
end
def receive_data( data )
# Каждый раз когда от клиента приходит сообщение мы возобнавляем наш fiber
# и передаем ему сообщение
@fiber.resume data.strip
end
end
EventMachine.run do
# Запускаем tcp сервер на 2000 порту
EM.start_server "0.0.0.0", 2000, Connection
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment