你如何在Ruby中找到一个随机的开放端口?

时间:2011-05-12 23:46:17

标签: ruby

如果您拨打DRb.start_service(nil, some_obj)然后再拨打DRb.uri,则会返回本地URI,包括另一个进程可用于拨打电话的端口号。

我希望只是让一些代码找到一个随机可用端口并返回该端口号,而不是启动一个完整的DRb服务。在Ruby中有一种简单的方法吗?

2 个答案:

答案 0 :(得分:18)

没试过,但这可能有用。

来自http://wiki.tcl.tk/2230

  

该过程可以让系统   自动分配端口。对于
  互联网域和XNS   域,指定端口号   在调用bind()之前请求0   系统来做到这一点。

另见http://www.ruby-doc.org/stdlib/libdoc/socket/rdoc/classes/Socket.html#M003723

 require 'socket'

 # use Addrinfo
 socket = Socket.new(:INET, :STREAM, 0)
 socket.bind(Addrinfo.tcp("127.0.0.1", 0))
 p socket.local_address #=> #<Addrinfo: 127.0.0.1:2222 TCP>

注意在socket.bind调用中使用端口0。预期的行为是local_address将包含随机开放端口。

答案 1 :(得分:1)

您可以尝试random-port,这是一个简单的Ruby宝石(我是作者):

require 'random-port'
port = RandomPort::Pool.new.acquire

不过,最好的方法是使用块:

RandomPort::Pool.new.acquire do |port|
  # Use the port, it will be returned back
  # to the pool afterward.
end

该池是线程安全的,并保证该端口在释放之前不会被其他线程或应用程序中的其他任何地方使用。