Несколько серверов в одном реакторе EventMachine

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

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

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

1 ответ

Решение

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

#!/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 ( сообщение в блоге)

Другие вопросы по тегам