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ではここまで検証をしたかったので一旦終了。