2011-05-27 29 views
6

是否可以在單個事件機器中運行多個服務器?單個EventMachine反應器中的多個服務器

我的意思是多個服務可以同時使用一個客戶端連接。例如,登錄服務器對用戶進行身份驗證,然後用戶可以同時使用單個客戶端套接字同時使用聊天室和簡單遊戲(如跳棋)?

或者是否需要爲每個服務提供多個事件機器反應器?

+0

如果協議是明確的,你應該能夠在一個服務器進程中運行數千種不同的服務,我期望。 – sarnold 2011-05-27 23:20:00

回答

7

我想這和它的工作:

#!/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個迴音服務。 (我懶得實現不同的服務。)

因此,構建一個巨大的多服務包裝器非常容易。


更新

簡單的代碼示例爲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回聲服務器啓動〜應用程序開始後10秒。在這個計時器之前和之後嘗試telnet localhost 8083,你會看到效果。

您還可以使用小於1秒的值,例如每1/100秒檢查0.01。

這可能是您自己想法的起點。週期性計時器是您的內部循環,您可以在其中勾選用於啓動進一步服務的條件檢查。


很好的教程(PDF):eventmachine introductionblog post

+0

謝謝,對我而言,這意味着如果需要,您不能在運行時添加更多服務器。那是對的嗎? – david 2011-06-07 15:20:44

+0

不會說這是不可能的。你可以實現一個循環,然後你可以在運行時添加服務 - 但這需要在eventmachine中進行更深入的研究。在這種情況下,有用的可能是'EM.add_periodic_timer',如果某個條件滿足並且必須啓動一個新的EM服務器,則每x秒檢查一次,但尚未測試。 – asaaki 2011-06-07 16:00:09

+0

查看更新後的答案,您可以在運行時啓動服務時獲得第一個想法。 – asaaki 2011-06-07 16:33:33