Несколько серверов в одном реакторе EventMachine - PullRequest
6 голосов
/ 28 мая 2011

Возможно ли запустить несколько серверов на одном компьютере событий?

Я имею в виду, что несколько служб могут одновременно использоваться одним клиентским подключением.Например, сервер входа в систему аутентифицирует пользователя, а затем пользователь может одновременно использовать чат-комнату и простую игру, такую ​​как шашки, с одним клиентским сокетом одновременно?

Или мне нужно несколько реакторов Eventmachine для каждой службы?

1 Ответ

7 голосов
/ 01 июня 2011

Я попробовал это, и оно работает:

#!/usr/bin/env ruby

require 'eventmachine'

module EchoServer
  def post_init
    puts "-- someone connected to the echo server!"
  end
  def receive_data data
    send_data ">>>you sent: #{data}"
    close_connection if data =~ /quit/i
  end
  def unbind
    puts "-- someone disconnected from the echo server!"
  end
end

EventMachine::run {
  EventMachine::start_server "127.0.0.1", 8081, EchoServer
  EventMachine::start_server "127.0.0.1", 8082, EchoServer
  EventMachine::start_server "127.0.0.1", 8083, EchoServer
}

Здесь вы получаете 3 эхо-сервиса с разными портами.(Мне было лень внедрять разные сервисы.)

Итак, очень легко создать огромную мультисервисную оболочку.


Обновление

Простой пример кода для запуска EM-сервера на основе условий:

#!/usr/bin/env ruby
# encoding: utf-8

require 'eventmachine'

module EchoServer
  def post_init
    puts "-- someone connected to the echo server!"
  end
  def receive_data data
    send_data ">>>you sent: #{data}"
    close_connection if data =~ /quit/i
  end
  def unbind
    puts "-- someone disconnected from the echo server!"
  end
end

$check_ok = false

EventMachine::run {
  puts "checker var is: #{$check_ok}"
  EventMachine::start_server "127.0.0.1", 8081, EchoServer
  EventMachine::start_server "127.0.0.1", 8082, EchoServer
  puts "echos on 8081 and 8082 started."

  # periodic timer check - every 1 sec
  EventMachine.add_periodic_timer(1) {
    if $check_ok
      EventMachine::start_server "127.0.0.1", 8083, EchoServer
      $check_ok = false
      puts "echo on 8083 started!"
    end
  }
  # timer triggered after 10 secs - only once!
  EventMachine.add_timer(10) {
    $check_ok = true
    puts "checker var is #{$check_ok} now!"
  }
}

В этом примере эхо-сервер на порту 8083 запускается через 10 секунд после запуска приложения.Попробуйте telnet localhost 8083 до и после этого таймера, вы увидите эффект.

Вы также можете использовать значения менее 1 секунды, например 0,01, для каждых проверок 1/100 секунды.

Этоможет быть вашей отправной точкой для ваших собственных идей.Периодический таймер - это ваш внутренний цикл, где вы подключаете свои условные проверки для запуска дальнейших сервисов.


Хороший учебник (PDF): введение в EventMachine ( сообщение в блоге )

...