Ich möchte einen offenen lokalen Port in einem bestimmten Bereich finden.
Wie kann ich das am effizientesten machen, ohne Verbindung zum Port herzustellen?
Wenn Sie einen lokalen offenen Port zum Binden eines Servers suchen möchten, können Sie ein ServerSocket
erstellen und wenn es keine Exception auslöst, ist es offen.
Ich habe folgendes in einem meiner Projekte gemacht:
%Vor% RANDOM
ist ein ThreadLocal
hier, aber natürlich können Sie dort einen inkrementellen Teil machen.
Es gibt ein kleines Problem, auf das Sie in einer Multitasking-Windows / Unix-Umgebung stoßen können: Wenn etwas iPortAvailable (endgültiger int-Port) aus einer der Antworten ein wahr für Sie zurückgibt, heißt das nicht, dass Sie es in dem Moment tun werden tatsächlich binden es es wird noch verfügbar sein. Die bessere Lösung wäre das Erstellen einer Methode
%Vor%Damit Sie es einfach starten und offene Sockets für Sie an einem verfügbaren Port im angegebenen Bereich erhalten.
Eine Möglichkeit besteht darin, einen nativen Netzwerkbefehl zu verwenden und die Ausgabe zu analysieren.
netstat -n
Die Ausgabe hat das folgende Format.
Sie müssen die Spalte "Foreign Address" für localhost oder 127.0.0.1 analysieren und eine Liste der belegten Ports abrufen. Dann sehen Sie, ob sie in dem von Ihnen angegebenen Bereich liegen.
Wenn es sich nicht um Port-Sniffing, sondern um Service Discovery handelt, sollten Sie einen Rendez-Vous-Server (wie einen RMI-Server) oder das UDP-Protokoll verwenden. Früher haben wir JXTA dafür benutzt, aber ich hoffe, dass es dafür jetzt eine bessere Alternative gibt.
Im Wesentlichen die gleiche Idee wie Karaszi, aber anstatt so viele Sockets zu konstruieren, verwenden Sie die InetSocketAddress und versuchen, einen ServerSocket an jede Adresse in der Reihe zu binden, bis Sie eine offene treffen.
Wenn Sie nicht an diesen Port binden möchten (obwohl Sie den Socket im nächsten Moment nach der Überprüfung möglicherweise nicht binden können), verwenden Sie ein einfaches Socket-Objekt und versuchen Sie, eine Verbindung zu den Ports herzustellen - wenn es funktioniert, wird der Port genommen, wenn nicht (und Sie haben keine Firewall, die die Verbindung verbietet), dann ist es wahrscheinlich kostenlos.
Tags und Links java networking