socketライブラリを使ってwebサーバーを作ってみる

  • 73
    Like
  • 0
    Comment
More than 1 year has passed since last update.

カヤックさんの新卒研修を読んで telnetnc -l を使ってwebサーバ/ブラウザごっこをやってみたのですが、1人でやってると役割の切り替えがダルくなってきたので、本当の基礎からのwebアプリケーション入門を見ながらrubyで簡単なwebサーバを作ってみました。

参考
http://www.geekpage.jp/programming/ruby-network/
http://drascal.blog133.fc2.com/blog-entry-219.html

  • v1 TCPクライアントからの接続を受け付けられるようにする
tcp_server.rb
require "socket"

server = TCPServer.open(8001)

while true
  socket = server.accept

  while buffer = socket.gets
    p buffer
  end

  socket.close
end

server.close

  • v2 レスポンスを返すようにする、アクセス元の情報(peeraddr)を取得する
tcp_server.rb
require "socket"

port = 8001
server = TCPServer.open(port)

while true
  socket = server.accept

  # IPSockt#peeraddr
  # 接続相手先ソケットの情報を表す配列を返す
  # [アドレスファミリ, port番号, ホストを表す文字列, IPアドレス]
  # アドレスファミリについて
  # http://www.geekpage.jp/programming/winsock/addressfamily.php
  p socket.peeraddr

  while buffer = socket.gets
    p buffer

    # response
    socket.puts "200"
  end

  socket.close
end

server.close

  • v3 マルチスレッド化して複数のクライアントからのレスポンスを返せるようにする
tcp_server.rb
require "socket"

port = 8001
server = TCPServer.open(port)

while true
  Thread.start(server.accept) do |socket|
    p socket.peeraddr

    while buffer = socket.gets
      p buffer
      socket.puts "200"
    end

    socket.close
  end
end

server.close

  • v4 index.htmlを返す
tcp_server.rb
require "socket"

port = 8001
server = TCPServer.open(port)

def read_html
  File.open("index.html") do |f|
    f.read
  end
end

while true
  Thread.start(server.accept) do |socket|
    p socket.peeraddr

    request = socket.gets
    p request

    if request.include? "GET"
      content = read_html
      socket.write <<-EOF
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: rserver
Connection: close

#{content}
      EOF
    end

    socket.close
  end
end

server.close
index.html
<html>
  <head>
    <title>server</title>
  </head>
  <body>
    <h1>うごいてるよ!</h1>
  </body>
</html>

  • ブラウザから

v5.png