gserverを試す
上の続きなのですが、prototype.jsのAjaxな機能を試すのに、サーバサイドをどうしようかと考えていました。僕が電車内の勉強のお供に使っているノートPCにはJavaとRubyの環境しかないので、「Javaで作るのは面倒だけど、Rubyでは簡単に作れそうにないなぁ。」というのが最初の印象でした。
でも、やっぱりJavaで作るのは面倒だったので、Rubyのリファレンスを適当に見ていたところ、「添付ライブラリ」の項に「gserver Ruby Generic Server ruby 1.8 feature」ってのがありました。
これだー!と思ってサンプルを見てみたところ、簡単そうだったのでこれでやることにしました。
以下、掲載サンプルを引用
# # 1970年からの経過時間を秒で返すサーバの例です。 # class TimeServer < GServer def initialize(port=10001, *args) super(port, *args) end def serve(io) io.puts(Time.now.to_i) end end # ログを取る設定でサーバをスタートします。 server = TimeServer.new server.audit = true # Turn logging on. server.start # まだサーバが動いているかを確認してみましょう。 GServer.in_service?(10001) # -> true server.stopped? # -> false # サーバを止めます。 server.shutdown # すぐさまサーバを止めることもできます。 GServer.stop(10001) # もちろん server.stop でも可能です。
が、しかし、サーバなのに、載っているサンプルが起動してすぐ終了しちゃうというなんともアレゲなものだったので、stopするのをやめてgetsするように書き換えました。
# # 1970年からの経過時間を秒で返すサーバの例です。 # class TimeServer < GServer def initialize(port=10001, *args) super(port, *args) end def serve(io) io.puts(Time.now.to_i) end end # ログを取る設定でサーバをスタートします。 server = TimeServer.new server.audit = true # Turn logging on. server.start gets
ところが、このプログラムでは、Telnetでリクエストしても、Webブラウザでリクエストしても一向にレスポンスが返ってこないことにしました。そこで少し考えて、getsをループで回してqが入力されたらサーバを終了という風に書き換えました。
すると、たまに(?)クライアントからのリクエストを受け付け、正しくレスポンスを返すようになりました。
というわけで、なんとなくgetsで待っていたらダメっぽいことが判明したので、最終的にプログラムを以下のように書き換えたところ、即時にレスポンスを返すようになりました。が、なんか負荷かかりそうな予感。全く正しい気がしません。。
require 'gserver' # # 1970年からの経過時間を秒で返すサーバの例です。 # class TimeServer < GServer def initialize(port=10001, *args) super(port, *args) end def serve(io) io.puts(Time.now.to_i) end end # ログを取る設定でサーバをスタートします。 server = TimeServer.new server.audit = true server.start # すごい勢いで(?)回り続けます。 while(true) end