|
setup diary |
require 'socket' require 'thread' q=SizedQueue::new(3) s=TCPServer.new(12344) Thread.start(s.accept){|cl| begin q.push(0) cn=cl.peeraddr.join(":") print "%s is accepted as %d/%d connection.\n"%[cn,q.size,q.max] cl.each{|cmd| cmd=cmd.strip str=case cmd when "status" (rand(2)>0)?"good":"bad" when "color" ["red","green","blue"][rand(3)] else "unknown command" end cl.puts "BEGIN" cl.puts str cl.puts "END" } #rescue Errno::ECONNABORTED ensure cl.close q.pop print "%s is closed remaining %d/%d connections.\n"%[cn,q.size,q.max] end } while trueエラーの処理とQueueを使ってアクセス数の管理を加えた。それから、BEGINとENDで囲むことによって、複数の行のやりとりをするようにした。この部分の処理をクライアント側でもする必要があって、
require "socket" END{ print "connection is closed.\n" } s=TCPSocket.open("localhost",12344) loop{ s.write(["status","color","unknown"][rand(3)]+"\n") begin p s.gets exit unless $_ end until $_=~/^END/ sleep 0.5 }とした。接続が切られたときにはgetsだとnilが返るので、そこで終了することにして、ENDの処理が行われる。この部分はreadlineで受けてエラーをrescueした方が良いかも。 これで、測定系をsocketから制御する準備は整った気がする。