This Link bietet ein Tutorial zum Öffnen eines nicht blockierenden Sockets. Die hier zur Verfügung gestellte Methode bietet jedoch keine Möglichkeit, einen zufälligen Port aufzunehmen. Auch alle Konstruktoren, die bei dieser gezeigt sind, nehmen die Adresse als Argument. Irgendeine Möglichkeit, dies zu tun?Java NIO-Sockets, Verbindung mit jedem verfügbaren Port?
Antwort
Seine Bit-Hacky-Lösung hat aber für mich gearbeitet. Sie können einen normalen Socket mit einem Port-Argument von 0 erstellen (damit Sie einen zufälligen verfügbaren Socket erhalten), verbinden Sie sich mit ihm und nehmen Sie dann seine Adresse. Schließen Sie nun diesen Socket und übergeben Sie diese Adresse als Argument beim Erstellen von SocketChannel. Allerdings Vorsicht, dies kann ein Problem in Multi-Thread-Programm sein, wo Threads Socket parallel erstellen. Betrachten Sie zwei parallele Threads t1 und t2. Angenommen, t1 hat einen Socket erstellt, der seine Adresse erfasst, geschlossen und dann den Kontext gewechselt hat. Jetzt hat t2 den gleichen Port, bevor t1 über diesen Socket eine Verbindung zu einem nicht blockierenden Kanal herstellen konnte. In diesem Fall wäre es gut, die Schleife so lange fortzusetzen, bis die nicht blockierende (SocketChannel) Verbindung nicht hergestellt ist.
Wenn man sich die Konstrukteure sucht InetSocketAddress, wird angegeben, dass
Ein gültiger Port-Wert liegt zwischen 0 und 65535. Eine Portnummer von Null wird das System läßt einen temporären Port in einer Bindung aufheben Betrieb.
Im Wesentlichen passiert nur in einem InetSocketAddress
, 0 für das Port Argument verwendet wird, und dies in einer zufälligen Port so gewählt führen.
Ich weiß nicht, ob es das gleiche mit NIO funktioniert, aber Sie können dies versuchen: https://stackoverflow.com/questions/2231467/dynamically-choose-port-number. Einfach an Port 0 binden und ein zufälliger freier Port wird gewählt – Warrior