|
setup diary | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require 'socket'
s=TCPServer.new(12344)
Thread.start(s.accept){|cl|
print "%s is accepted\n"%cl.peeraddr
cl.each{|cmd|
str=""
case cmd.strip
when "status"
str=(rand(2)>0)?"good":"bad"
when "color"
str=["red","green","blue"][rand(3)]
end
cl.puts str
}
cl.close
print "%s is terminated\n"%cl.peeraddr
} while true
cygwin上で書いていたのだが、ポートは12345はトロイの木馬と勘違いされてだめだった。そして、クライアントはこれ。
s=TCPSocket.open("localhost",12344)
5.times{
s.write(["status\n","color\n"][rand(2)])
p s.gets
sleep 2
}
s.close
とりあえずは動くのだが、いろいろと気に入らない点がある。まず、クライアントからの入力に対して、出力を二行以上にしようとしたら、なぜかうまくいかなかった。print文が働かないように見える。それから、クライアントの接続が切れたことを認識してくれない。これだと、接続がつながって切れる度に、スレッドが増えていくことになってしまう。windows上で動かしているからなのかもしれない。時間ができたらlinux上でいろいろと試してみよう。
他の人が書いたプログラムとかを参考にいろいろと勉強しないといけないようだ。HTMLとかPOPなんかも勉強すると参考になるかな。
接続を切ったときには、Errno::ECONNABORTEDというエラーが起こっているようだ。スレッドはこのエラーで終了してしまうので、どんどんスレッドが増えることはないようだ。気持ちわるいので、rescueとかensureとかでこのエラーが起こったときの対処をすれば、それなりに動いた。
p s.gets until $_=~/^END/としていたが、
begin p s.gets end until $_=~/END/と書き換えることによって、getsが条件判定よりも前に行うようになったからだと思う。untilが後にあるから、後に実行しているような気になっていた。でも、なんか変な気がする。