【问题标题】:How to use Ruby's write_nonblock / read_nonblock with servers/clients?如何将 Ruby 的 write_nonblock / read_nonblock 与服务器/客户端一起使用?
【发布时间】:2014-01-03 10:37:51
【问题描述】:

我正在尝试将 Ruby 与服务器一起使用。我从玩家那里得到一个输入或一个字符串,以便服务器将玩一手战争(纸牌游戏)。

真正令人沮丧的是我正在使用 read 和 write_nonblock,而且我不断遇到错误,我不知道它们为什么会出现,因此不知道如何解决它们。

Errno::EAGAIN: Resource temporarily unavailable - read would block #etc. etc. 

所以...我如何正确使用读写 non_block 在服务器和客户端上发送和接收数据(以便我可以触发事件)? (我是新程序员,说明越简单越好。)

【问题讨论】:

  • 只捕获Errno::EAGAIN异常
  • 谢谢。但是,作为非常业余的人,你能解释一下如何做到这一点/这会有什么帮助吗?而且我仍然不确定如何真正正确使用 non_block 方法

标签: ruby error-handling iostream send nonblocking


【解决方案1】:

需要#write(read)_nonblock这对方法,以便在数据尚未准备好发送或接收时对您需要的代码进行一些处理。 rubydocs在方法上说如下:

如果异常为Errno::EWOULDBLOCKErrno::AGAIN,则通过IO::WaitReadable进行扩展。所以 IO::WaitReadable 可以用来挽救重试 read_nonblock 的异常。

只捕获Errno::EAGAIN 异常。

注意 retry 关键字使该方法与通常的#write(read) 一样:

begin
   io.write_nonblock
rescue Errno::EAGAIN
   retry # or do something else
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多