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

问题描述

是否可以在一台事件机器中运行多个服务器? 我的意思是单个客户端连接可以同时使用多个服务。例如,登录服务器对用户进行身份验证,然后用户可以同时使用聊天室和简单的游戏(例如具有单个客户端套接字的跳棋)? 还是每个服务都需要多个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,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\",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\",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!\"
  }
}
在此示例中,在应用程序启动后约10秒启动了端口8083上的回显服务器。尝试将此计时器前后的
telnet localhost 8083
,您将看到效果。 对于每1/100秒的检查,您也可以使用小于1秒的值,例如0.01。 这可能是您提出自己想法的起点。定期计时器是您的内部循环,您可以在其中挂接条件检查以启动其他服务。 好的教程(PDF):eventmachine简介(博客文章)