1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
$: << 'C:\M1\Merlin\Main\Languages\Ruby\Libs'
require 'socket'
require 'fcntl'
require 'thread'
class WebServer
def initialize
@tokens = SizedQueue.new(5)
5.times{ @tokens.push(nil) }
end
def run
thgroup = ThreadGroup.new
@status = :Running
@listeners = [TCPServer.new("127.0.0.1", 3000)]
while @status == :Running
puts "#{Thread.current.inspect}: waiting"
if svrs = IO.select(@listeners, nil, nil, 2.0)
puts "#{Thread.current.inspect}: selected #{svrs[0]}"
svrs[0].each{|svr|
@tokens.pop # blocks while no token is there.
if sock = accept_client(svr)
th = start_thread(sock)
th[:WEBrickThread] = true
thgroup.add(th)
else
@tokens.push(nil)
end
}
end
end
end
def accept_client(svr)
puts "#{Thread.current.inspect}: accept_client #{svr}"
sock = nil
sock = svr.accept
puts "#{Thread.current.inspect}: accepted #{sock}"
sock.sync = true
return sock
end
def start_thread(sock, &block)
Thread.start{
Thread.current[:WEBrickSocket] = sock
addr = sock.peeraddr
puts "#{Thread.current.inspect}: working, peer = #{addr.inspect}"
@tokens.push(nil)
Thread.current[:WEBrickSocket] = nil
puts "#{Thread.current.inspect}: close, peer = #{addr.inspect}"
sock.close
}
end
end
WebServer.new.run
|