CORRECTION:
具体来说,我希望从Ruby on Rails控制器启动和停止EventMachine(EM)。
(我被告知'瘦'会对此有用。)
注意:
此EM服务器与运行Ruby on Rails应用程序的Mongrel服务器是SEPARATE。 (EM服务器正在接受来自Arduino微控制器的连接。)
运行'Thin'作为服务器..我应该能够接受HTTP请求和Arduino的连接。
# Starts Server
def start_control_server
EventMachine::run {
@EchoServer = EventMachine::start_server "0.0.0.0", 40013, EchoServer
}
end
# Attempts ( fails ) to stop server
def stop_control_server
EventMachine.stop_server(@EchoServer)
end
如果您推荐其他服务器而不是直接使用EventMachine,请提供代码以执行上述代码。
此处提供完整的控制器代码:http://pastie.org/1698383
答案 0 :(得分:1)
我猜你没有在另一个控制器方法中调用start_control_server和stop_control_server。这意味着当您调用stop时,您的实例变量(@EchoServer)将不存在。
一种解决方案可能是在会话中存储从start_server返回的id。如在
def start_control_server
session[:em_server_id] = EventMachine::start_server "0.0.0.0", 4000, EchoServer
end
def stop_control_server
EventMachine.stop_server(session[:em_server_id]) if session[:em_server_id]
session[:em_server_id] = nil
end
此外,如果您使用thin运行rails应用程序,那么您已经在事件机器循环中,因此您不需要调用EventMachine :: run。调用EventMachine.stop_server似乎不会断开已连接的任何内容,但会阻止任何进一步的连接建立到指定的端口。
希望有一些用处!