Finne en gratis port i Java

1. Oversikt

Når du starter en stikkontaktserver i Java-applikasjonen vår, java.net API krever at vi spesifiserer et gratis portnummer å lytte på. Portnummeret kreves slik at TCP-laget kan identifisere applikasjonen som innkommende data er beregnet på.

Å spesifisere et portnummer eksplisitt er ikke alltid et godt alternativ, fordi applikasjoner kanskje allerede har det. Dette vil medføre et unntak for inngang / utgang i Java-applikasjonen.

I denne raske opplæringen vil vi se på hvordan du sjekker en spesifikk portstatus og hvordan du bruker en automatisk tildelt. Vi vil se på hvordan dette kan gjøres med vanlig Java- og Spring-rammeverk. Vi vil også se på noen andre serverimplementeringer, som innebygd Tomcat og Jetty.

2. Kontrollere portstatus

La oss se på hvordan vi kan sjekke om en bestemt port er ledig eller okkupert ved hjelp av java.net API.

2.1. Sspesifikk havn

Vi vil bruke ServerSocket klasse fra java.net API for å opprette et serveruttak, bundet til den angitte porten. I sin konstruktør, den ServerSocket godtar et eksplisitt portnummer. Klassen implementerer også Lukkbar grensesnitt, slik at det kan brukes i prøv-med-ressurser for å lukke kontakten automatisk og frigjøre porten:

prøv (ServerSocket serverSocket = ny ServerSocket (FREE_PORT_NUMBER)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). er EqualTo (FREE_PORT_NUMBER); } fange (IOException e) {fail ("Port er ikke tilgjengelig"); }

I tilfelle vi bruker en bestemt port to ganger, eller den allerede er okkupert av et annet program, ServerSocket konstruktøren vil kaste en IO Unntak:

prøv (ServerSocket serverSocket = ny ServerSocket (FREE_PORT_NUMBER)) {new ServerSocket (FREE_PORT_NUMBER); fail ("Samme port kan ikke brukes to ganger"); } fange (IOException e) {assertThat (e) .hasMessageContaining ("Adresse allerede i bruk"); }

2.2. Port Område

La oss nå sjekke hvordan vi kan bruke kastet IO unntak, for å opprette en serverkontakt ved hjelp av den første ledige porten fra et gitt utvalg av portnumre:

for (int port: FREE_PORT_RANGE) {try (ServerSocket serverSocket = new ServerSocket (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). er EqualTo (port); komme tilbake; } fange (IOException e) {assertThat (e) .hasMessageContaining ("Adresse allerede i bruk"); }} fail ("Ingen ledig port i området funnet");

3. Finne en frihavn

Å bruke et eksplisitt portnummer er ikke alltid et godt alternativ, så la oss se på mulighetene for å tildele en gratis port automatisk.

3.1. Vanlig Java

Vi kan bruke et spesielt portnummer null i ServerSocket klassekonstruktør. Som et resultat ble den java.net API tildeler automatisk en gratis port for oss:

prøv (ServerSocket serverSocket = ny ServerSocket (0)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). erGreaterThan (0); } fange (IOException e) {fail ("Port er ikke tilgjengelig"); }

3.2. Vårramme

Vårrammen inneholder en SocketUtils klasse som vi kan bruke til å finne en ledig gratis port. Den interne implementeringen bruker ServerSocket klasse, som vist i våre tidligere eksempler:

int port = SocketUtils.findAvailableTcpPort (); prøv (ServerSocket serverSocket = ny ServerSocket (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). er EqualTo (port); } fange (IOException e) {fail ("Port er ikke tilgjengelig"); }

4. Andre serverimplementasjoner

La oss nå ta en titt på noen andre populære serverimplementeringer.

4.1. Brygge

Jetty er en veldig populær innebygd server for Java-applikasjoner. Den vil automatisk tildele en gratis port for oss med mindre vi angir den eksplisitt via setPort metoden for ServerConnector klasse:

Server jettyServer = ny server (); ServerConnector serverConnector = ny ServerConnector (jettyServer); jettyServer.addConnector (serverConnector); prøv {jettyServer.start (); assertThat (serverConnector.getLocalPort ()). isGreaterThan (0); } fangst (Unntak e) {fail ("Kunne ikke starte Jetty-server"); } til slutt {jettyServer.stop (); jettyServer.destroy (); }

4.2. Tomcat

Tomcat, en annen populær Java-innebygd server, fungerer litt annerledes. Vi kan spesifisere et eksplisitt portnummer via setPort metoden for Tomcat klasse. I tilfelle vi gir et portnummer null, tildeler Tomcat automatisk en gratis port. Imidlertid, hvis vi ikke angir noe portnummer, vil Tomcat bruke standardport 8080. Merk at standard Tomcat-porten kan være okkupert av andre applikasjoner:

Tomcat tomcatServer = ny Tomcat (); tomcatServer.setPort (0); prøv {tomcatServer.start (); assertThat (tomcatServer.getConnector (). getLocalPort ()). isGreaterThan (0); } catch (LifecycleException e) {fail ("Kunne ikke starte Tomcat-serveren"); } til slutt {tomcatServer.stop (); tomcatServer.destroy (); }

5. Konklusjon

I denne artikkelen undersøkte vi hvordan du sjekker en spesifikk portstatus. Vi dekket også å finne en gratis port fra en rekke portnumre og forklarte hvordan du bruker en automatisk tildelt gratisport.

I eksemplene dekket vi det grunnleggende ServerSocket klasse fra java.net API og andre populære serverimplementeringer, inkludert Jetty og Tomcat.

Som alltid er den komplette kildekoden tilgjengelig på GitHub.


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