为Socket准备好了1.9的替换?方法

时间:2011-07-29 07:34:10

标签: ruby sockets tcp ready

有一段时间我一直在使用旧的Ruby发行版(我认为它是1.8.6),我使用套接字库编写了它。旧库有一个名为 ready?的方法,它检查是否仍有数据未经阻塞而接收。什么是1.9中最好的替代品?

我之所以需要它是因为我有一个这样的程序:

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方法,然后使用sleep,这样循环不会旋转太快,以及其他一些方法。

正如您所看到的,我需要检查是否将使用 @ s.ready?(@s是套接字)接收数据,否则循环挂起 readStr = @s .recv(0x1024),其中套接字一直想要接收服务器不发送的数据(当它不应该等待数据时)。

这种方法的最佳替代品是什么?

2 个答案:

答案 0 :(得分:0)

解决方案是:

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

答案 1 :(得分:0)

我通过要求ready?在Ruby 2.2.2中成功使用io/wait方法。在这个SO答案中有更多信息:https://stackoverflow.com/a/3983850/2464