86
84

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RubyAdvent Calendar 2013

Day 16

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

Last updated at Posted at 2013-12-16

カヤックさんの新卒研修を読んで 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

86
84
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
84

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?