Created
January 14, 2011 03:49
-
-
Save andoriyu/779142 to your computer and use it in GitHub Desktop.
Event Machine telnet-chat with Fibers.
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 'rubygems' | |
| 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