Portnummer dynamisch wählen?

7

In Java muss ich eine Portnummer für die Kommunikation zwischen mehreren Instanzen desselben Programms abrufen. Jetzt könnte ich einfach eine feste Nummer wählen und mitgehen. Aber ich frage mich, ob es eine Möglichkeit gibt, die Portnummer dynamisch zu wählen, so dass ich meine Benutzer nicht mit der Einstellung der Portnummer belästigen muss.

Hier ist eine Idee, die ich hatte:

  • Es gibt eine feste Anfangsportnummer A.
  • Programm 'MyApp' startet, versucht Port A zu greifen.
  • Wenn es gelingt, ist es die erste Instanz von "MyApp". Fertig.
  • Wenn es fehlschlägt, fragt es über Port A, ob das Programm auf A eine Instanz von 'MyApp' ist. Wenn ja, kommunizieren Sie mit dieser Instanz. Erledigt. Wenn nicht, versuchen Sie, Port A + 1 zu greifen. Und wenn ein anderes Programm diesen Port benutzt (keine Instanz von 'MyApp'), dann nimm A + 2, dann A + 3 und so weiter.

Macht diese Strategie Sinn? Oder gibt es eine bessere Möglichkeit, eine Portnummer dynamisch auszuwählen?

    
python dude 09.02.2010, 18:29
quelle

3 Antworten

27

Wenn Sie an Port 0 binden, verwendet Java einen vom System generierten Port. :-) Also, das ist wahrscheinlich der einfachste Weg, um zurückzufallen, wenn der gewünschte Port bereits benutzt wird.

%Vor%     
Chris Jester-Young 09.02.2010, 18:33
quelle
3

Ich würde die Umkehrung wählen und einen festen hohen Port für Ihre App auswählen. Machen Sie es zu einem Konfigurationswert, damit er bei Bedarf geändert werden kann. Dies vereinfacht die Konfiguration, da Benutzer von Apps häufig Netzwerkvorgänge anfordern müssen, um Ports zu öffnen. Umgehen Sie die zugewiesenen IANA-Werte:

Ссылка

Das Scannen von Ports könnte Ihre App für viele Intrusion Detection-Systeme zu einem schlechten Bürger machen.

    
Keith Adler 09.02.2010 18:33
quelle
1

Sie können Bonjour / ZeroConf verwenden, um die Dienste jeder Instanz anzukündigen und einer Instanz zu ermöglichen, die anderen zu finden. Stellen Sie sich dies als Verzeichnisdienst vor, der Ihnen bei der Verwaltung Ihres Port-Namespace helfen könnte.

Jede Instanz kann in diesem Fall nur einen dynamisch zugewiesenen Port abrufen. Eine Anforderung zum Binden an Port "0" weist das System normalerweise an, einen dynamischen Port zuzuweisen.

    
jldupont 09.02.2010 18:35
quelle

Tags und Links