我有連接到TCP服務器(即netcat)的這個ruby代碼。它循環20次,併發送「ABCD」。如果我殺死netcat,則需要兩次迭代才能觸發異常。在netcat被終止後的第一個循環中,不會觸發異常,「send」報告已經正確寫入了5個字節......哪一個最終不是真的,因爲服務器當然沒有收到它們。當服務器被終止時,Ruby TCPSocket不會注意到它
有沒有辦法解決這個問題?現在我正在丟失數據:因爲我認爲它已被正確傳輸,我沒有重播它。
#!/usr/bin/env ruby
require 'rubygems'
require 'socket'
sock = TCPSocket.new('192.168.0.10', 5443)
sock.sync = true
20.times do
sleep 2
begin
count = sock.write("ABCD ")
puts "Wrote #{count} bytes"
rescue Exception => myException
puts "Exception rescued : #{myException}"
end
end
我已經注意到,在這個套接字上讀取的IO.select確實返回true。所以至少如果你使用它,你會知道閱讀。它會拋出一個錯誤。這比靜靜地失敗要好得多。感謝您發佈這個答案。這讓我感覺更好,其他人看到這種奇怪的行爲。注意:我在jruby和mri 1.9.3中看到了這個。 – kbrock 2013-05-01 20:37:46