Rubyでサーバを作ってクライアントにデータを配信 vol.4
スレッドなどでそれぞれ待ち受けるという手もありますが、 IOの入出力を待つ手段としては一般的ではないようです。 IOの動きを監視して待ち受け、動きがあったら場合分けをして 処理をするのが一般的なようです。 これをReactorパターンといいます。 IO.selectで配列を引数に入れると、 引数で入れたものに動きがあるまで待ち続けます。 動きがあると、次のステップに進むので、そこで場合分けをして処理をします。
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 clients.each do |client| client.puts str.upcase end 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
いくつも同時に接続して、配信可能です。