0

一段时间以来,我一直在使用旧的 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 方法,然后使用睡眠,这样循环就不会旋转得太快,以及其他一些方法。

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

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

4

2 回答 2

0

解决方案是:

class Socket
    def ready
        not IO.select([self], nil, nil, 0) == nil
    end
end
于 2011-07-29T21:21:26.933 回答
0

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

于 2015-04-30T22:55:39.517 回答