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) が存在しないことを意味します。

1 つの解決策は、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 ループ内にいるため、EventMachine::run を呼び出す必要はありません。EventMachine.stop_server を呼び出しても、既に接続されているものは切断されないように見えますが、指定されたポートへのそれ以上の接続は確立されません。

それが何かの役に立てば幸いです!

于 2011-04-01T13:21:18.117 に答える