如何以编程方式获取 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
而失败
我正在 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