Rubyでサーバを作ってクライアントにデータを配信 vol.6

vol.5のように時間がかかる処理があると待たされてしますので、 それを解決したコードが次のコードです。

require "socket"

port = if ARGV[0] then ARGV[0] else 'echo' end
gate = TCPServer.open(port)

sockets = [gate, STDIN]
clients = []
loop do
  r_sockets = IO.select(sockets+clients)[0]
  r_sockets.each do |socket|
    case socket
    when STDIN
      str = socket.gets
      threads = []
      clients.each do |client|
        threads << Thread.new do
          client.puts str.upcase
          sleep 2
        end
      end
      threads.each{|t|t.join}
    when TCPServer
      client = socket.accept
      clients << client
      p clients
    when TCPSocket
      unless socket.eof?
        str=socket.gets
        socket.puts str.upcase
      else
        socket.close
        clients.delete(socket)
        p clients
      end
    end
  end
end

gate.close

スレッドを使って次々と並列して処理を開始し、最後にjoinで処理が全て終了するのを待ちます。

とりあえずRubyではここまで検証をしたかったので一旦終了。