2011-07-29 24 views
0

有一段時間我一直在使用舊的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),其中所述插座保持瓦特防止接收服務器不發送的數據(當它不應該等待數據時)。

什麼是這種方法的最佳替代品?

+1

也許['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)應該給你一個簡要概述。 –

+0

謝謝,我能夠解決它:不是IO.select([self],nil,nil,0)==無 – Speed

+0

IO.select文檔相當稀疏。難怪你不知道這件事。 –

回答

0

的解決方案是:

class Socket 
    def ready 
     not IO.select([self], nil, nil, 0) == nil 
    end 
end 
+0

任何想法從'io/wait'標準庫調用'IO.select'和'#ready?'方法之間的權衡是什麼?我已經閱讀了兩個沒有啓蒙的來源。 – slothbear