ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

gserverを試す

上の続きなのですが、prototype.jsAjaxな機能を試すのに、サーバサイドをどうしようかと考えていました。僕が電車内の勉強のお供に使っているノートPCにはJavaRubyの環境しかないので、「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