Ich möchte einen Server starten, der einen Port abhört. Ich kann den Port explizit angeben und es funktioniert. Aber ich möchte automatisch einen Port finden. In dieser Hinsicht habe ich zwei Fragen.
In welchem Bereich von Portnummern soll ich suchen? (Ich habe die Ports 12345, 12346 und 12347 verwendet und es war in Ordnung).
Wie kann ich herausfinden, ob ein bestimmter Port nicht von einer anderen Software belegt ist?
java
networking
sockets
port
römisch
quelle
quelle
ssh -D 127.0.0.0:0 ...
ob ein Port übergeben wird, und lehnen ihn ab ( ? Nein!), Was wirklich frustrierend ist. Wir mussten eine ganze Reihe von Bibliotheken / Programmen patchen, um sie für uns nutzbar zu machen.new ServerSocket(0)
ist in dieser Hinsicht nicht anders. In Ihrem ersten Link ist überhaupt nichts darüber. Ihr zweiter Link weist lediglich eine schlechte Praxis auf. Sobald Sie die aufgebaut haben ,ServerSocket
sollten Sie verwenden es, nicht schließen Sie es und versuchen die gleiche Portnummer wieder zu verwenden. All dies ist reine Zeitverschwendung und anfällig für Zeitfensterprobleme.Wenn Sie dem Konstruktor von ServerSocket 0 als Portnummer übergeben, wird Ihnen ein Port zugewiesen.
quelle
Ab Java 1.7 können Sie Try-with-Resources wie folgt verwenden:
Wenn Sie einen offenen Port für eine bestimmte Schnittstelle suchen müssen, überprüfen Sie ServerSocket Dokumentation nach alternativen Konstruktoren.
Warnung: Jeder Code, der die von dieser Methode zurückgegebene Portnummer verwendet, unterliegt einer Race-Bedingung. Ein anderer Prozess / Thread kann unmittelbar nach dem Schließen der ServerSocket-Instanz an denselben Port gebunden werden.
quelle
SO_REUSEADDR
. Und es gibt eine Rennbedingung, aber es ist schwer, das zu beheben.ServerSocket
mit derselben Portnummer zu öffnen , wie dies in der Zwischenzeit möglicherweise geschehen ist. Warum Sie das tatsächliche nicht einfach zurückgeben,ServerSocket
anstatt es zu schließen, bleibt ein Rätsel.ServerSocket
anstelle einesint
für den Port akzeptiert .Laut Wikipedia sollten Sie Ports verwenden,
49152
um65535
wenn Sie keinen "bekannten" Port benötigen.AFAIK Der einzige Weg, um festzustellen, ob ein Port verwendet wird, besteht darin, zu versuchen, ihn zu öffnen.
quelle
Wenn Sie in Reichweite benötigen :
quelle
ServerSockets
im Erfolgsfall nicht das Erstellen von zwei und leidet nicht unter den Zeitfensterproblemen dieses Codes.Wenn Sie Spring verwenden, können Sie http://docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/util/SocketUtils.html#findAvailableTcpPort-- ausprobieren
quelle
SpringUtils.findAvailableTcpPort()
genau das gleiche, was in anderen Antworten empfohlen wird: Wählen Sie einen Port und versuchen Sie esnew ServerSocket(port)
.Das Eclipse SDK enthält eine Klasse SocketUtil , die genau das tut, was Sie wollen. Sie können einen Blick in den Git- Quellcode werfen .
quelle
Siehe http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket%28int%29
quelle
Dies funktioniert bei mir unter Java 6
quelle
Ich habe kürzlich eine winzige Bibliothek veröffentlicht, um genau das für Tests zu tun. Die Maven-Abhängigkeit ist:
Nach der Installation erhalten Sie freie Portnummern über:
quelle
Wenn Ihr Server gestartet wird, wurde dieser Socket nicht verwendet.
BEARBEITEN
Etwas wie:
quelle
new ServerSocket(0)
es für Sie nicht funktioniert, ist dies die Alternative. Ich denke, es gibt 85% der Möglichkeiten, dass Sie meinen Vorschlag nutzen.ServerSockets
für immer und behält nur den letzten , der erfolgreich war. Es braucht einebreak
Erklärung.Wenn Sie Ihren eigenen Server mit a erstellen möchten
ServerSocket
, können Sie ihn einfach einen freien Port für Sie auswählen lassen:Andere Serverimplementierungen unterstützen normalerweise ähnlich. Jetty wählt beispielsweise einen freien Port aus, es sei denn, Sie legen ihn explizit fest:
quelle
Es mag Ihnen nicht viel helfen, aber auf meinem (Ubuntu) Computer habe ich eine Datei / etc / services, in der zumindest die von einigen Apps verwendeten / reservierten Ports angegeben sind. Dies sind die Standardports für diese Apps.
Keine Garantie, dass diese ausgeführt werden, nur die Standardports, die diese Apps verwenden (daher sollten Sie sie nach Möglichkeit nicht verwenden).
Es sind etwas mehr als 500 Ports definiert, etwa die Hälfte UDP und die Hälfte TCP.
Die Dateien werden unter Verwendung von Informationen von IANA erstellt, siehe IANA Zugewiesene Portnummern .
quelle
Wenn Sie Spring verwenden, ist die Antwort von Michail Nikolaev die einfachste und sauberste, und IMO sollte positiv bewertet werden. Aus praktischen Gründen werde ich ein Inline-Beispiel mit der Springframwework SocketUtils .findAvailableTcpPort () -Methode hinzufügen :
int randomAvailablePort = SocketUtils.findAvailableTcpPort();
So einfach ist das, nur eine Zeile :). Natürlich bietet die Utils-Klasse viele andere interessante Methoden. Ich schlage vor, einen Blick auf die Dokumente zu werfen.
quelle
Mit der Klasse 'ServerSocket' können wir feststellen, ob ein bestimmter Port verwendet wird oder frei ist. ServerSocket bietet einen Konstruktor, der eine Ganzzahl (die Portnummer) als Argument verwendet und den Server-Socket am Port initialisiert. Wenn ServerSocket eine E / A-Ausnahme auslöst, können wir davon ausgehen, dass dieser Port bereits verwendet wird.
Das folgende Snippet wird verwendet, um alle verfügbaren Ports abzurufen.
Referenz Link .
quelle
Wenn der Port von einer anderen Software belegt ist, löst der Code eine IOException aus
quelle