有一段時間我一直在使用舊的Ruby發行版(我想應該是1.8.6)上,我使用套接字庫編碼。舊圖書館準備好了一種叫做的方法?,其檢查是否仍有數據而不阻塞被接收。 1.9中最好的替代品是什麼?更換在1.9 Socket的準備?方法
我之所以需要它是因爲我有結構化的這樣一個程序:
def handle_socket_messages
while true
break unless messages_to_send
sent_messages
end
while @s and @s.ready?
#read messages
readStr = @s.recv(0x1024)
...
end
end
(當時我還有一個循環這使執行handle_socket_messages方法,然後使用睡眠,使迴路沒有按如下圖所示:
正如你所看到的,我需要檢查我是否會使用@ s.ready?接收數據?(@s是一個套接字),否則環路會掛起在readStr = @ s.recv(0x1024),其中所述插座保持瓦特防止接收服務器不發送的數據(當它不應該等待數據時)。
什麼是這種方法的最佳替代品?
也許['Kernel#select'](http://ruby-doc.org/core/classes/Kernel.html#M001406)這只是一個包裝系統調用['select'](http://www.kernel.org/doc/man-pages/online/pages/man2/select.2.html)。一個[SO搜索(http://stackoverflow.com/search?q=%5Bruby%5D+select+socket)應該給你一個簡要概述。 –
謝謝,我能夠解決它:不是IO.select([self],nil,nil,0)==無 – Speed
IO.select文檔相當稀疏。難怪你不知道這件事。 –