Nájdenie voľného portu v prostredí Java

1. Prehľad

Pri spustení servera soketu v našej aplikácii Java sa zobrazí ikona java.net API vyžaduje, aby sme zadali bezplatné číslo portu, na ktorom budeme počúvať. Číslo portu je povinné, aby vrstva TCP mohla identifikovať aplikáciu, pre ktorú sú prichádzajúce údaje určené.

Výslovné zadanie čísla portu nie je vždy dobrá voľba, pretože aplikácie ho už môžu obsadzovať. To spôsobí výnimku vstupu / výstupu v našej aplikácii Java.

V tejto rýchlej príručke sa pozrieme na to, ako skontrolovať stav konkrétneho portu a ako používať automaticky pridelený. Pozrime sa, ako to možno dosiahnuť pomocou jednoduchého rámca Java a Spring. Pozrime sa tiež na niektoré ďalšie implementácie servera, napríklad zabudované Tomcat a Jetty.

2. Kontrola stavu portu

Pozrime sa, ako môžeme skontrolovať, či je konkrétny port voľný alebo obsadený pomocou java.net API.

2.1. Szvláštny prístav

Využijeme ServerSocket triedy z java.net API na vytvorenie serverovej zásuvky, viazanej na zadaný port. V jeho konštruktore, ServerSocket akceptuje explicitné číslo portu. Trieda tiež implementuje Uzatvárateľné rozhranie, takže ho možno použiť v vyskúšajte zdroje automatické zatvorenie zásuvky a uvoľnenie portu:

try (ServerSocket serverSocket = nový ServerSocket (FREE_PORT_NUMBER)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (FREE_PORT_NUMBER); } catch (IOException e) {fail ("Port nie je k dispozícii"); }

V prípade, že konkrétny port použijeme dvakrát, alebo už je obsadený inou aplikáciou, ServerSocket konštruktér hodí Výnimka IO:

try (ServerSocket serverSocket = nový ServerSocket (FREE_PORT_NUMBER)) {nový ServerSocket (FREE_PORT_NUMBER); fail ("Ten istý port nemožno použiť dvakrát"); } catch (IOException e) {assertThat (e) .hasMessageContaining ("Adresa sa už používa"); }

2.2. Port Rozsah

Poďme si teraz skontrolovať, ako môžeme využiť vyhodené IOException, na vytvorenie serverovej zásuvky pomocou prvého voľného portu z daného rozsahu čísel portov:

pre (int port: FREE_PORT_RANGE) {try (ServerSocket serverSocket = nový ServerSocket (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (port); návrat; } catch (IOException e) {assertThat (e) .hasMessageContaining ("Adresa sa už používa"); }} fail ("Nenašiel sa žiadny voľný port v rozsahu");

3. Nájdenie voľný prístav

Používanie explicitného čísla portu nie je vždy dobrá voľba, preto sa pozrime na možnosti automatického pridelenia voľného portu.

3.1. Obyčajná Java

V. Môžeme použiť špeciálny port číslo nula ServerSocket konštruktor triedy. Výsledkom je, že java.net API nám automaticky pridelí voľný port:

try (ServerSocket serverSocket = nový ServerSocket (0)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isGreaterThan (0); } catch (IOException e) {fail ("Port nie je k dispozícii"); }

3.2. Jarný rámec

Jarná kostra obsahuje a SocketUtils triedy, pomocou ktorej nájdeme dostupný voľný port. Jeho vnútorná implementácia využíva ServerSocket triedy, ako je uvedené v našich predchádzajúcich príkladoch:

int port = SocketUtils.findAvailableTcpPort (); try (ServerSocket serverSocket = nový ServerSocket (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (port); } catch (IOException e) {fail ("Port nie je k dispozícii"); }

4. Ďalšie implementácie servera

Poďme sa teraz pozrieť na niektoré ďalšie populárne implementácie serverov.

4.1. Mólo

Jetty je veľmi populárny zabudovaný server pre aplikácie Java. Automaticky nám pridelí voľný port, pokiaľ ho výslovne nenastavíme prostredníctvom servera setPort metóda ServerConnector trieda:

Server jettyServer = nový server (); ServerConnector serverConnector = nový ServerConnector (jettyServer); jettyServer.addConnector (serverConnector); skus {jettyServer.start (); assertThat (serverConnector.getLocalPort ()). isGreaterThan (0); } catch (Výnimka e) {fail ("Nepodarilo sa spustiť server Jetty"); } nakoniec {jettyServer.stop (); jettyServer.destroy (); }

4.2. Tomcat

Tomcat, ďalší populárny zabudovaný server Java, pracuje trochu inak. Cez. Môžeme určiť explicitné číslo portu setPort metóda Tomcat trieda. V prípade, že poskytneme číslo portu nula, Tomcat automaticky pridelí voľný port. Ak však nenastavíme žiadne číslo portu, Tomcat použije svoj predvolený port 8080. Upozorňujeme, že predvolený port Tomcat môžu byť obsadené inými aplikáciami:

Tomcat tomcatServer = nový Tomcat (); tomcatServer.setPort (0); skus {tomcatServer.start (); assertThat (tomcatServer.getConnector (). getLocalPort ()). isGreaterThan (0); } catch (LifecycleException e) {fail ("Nepodarilo sa spustiť server Tomcat"); } nakoniec {tomcatServer.stop (); tomcatServer.destroy (); }

5. Záver

V tomto článku sme skúmali, ako skontrolovať stav konkrétneho portu. Pokryli sme tiež nájdenie voľného portu z radu čísel portov a vysvetlili sme, ako používať automaticky pridelený voľný port.

V príkladoch sme preberali základné ServerSocket triedy z java.net API a ďalšie populárne serverové implementácie vrátane Jetty a Tomcat.

Celý zdrojový kód je ako vždy k dispozícii na stránkach GitHub.


$config[zx-auto] not found$config[zx-overlay] not found