2009年
1月
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

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2009-01-03 Socketプログラムの改良

_ Queueを使ったアクセス数の制限

いろいろと試してたら、Socketのプログラムがだいたい動くようになってきた。今度のはこれ。
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から制御する準備は整った気がする。