我尝试过这个并且它有效:
#!/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 服务。 (我懒得实现不同的服务。)
因此,构建一个巨大的多服务包装器非常容易。
Update
基于条件启动 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):事件机器介绍 (博客文章)