如果您拨打DRb.start_service(nil, some_obj)
然后再拨打DRb.uri
,则会返回本地URI,包括另一个进程可用于拨打电话的端口号。
我希望只是让一些代码找到一个随机可用端口并返回该端口号,而不是启动一个完整的DRb
服务。在Ruby中有一种简单的方法吗?
答案 0 :(得分:18)
没试过,但这可能有用。
该过程可以让系统 自动分配端口。对于
互联网域和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
该池是线程安全的,并保证该端口在释放之前不会被其他线程或应用程序中的其他任何地方使用。