Ruby 单个EventMachine反应器中的多个服务器

Ruby 单个EventMachine反应器中的多个服务器,ruby,eventmachine,Ruby,Eventmachine,是否可以在单个事件机中运行多个服务器 我的意思是,一个客户端连接可以同时使用多个服务。例如,登录服务器对用户进行身份验证,然后用户可以同时使用聊天室和一个简单的游戏,如跳棋和一个客户端套接字 或者每个服务都需要多个eventmachine反应器 我试过这个,效果很好: #!/usr/bin/env ruby require 'eventmachine' module EchoServer def post_init puts "-- someone connected to th

是否可以在单个事件机中运行多个服务器

我的意思是,一个客户端连接可以同时使用多个服务。例如,登录服务器对用户进行身份验证,然后用户可以同时使用聊天室和一个简单的游戏,如跳棋和一个客户端套接字


或者每个服务都需要多个eventmachine反应器

我试过这个,效果很好:

#!/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个不同端口的echo服务。(我懒得实现不同的服务。)

因此,构建一个巨大的多服务包装器非常容易


更新

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上的echo服务器在应用程序启动后约10秒启动。在这个计时器之前和之后尝试
telnet localhost 8083
,您将看到效果

您还可以使用小于1秒的值,如每1/100秒检查0.01

这可能是你自己想法的起点。定期计时器是您的内部循环,您可以在其中挂接条件检查以启动进一步的服务



好的教程(PDF):()

如果协议明确,我希望您能够在一个服务器进程中运行数千个不同的服务。谢谢,这意味着如果需要,您不能在运行时添加更多服务器。对吗?我不会说这是不可能的。您可以实现一个循环,然后允许在运行时添加服务,但这需要在eventmachine中进行更深入的研究。在这种情况下有帮助的可能是
EM。添加_periodic_timer
以每x秒检查一次是否满足某个条件,并且必须启动一个新的EM服务器,但尚未测试。查看更新的答案,在这里您对服务的运行时启动有了第一个想法。感谢您的帮助。我将进一步研究它,但我认为IO::Reactor对我来说可能是一个更好的解决方案。