是否可以在單個事件機器中運行多個服務器?單個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, 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 introduction(blog post)
謝謝,對我而言,這意味着如果需要,您不能在運行時添加更多服務器。那是對的嗎? – david 2011-06-07 15:20:44
不會說這是不可能的。你可以實現一個循環,然後你可以在運行時添加服務 - 但這需要在eventmachine中進行更深入的研究。在這種情況下,有用的可能是'EM.add_periodic_timer',如果某個條件滿足並且必須啓動一個新的EM服務器,則每x秒檢查一次,但尚未測試。 – asaaki 2011-06-07 16:00:09
查看更新後的答案,您可以在運行時啓動服務時獲得第一個想法。 – asaaki 2011-06-07 16:33:33
如果協議是明確的,你應該能夠在一個服務器進程中運行數千種不同的服務,我期望。 – sarnold 2011-05-27 23:20:00