有没有办法找出Ruby的TCPSOCKETCOCKECT上有多少个字节? IE可以准备好几个字节,而无需阻塞?

有帮助吗?

解决方案

标准库 io/wait 在这里可能很有用。重新考虑它提供基于流的I/O(插座和管道)一些新方法,其中包括 ready?. 。根据 文档, , 准备好?如果有字节可用而没有阻塞,则返回非nil。碰巧的是,它将其返回的非nil值可用的字节数 在MRI中.

这是一个创建愚蠢的小套接字服务器,然后与客户端连接到它的示例。服务器只是发送“ foo”,然后关闭连接。客户端等待一点点以使服务器有时间发送,然后打印有多少个字节可读取。您的有趣的东西在客户中:

require 'socket'
require 'io/wait'

# Server

server_socket = TCPServer.new('localhost', 0)
port = server_socket.addr[1]
Thread.new do
  session = server_socket.accept
  sleep 0.5
  session.puts "foo"
  session.close
end

# Client

client_socket = TCPSocket.new('localhost', port)
puts client_socket.ready?    # => nil
sleep 1
puts client_socket.ready?    # => 4

不要在真实的任何内容中使用该服务器代码。为了使示例保持简单,它是故意延迟的。

注意:根据Pickaxe Book,IO/Wait仅在“ IOCTL(2)中的FionRead功能”时可用。它在Linux中。我不知道Windows和其他。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top