Frage

Ich versuche, eine Anwendung einmal HTTP-Server erstellen einen einzelnen Rückruf zu handhaben und ein frei TCP-Port in Ruby mit der Suche nach.

Hilfe benötigen

Dies ist das Skelett, was ich tue:

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

(Es spiegelt die Standardeingabe in der ersten Verbindung und dann stirbt.)

Wie kann ich automatisch einen freien Port findet auf hören?

Dies scheint der einzige Weg zu sein, einen Job auf einem Remote-Server zu starten, die dann mit einer einzigartigen Job-ID ruft zurück. Dieser Job-ID kann dann für Statusinformationen abgefragt werden. Warum der ursprüngliche Designer konnte nicht einfach gibt die ID Job, wenn den Job Scheduling Ich werde nie wissen. Ein einzelner Port kann nicht, weil Konflikte mit mehreren Callbacks verwendet werden können, auftreten; auf diese Weise die Ports nur für + verwendet - 5 Sek.

War es hilfreich?

Lösung

Ich denke, man könnte alle Häfen versucht> 5000 (zum Beispiel) in Folge. Aber wie werden Sie auf dem Client-Programm kommunizieren, welchen Port Sie hören? Es einfacher scheint auf einem Port zu entscheiden, und es dann einfach konfigurierbar machen, wenn Sie Ihr Skript zwischen verschiedenen Umgebungen verschieben müssen.

Für HTTP, der Standard-Port ist 80. Alternative Ports die ich gesehen habe verwendet werden, sind 8080, 880 und 8000.

Andere Tipps

Pass 0 in für die Portnummer. Dadurch wird das System veranlassen, einen Anschluss für Sie aus dem temporären Portbereich zu wählen. Sobald Sie den Server erstellen, können Sie es für seine Adr fragen, welche den Port enthält, die der Server gebunden ist.

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

Es ist eigentlich ganz einfach, wenn Sie nicht versuchen, alles in einer Zeile zu tun: - /

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

Dies erreicht (starkes Wort) die gleichen wie die Schnipsel in der Frage.

Sie können versuchen, random-Port , ein einfaches Ruby-Juwel (ich bin der Autor ):

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

Der beste Weg, obwohl, ist, es zu veröffentlichen danach:

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

Der Pool ist Thread-sicher und garantiert, dass die Port nicht von einem anderen Thread oder irgendwo sonst in der App verwendet werden, bis sie freigegeben wird.

Vielleicht möchten Sie Test Wetter einen Port hört, für mich folgt gearbeitet system('(6<>/dev/tcp/127.0.0.1/9292) &>/dev/null'), return true, wenn 9292 zuhört, andernfalls false zurück.

Sie kommunizieren nicht auf zufällige Ports. Wählen Sie eine Standard ein und machen es konfigurierbar. Zufällige Ports sind nicht kompatibel mit Firewalls. FTP tut dies und Firewall-Unterstützung für sie ein Alptraum -. Es muss tief Pakete prüfen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top