繁体   English   中英

你如何使用Ruby找到一个免费的TCP服务器端口?

[英]How do you find a free TCP server port using Ruby?

我正在尝试创建一个使用一次的HTTP服务器来处理单个回调,并需要帮助在Ruby中找到一个免费的TCP端口。

这是我正在做的事情的骨架:

require 'socket'
t = STDIN.read
port = 8081
while s = TCPServer.new('127.0.0.1', port).accept
  puts s.gets
  s.print "HTTP/1.1 200/OK\rContent-type: text/plain\r\n\r\n" + t
  s.close
  exit
end

(它回应第一个连接的标准输入,然后死掉。)

如何自动找到要监听的空闲端口?

这似乎是在远程服务器上启动作业的唯一方法,然后使用唯一的作业ID回调。 然后可以查询此作业ID以获取状态信息。 为什么原始设计师在安排我永远不会知道的工作时不能只返回作业ID。 无法使用单个端口,因为可能会发生与多个回调的冲突; 这样端口只用了+ - 5秒。

将0输入为端口号。 这将导致系统从临时端口范围中为您选择一个端口。 创建服务器后,您可以询问它的addr,它将包含服务器绑定的端口。

server = TCPServer.new('127.0.0.1', 0)
port = server.addr[1]

当你不尝试在一行中做所有事情时,它实际上很容易: - /

require 'socket'
t = STDIN.read

port = 8080 # preferred port
begin
  server = TCPServer.new('127.0.0.1', port)    
rescue Errno::EADDRINUSE
  port = rand(65000 - 1024) + 1024
  retry
end

# Start remote process with the value of port

socket = server.accept
puts socket.gets
socket.print "HTTP/1.1 200/OK\rContent-type: text/plain\r\n\r\n" + t
socket.close

这完成(强词)与问题中的片段相同。

您可以尝试随机端口 ,一个简单的Ruby gem(我是作者):

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

不过,最好的方法是随后发布:

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

该池是线程安全的,它保证端口不会被另一个线程或应用程序中的任何其他位置使用,直到它被释放。

也许你想要一个端口正在监听的测试天气,以下是为我system('(6<>/dev/tcp/127.0.0.1/9292) &>/dev/null') ,如果9292正在监听则返回true,否则返回true ,返回false。

不要在随机端口上进行通信。 选择一个默认值并使其可配置。 随机端口与防火墙不兼容。 FTP做到这一点,防火墙支持它是一场噩梦 - 它必须深入检查数据包。

我想你可以按顺序尝试所有端口> 5000(例如)。 但是,您将如何与客户端程序通信您正在收听哪个端口? 如果您需要在不同的环境之间移动脚本,那么决定端口似乎更简单,然后使其易于配置。

对于HTTP,标准端口是80.我见过的替代端口是8080,880和8000。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM