2008-09-22 3 views
10

In Java können Sie die Zahl Null als einzigen Parameter für den Socket- oder DatagramSocket-Konstruktor angeben. Java bindet diesen Socket dann an einen freien Port. Ist es möglich, die Port-Suche auf einen bestimmten Bereich zu beschränken?Wie geben Sie einen Portbereich für Java-Sockets an?

+0

Nun, für nicht-privilegierte Benutzer ist es bereits zu> 1024 auf * nix begrenzt: P – freespace

+0

Leider auf Windows laufen wir;) –

Antwort

7

Hrm, nach dem Lesen der Dokumente glaube ich nicht, dass Sie können. Sie können entweder an einen beliebigen Port binden und dann erneut binden, wenn dies nicht akzeptabel ist, oder Sie müssen wiederholt an einen Port in Ihrem Bereich binden, bis Sie erfolgreich sind. Die zweite Methode wird am "effizientesten" sein.

Ich bin beunruhigt über diese Antwort, weil es ... unelegant, aber ich kann wirklich nichts anderes entweder finden:/

+2

Sie sollten auch beachten, dass Bei einer linearen Suche nach einem freien Port gibt es manchmal Auswirkungen auf die Sicherheit. Wenn Sie Port A für Client 1 und Port A + 1 für den nächsten Client verwenden, kann Client 1 den Port erraten, den Sie für einen anderen Client verwenden möchten. – Darron

2

Binden der Buchse an einen freien Port (in der Regel) ein Merkmal der Socket-Unterstützung des Betriebssystems; Es ist nicht spezifisch für Java. Solaris unterstützt beispielsweise die Anpassung des kurzlebigen Portbereichs über den Befehl ndd. Aber nur root kann den Bereich anpassen, und es betrifft das gesamte System, nicht nur Ihr Programm.

Wenn das reguläre ephemere Bindungsverhalten nicht Ihren Anforderungen entspricht, müssen Sie wahrscheinlich Ihre eigenen mit Socket.bind() schreiben.

0

Sie könnten einen Blick auf den Java-Code werfen, der die von Ihnen verwendete Funktion implementiert. Die meisten Java-Bibliotheken sind in Java geschrieben, sodass Sie vielleicht sehen, was Sie dort benötigen.

Angenommen, @Kenster hatte Recht, und es ist eine Systemoperation, müssen Sie möglicherweise einfach über Ports iterieren, die versuchen, an jeden zu binden oder es zu testen. Obwohl es ein wenig schmerzhaft ist, sollte es nicht mehr als ein paar Zeilen Code sein.

1

Hier ist der Code, den Sie benötigen:

public static Socket getListeningSocket() { 
    for (int port = MIN_PORT ; port <= MAX_PORT ; port++) 
    { 
     try { 
      ServerSocket s = new ServerSocket(port); 
      return s;  // no exception means port was available 
     } catch (IOException e) { 
      // try the next port 
     } 
    } 
    return null; // port not found, perhaps throw exception? 
} 
+3

Sie sollten eher BindException fangen, die gestartet wird, wenn der Port bereits verwendet wird. – Chochos