Find en fri port i Java

1. Oversigt

Når du starter en socketserver i vores Java-applikation, java.net API kræver, at vi angiver et gratis portnummer, som vi kan lytte til. Portnummeret kræves, så TCP-laget kan identificere den applikation, som de indgående data er beregnet til.

At angive et portnummer eksplicit er ikke altid en god mulighed, fordi applikationer muligvis allerede besætter det. Dette medfører en input / output-undtagelse i vores Java-applikation.

I denne hurtige vejledning ser vi på, hvordan man kontrollerer en bestemt portstatus, og hvordan man bruger en automatisk tildelt. Vi undersøger, hvordan dette kan gøres med almindelig Java- og Spring-ramme. Vi ser også på nogle andre serverimplementeringer, som indlejret Tomcat og Jetty.

2. Kontrol af portstatus

Lad os se på, hvordan vi kan kontrollere, om en bestemt port er ledig eller besat ved hjælp af java.net API.

2.1. Sspecifik havn

Vi gør brug af ServerSocket klasse fra java.net API til at oprette et serverstik, bundet til den angivne port. I sin konstruktør, det ServerSocket accepterer et eksplicit portnummer. Klassen implementerer også Kan lukkes interface, så det kan bruges i prøv med ressourcer for automatisk at lukke stikkontakten og frigø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 tilgængelig"); }

Hvis vi bruger en bestemt port to gange, eller hvis den allerede er besat af en anden applikation, ServerSocket konstruktør vil kaste en IOUndtagelse:

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

2.2. Port Rækkevidde

Lad os nu kontrollere, hvordan vi kan bruge kastet IO-undtagelse, at oprette et serverstik ved hjælp af den første ledige port fra et givet række portnumre:

til (int port: FREE_PORT_RANGE) {prøv (ServerSocket serverSocket = ny ServerSocket (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). er EqualTo (port); Vend tilbage; } fange (IOException e) {assertThat (e) .hasMessageContaining ("Adresse allerede i brug"); }} fail ("Ingen fri port i området fundet");

3. Finde en fri havn

Brug af et eksplicit portnummer er ikke altid en god mulighed, så lad os undersøge mulighederne for automatisk at tildele en gratis port.

3.1. Almindelig Java

Vi kan bruge et specielt portnummer nul i ServerSocket klassekonstruktør. Som et resultat af dette java.net API tildeler automatisk en gratis port til os:

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

3.2. Spring Framework

Forårsrammen indeholder en SocketUtils klasse, som vi kan bruge til at finde en ledig fri port. Dens interne implementering bruger ServerSocket klasse, som vist i vores 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 tilgængelig"); }

4. Andre serverimplementeringer

Lad os nu se på nogle andre populære serverimplementeringer.

4.1. Anløbsbro

Jetty er en meget populær integreret server til Java-applikationer. Det tildeler automatisk en gratis port til os, medmindre vi indstiller den eksplicit via setPort metode til ServerConnector klasse:

Server jettyServer = ny server (); ServerConnector serverConnector = ny ServerConnector (jettyServer); jettyServer.addConnector (serverConnector); prøv {jettyServer.start (); assertThat (serverConnector.getLocalPort ()). erGreaterThan (0); } fange (Undtagelse e) {fail ("Kunne ikke starte Jetty-server"); } endelig {jettyServer.stop (); jettyServer.destroy (); }

4.2. Tomcat

Tomcat, en anden populær Java-integreret server, fungerer lidt anderledes. Vi kan angive et eksplicit portnummer via setPort metode til Tomcat klasse. Hvis vi giver et portnummer nul, tildeler Tomcat automatisk en gratis port. Men hvis vi ikke indstiller noget portnummer, bruger Tomcat sin standardport 8080. Bemærk, at Tomcat-standardporten muligvis er optaget af andre applikationer:

Tomcat tomcatServer = ny Tomcat (); tomcatServer.setPort (0); prøv {tomcatServer.start (); assertThat (tomcatServer.getConnector (). getLocalPort ()). erGreaterThan (0); } fange (LifecycleException e) {fail ("Kunne ikke starte Tomcat-server"); } endelig {tomcatServer.stop (); tomcatServer.destroy (); }

5. Konklusion

I denne artikel undersøgte vi, hvordan man kontrollerer en bestemt portstatus. Vi dækkede også finde en fri port fra en række portnumre og forklarede, hvordan man bruger en automatisk tildelt fri port.

I eksemplerne dækkede vi det grundlæggende ServerSocket klasse fra java.net API og andre populære serverimplementeringer, herunder Jetty og Tomcat.

Som altid er den komplette kildekode tilgængelig på GitHub.


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