ITコンサルの日常

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

gserverでHTTPサーバを作る

http://d.hatena.ne.jp/taka_2/20051219
以前、prototype.jsAjax機能っていうのを試そうと思って、rubyのgserverで簡単なWEBサービスを作ってやろうと考えたのですが、サーバは正しく動いているものの、WEBブラウザ(IE)からアクセスすると、「ページを表示できません。」のエラーになってハマっていました。
その後仕事が激しく忙しくなったため、放置していたのですが、今日久々にトライしてみたら、なんのことはない、クライアントからのリクエストを受け取らずにレスポンスを返そうとしていたためで、単に通信手順を守っていないだけでした。
気づいたきっかけとしては、JavaTomcatにアクセスする簡単な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();
    }
}