如何以编程方式获取 Sinatra 的活动端口?

How to programmatically get Sinatra's active port?

我正在 Ruby 上使用 Sinatra 创建一个简单且可移植的 Web 应用程序,我让系统为服务器找到一个开放端口以用于以下内容:

require 'sinatra'
require 'socket'

socket = Socket.new(:INET, :STREAM, 0)
socket.bind(Addrinfo.tcp("127.0.0.1", 0))

port = socket.local_address.to_s.chomp("\x0").to_i

set :port, port
set :bind, "127.0.0.1"

get "/" do
    "Hello, World!"
end

我想启动浏览器自动查看应用程序,但问题是 port 变量和 Sinatra 的 settings.port 都设置为 0,所以我无法获取服务器的URL。

启动代码在 get "/" do 块之后:

Thread.new do
    system "chromium-browser " <<
        "-app='http://127.0.0.1:#{port}' " <<
        "--no-sandbox > /dev/null 2>&1"
end

系统启动后,在WEBrick输出中可以看到端口,但是如何获取系统事先分配给socket的端口呢?

试试这个

require 'sinatra'
require 'socket'

socket = Socket.new(:INET, :STREAM, 0)
socket.bind(Addrinfo.tcp("127.0.0.1", 0))

port = socket.local_address.ip_port
socket.close

set :port, port
set :bind, "127.0.0.1"

get "/" do
    "Hello, World!"
end

socket.local_address.ip_port 会为您提供端口信息,但您需要在启动 sinatra 之前关闭该套接字,否则它将因 Errno::EADDRINUSE

而失败