问题描述
是否可以在一台事件机器中运行多个服务器?
我的意思是单个客户端连接可以同时使用多个服务。例如,登录服务器对用户进行身份验证,然后用户可以同时使用聊天室和简单的游戏(例如具有单个客户端套接字的跳棋)?
还是每个服务都需要多个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简介(博客文章)