gserverでHTTPサーバを作る
http://d.hatena.ne.jp/taka_2/20051219
以前、prototype.jsのAjax機能っていうのを試そうと思って、rubyのgserverで簡単なWEBサービスを作ってやろうと考えたのですが、サーバは正しく動いているものの、WEBブラウザ(IE)からアクセスすると、「ページを表示できません。」のエラーになってハマっていました。
その後仕事が激しく忙しくなったため、放置していたのですが、今日久々にトライしてみたら、なんのことはない、クライアントからのリクエストを受け取らずにレスポンスを返そうとしていたためで、単に通信手順を守っていないだけでした。
気づいたきっかけとしては、JavaでTomcatにアクセスする簡単なSocketクライアントを実装したときに、応答が返ってこなかったので、「ああ、そういえばリクエスト送ってないわ」ってところから、リクエストを受け取ってないことに気づきました。なんとも間抜けな。。
ちなみにこんなコードになりました。
require 'gserver' # # Hello, World! なHTTPサーバ # class HelloHTTPServer < GServer def initialize(port=10001, *args) super(port, *args) end def serve(io) io.gets() io.puts("HTTP/1.0 200 OK") io.puts("") io.puts("Hello, World!!") end end # ログを取る設定でサーバをスタートします。 server = HelloHTTPServer.new server.audit = true server.start while(true) sleep(5) end
最後のsleepの部分は、以前このブログに指摘していただいたように、whileループを取っ払ってsleep()でも良いのですが、Ctrl+Cの割り込みを受け付けないようなので、あえてwhileループにしてみました。これってそういうもんなんでしょうかねぇ。
ちなみにJavaクライアントはこんなん。いい加減です。
package exam; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class SocketTest { public static void main(String[] args) throws Exception { Socket s = new Socket("localhost", 8084); OutputStream o = s.getOutputStream(); o.write("GET / HTTP/1.0\r\n\r\n".getBytes()); o.flush(); InputStream i = s.getInputStream(); int data; while ((data = i.read()) != -1) { //System.out.println((char)data + " / " + data); System.out.print((char)data); } i.close(); s.close(); } }