4

更正:

具体来说,我希望从 Ruby on Rails 控制器启动和停止EventMachine (EM)。

(有人告诉我,'Thin' 可以很好地解决这个问题。)

笔记: 这个 EM 服务器与运行 Ruby on Rails 应用程序的Mongrel服务器是分开的。(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

4

1 回答 1

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 似乎不会断开任何已连接的连接,但会阻止与指定端口建立任何进一步的连接。

希望这有一些用处!

于 2011-04-01T13:21:18.117 回答