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

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

我的意思是单个客户端连接可以同时使用多个服务。 例如,登录服务器对用户进行身份validation,然后用户可以同时使用聊天室和简单游戏(如同一个客户端套接字的检查程序)?

或者我是否需要为每项服务提供多个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/100秒检查也可以使用低于1秒的值,如0.01。

这可能是您自己想法的起点。 周期性计时器是您的内部循环,您可以在其中挂钩您的条件检查以启动其他服务。


好教程(PDF): eventmachine介绍 ( 博客文章 )