"Java.net.BindException: Adresse wird bereits verwendet", wenn versucht wird, schnelle Socket-Erstellung und -Zerstörung für Auslastungstests durchzuführen
Ich versuche zu laden testen, eine Java-server-durch das öffnen einer großen Anzahl von socket-verbindungen zu dem server, der Authentifizierung und schließt die Verbindung, dann wiederholen. Meine app läuft Super für eine Weile, aber schließlich habe ich bekommen:
java.net.BindException: Address already in use: verbinden
Gemäß der Dokumentation habe ich gelesen, der Grund dafür ist, dass geschlossene sockets immer noch besetzen, die lokale Adresse zugewiesen, um Sie für einen Zeitraum von Zeit, nachdem die close() aufgerufen wurde. Das ist OS abhängig, sondern kann in der Größenordnung von Minuten. Ich habe versucht, den Aufruf setReuseAddress(true)
auf den sockel mit der Hoffnung, dass seine Adresse wäre wiederverwendbare sofort nach close()
genannt wurde. Leider scheint dies nicht der Fall sein.
Mein code für die socket-Erstellung ist:
Socket socket = new Socket();
socket.setReuseAddress(true);
socket.connect(new InetSocketAddress(m_host, m_port));
Aber ich bekomme immer noch diese Fehlermeldung:
java.net.BindException: Address already in use: verbinden Sie nach einer Weile.
Gibt es eine andere Möglichkeit das zu erreichen, was ich versuche zu tun? Ich möchte für die Instanz: offen 100 Steckdosen, schließen Sie alle offenen 200 Steckdosen, schließen Sie alle offenen 300, etc. bis zu einem Maximum von 2000 oder so Sockeln.
Jede Hilfe wäre sehr geschätzt werden!
InformationsquelleAutor der Frage bradforj287 | 2011-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie exhausing der Raum der ausgehenden ports öffnen, die viele ausgehende sockets in der TIME_WAIT Zeitraum von zwei Minuten. Die erste Frage die Sie sich stellen sollten ist, ob hier eine realistische Lasttests überhaupt? Ist eine echte client wirklich tun? Wenn nicht, müssen Sie nur überarbeiten Sie Ihre Test-Methode.
BTW SO_LINGER ist die Anzahl der Sekunden, die der Anwendung warten, während close() für Daten geleert werden. Es ist normalerweise null. Der port wird hängen, um für den TIME_WAIT-Intervall-jedenfalls, wenn dies ist das Ende, ausgestellt in der Nähe. Dies ist nicht die gleiche Sache. Es ist möglich, um Missbrauch der zur option SO_LINGER patch das problem. Aber das wird auch dazu führen, außergewöhnliches Verhalten in peer-und auch dies ist nicht der Zweck eines test.
InformationsquelleAutor der Antwort EJP
Nicht mit bind (), aber setReuseAddress(true) ist einfach seltsam, ich hoffe, Sie verstehen, die Auswirkungen von setReuseAddress (und der Punkt). 100-2000 ist nicht eine große Anzahl von sockets zu öffnen, jedoch ist der server Sie eine Verbindung herstellen möchten (da sieht es die gleiche Adresse/port-paar), können Sie einfach legen Sie Sie w/ein normaler Rückstand von 50.
Bearbeiten:
wenn Sie öffnen müssen, um mehrere sockets schnell (öhh port-scan?), Ich würde sehr stark empfehlen die Verwendung von NIO und connect()/finishConnect () + - Selektor. Eröffnung 1000-Fach in den gleichen thread, ist einfach nur langsam.
Vergessen Sie müssen möglicherweise finishConnect() oder so im code.
InformationsquelleAutor der Antwort bestsss
Ich denke, man sollte plan auf der port Sie verwenden möchten, zu verbinden verwendet werden. Damit meine ich versuchen eine Verbindung über den port gegeben. Wenn die Verbindung fehlschlägt (oder in deinem Fall eine Ausnahme auslöst), versuchen Sie, öffnen Sie die Verbindung mit dem nächsten port-Nummer.
Versuchen Sie das einwickeln der
connect
- Anweisung in einemtry/catch
.Hier einige pseudo-code, der vermittelt, was ich denke:
Dieser code gilt nicht für Ausnahmefälle wie "was passiert, wenn alle ports in Verwendung sind?"
InformationsquelleAutor der Antwort Weiser