Pronalaženje besplatnog priključka u Javi

1. Pregled

Prilikom pokretanja socket poslužitelja u našoj Java aplikaciji, java.net API zahtijeva da odredimo besplatni broj porta za slušanje. Broj porta potreban je kako bi TCP sloj mogao prepoznati aplikaciju kojoj su dolazni podaci namijenjeni.

Izričito navođenje broja porta nije uvijek dobra opcija, jer ga aplikacije možda već zauzimaju. To će prouzročiti ulazno / izlaznu iznimku u našoj Java aplikaciji.

U ovom ćemo brzom vodiču pogledati kako provjeriti određeni status priključka i kako koristiti automatski dodijeljeni. Istražit ćemo kako se to može učiniti pomoću običnog Java i Spring okvira. Također ćemo se osvrnuti na neke druge implementacije poslužitelja, poput ugrađenih Tomcat i Jetty.

2. Provjera statusa priključka

Pogledajmo kako možemo provjeriti je li određena luka slobodna ili zauzeta pomoću java.net API.

2.1. Smirna Luka

Iskoristit ćemo ServerSocket razred iz java.net API za stvaranje poslužiteljske utičnice, vezan za navedeni port. U svom konstruktoru, ServerSocket prihvaća eksplicitni broj porta. Razred također implementira Može se zatvoriti sučelje, tako da se može koristiti u pokušajte s resursima za automatsko zatvaranje utičnice i oslobađanje porta:

probajte (ServerSocket serverSocket = novi ServerSocket (FREE_PORT_NUMBER)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (FREE_PORT_NUMBER); } catch (IOException e) {fail ("Port nije dostupan"); }

U slučaju da dva puta koristimo određeni port ili ga već zauzima neka druga aplikacija, ServerSocket konstruktor će baciti IOException:

probajte (ServerSocket serverSocket = novi ServerSocket (FREE_PORT_NUMBER)) {novi ServerSocket (FREE_PORT_NUMBER); neuspjeh ("Isti priključak ne može se koristiti dva puta"); } catch (IOException e) {assertThat (e) .hasMessageContaining ("Adresa već u upotrebi"); }

2.2. Strort Domet

Provjerimo sada kako možemo iskoristiti bačeno IOException, za stvaranje poslužiteljske utičnice pomoću prve slobodne luke iz zadanog raspona brojeva priključaka:

for (int port: FREE_PORT_RANGE) {try (ServerSocket serverSocket = new ServerSocket (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (port); povratak; } catch (IOException e) {assertThat (e) .hasMessageContaining ("Adresa već u upotrebi"); }} fail ("Nije pronađen slobodan priključak u rasponu");

3. Pronalaženje slobodna luka

Korištenje eksplicitnog broja porta nije uvijek dobra opcija, pa razmotrimo mogućnosti automatskog dodjeljivanja besplatnog porta.

3.1. Obična Java

Možemo koristiti poseban broj ulaza nula u ServerSocket konstruktor klase. Kao rezultat, java.net API će nam automatski dodijeliti besplatni priključak:

probajte (ServerSocket serverSocket = novi ServerSocket (0)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isGreaterThan (0); } catch (IOException e) {fail ("Port nije dostupan"); }

3.2. Proljetni okvir

Proljetni okvir sadrži SocketUtils klase koju možemo koristiti za pronalaženje slobodne slobodne luke. Njegova interna implementacija koristi ServerSocket razreda, kao što je prikazano u našim prethodnim primjerima:

int port = SocketUtils.findAvailableTcpPort (); probajte (ServerSocket serverSocket = novi ServerSocket (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (port); } catch (IOException e) {fail ("Port nije dostupan"); }

4. Ostale implementacije poslužitelja

Pogledajmo sada neke druge popularne implementacije poslužitelja.

4.1. Brana

Jetty je vrlo popularan ugrađeni poslužitelj za Java programe. Automatski će nam dodijeliti besplatni priključak ukoliko ga izričito ne postavimo putem setPort metoda ServerConnector razred:

Poslužitelj jettyServer = novi poslužitelj (); ServerConnector serverConnector = novi ServerConnector (jettyServer); jettyServer.addConnector (serverConnector); isprobajte {jettyServer.start (); assertThat (serverConnector.getLocalPort ()). isGreaterThan (0); } catch (Iznimka e) {fail ("Nije uspjelo pokretanje Jetty poslužitelja"); } napokon {jettyServer.stop (); jettyServer.destroy (); }

4.2. Mačak

Tomcat, još jedan popularni Java ugrađeni poslužitelj, djeluje malo drugačije. Eksplicitni broj porta možemo odrediti putem setPort metoda Mačak razred. U slučaju da pružimo broj priključka nula, Tomcat će automatski dodijeliti besplatni priključak. Međutim, ako ne postavimo nijedan broj porta, Tomcat će upotrijebiti zadani port 8080. Imajte na umu da bi zadani port Tomcat mogli zauzeti druge aplikacije:

Tomcat tomcatServer = novi Tomcat (); tomcatServer.setPort (0); isprobajte {tomcatServer.start (); assertThat (tomcatServer.getConnector (). getLocalPort ()). isGreaterThan (0); } catch (LifecycleException e) {fail ("Nije uspjelo pokretanje Tomcat poslužitelja"); } napokon {tomcatServer.stop (); tomcatServer.destroy (); }

5. Zaključak

U ovom smo članku istražili kako provjeriti određeni status priključka. Također smo obradili pronalaženje besplatne luke iz niza brojeva luka i objasnili kako koristiti automatski dodijeljenu besplatnu luku.

U primjerima smo pokrili osnovno ServerSocket razred iz java.net API i druge popularne implementacije poslužitelja, uključujući Jetty i Tomcat.

Kao i uvijek, cjeloviti izvorni kod dostupan je na GitHub-u.


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