2009年7月 2日

[ruby-list:46136] 足し算ゲームサーバー

牛坂ともうします。"ruby アプリケーションプログラム"を勉強中です。このな
かの5.6.5章の1対1の非同期通信のところをいま取り組んでいます。serverを立
ち上げて接続しても、途中で止まってしまいます。ちなみにwindows XP上でコマ
ンドプロンプトより実行しています。

server側(プログラム名 sleep.rb)
D:\ruby_s>sleep.rb 7777
"..... 5\n"

".... 4\n"
"... 3\n"
".. 2\n"
". 1\n"

client側(プログラム名 add-client.rb)
D:\ruby_s>add-client localhost 7777
Are you ready?
ここで止まってしまいます。
そしてreturnキーをおすと
..... 5
.... 4
... 3
.. 2
. 1
と表示されます。

以下にserver側のcodeを示します。

require 'socket'
require 'thread'

port = if ARGV[0] then ARGV[0] else 12345 end
gate = TCPServer.open(port)
m = Mutex.new
srand

def gen_question(length)
num = rand(9) + 1
correct = num
question = num.to_s
(2..length).each {
num = rand(9) + 1
correct += num
question += " + #{num}"
}
return correct, question
end

loop do
sock = gate.accept

begin
sock.write "Are you ready?\n"
[5,4,3,2,1].each{|count|
sleep 1
sock.write "#{'.'*count} #{count}\n"
p "#{'.'*count} #{count}\n"
}
rescue
sock.close
next
end

end


以下にclient側のcodeを示します。
require 'socket'

#STDOUT.sync = true
host = if ARGV[0] then ARGV[0] else 'localhost' end
port = if ARGV[1] then ARGV[1] else 12345 end
socket = TCPSocket.open(host, port)

th_get = Thread.start {
while msg = socket.gets
print msg
end
}

th_ans = Thread.start {
while msg = STDIN.gets
socket.write msg
end
# sock.shutdown(1)
}

th_get.join
th_ans.exit if th_ans.alive?
socket.close

--

 //////☆
 ////★
 //☆   牛坂 博則
 ★   


投稿者 xml-rpc : 2009年7月 2日 13:19
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/86326
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。