Ingyenes port keresése a Java-ban

1. Áttekintés

Amikor Java alkalmazásunkban elindít egy socket szervert, a java.net Az API előírja, hogy adjunk meg egy szabad portszámot, amelyet hallgatni lehet. A portszámra azért van szükség, hogy a TCP réteg azonosítsa azt az alkalmazást, amelynek a bejövő adatokat szánják.

A portszám kifejezett megadása nem mindig jó lehetőség, mert előfordulhat, hogy az alkalmazások már elfoglalják azt. Ez bemeneti / kimeneti kivételt okoz a Java alkalmazásunkban.

Ebben a gyors bemutatóban megvizsgáljuk, hogyan lehet ellenőrizni egy adott port állapotát, és hogyan kell használni az automatikusan kiosztott portot. Megvizsgáljuk, hogyan lehet ezt megtenni egyszerű Java és Spring keretrendszerrel. Megvizsgálunk néhány más szerver megvalósítást is, mint például a beágyazott Tomcat és Jetty.

2. Port állapotának ellenőrzése

Nézzük meg, hogyan ellenőrizhetjük, hogy egy adott port szabad vagy foglalt-e a java.net API.

2.1. Ssajátos Port

Ki fogjuk használni a ServerSocket osztály a java.net API a szerver socket létrehozásához, a megadott porthoz kötve. A kivitelezőjében, a ServerSocket kifejezett port számot fogad el. Az osztály végrehajtja a Bezárható felületen, így a ban használható erőforrásokkal próbálkozzon a foglalat automatikus bezárásához és a port felszabadításához:

próbáld ki (ServerSocket serverSocket = új ServerSocket (FREE_PORT_NUMBER)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (FREE_PORT_NUMBER); } catch (IOException e) {fail ("A port nem elérhető"); }

Abban az esetben, ha egy adott portot kétszer használunk, vagy azt már egy másik alkalmazás foglalja el, a ServerSocket kivitelező dob egy IOException:

próbáld ki (ServerSocket serverSocket = új ServerSocket (FREE_PORT_NUMBER)) {új ServerSocket (FREE_PORT_NUMBER); fail ("Ugyanazt a portot nem lehet kétszer használni"); } catch (IOException e) {assertThat (e) .hasMessageContaining ("A cím már használatban van"); }

2.2. Port Hatótávolság

Ellenőrizzük most, hogyan tudjuk kihasználni a dobottakat IOException, kiszolgálói foglalat létrehozásához az első szabad port használatával egy adott portszámtartományból:

for (int port: FREE_PORT_RANGE) {try (ServerSocket serverSocket = új ServerSocket (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (port); Visszatérés; } catch (IOException e) {assertThat (e) .hasMessageContaining ("A cím már használatban van"); }} fail ("Nincs szabad port a tartományban");

3. Megtalálás egy szabad kikötő

A kifejezett portszám használata nem mindig jó lehetőség, ezért vizsgáljuk meg az ingyenes port automatikus kiosztásának lehetőségeit.

3.1. Sima Java

Használhatunk egy speciális nulla portot a ServerSocket osztály kivitelezője. Ennek eredményeként a java.net Az API automatikusan kioszt egy ingyenes portot számunkra:

próbáld ki (ServerSocket serverSocket = új ServerSocket (0)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isGreaterThan (0); } catch (IOException e) {fail ("A port nem elérhető"); }

3.2. Tavaszi keret

A tavaszi keret tartalmazza a SocketUtils osztály, amelyet felhasználhatunk egy elérhető szabad port megtalálásához. Belső megvalósítása a ServerSocket osztály, az előző példáink szerint:

int port = SocketUtils.findAvailableTcpPort (); próbáld ki (ServerSocket serverSocket = új ServerSocket (port)) {assertThat (serverSocket) .isNotNull (); assertThat (serverSocket.getLocalPort ()). isEqualTo (port); } catch (IOException e) {fail ("A port nem elérhető"); }

4. Egyéb szerver implementációk

Vessünk egy pillantást néhány más népszerű szerver megvalósításra.

4.1. Móló

A Jetty egy nagyon népszerű beágyazott szerver a Java alkalmazásokhoz. Automatikusan kioszt nekünk egy szabad portot, hacsak nem határozzuk meg kifejezetten a setPort módszere ServerConnector osztály:

Szerver jettyServer = új szerver (); ServerConnector serverConnector = új ServerConnector (jettyServer); jettyServer.addConnector (serverConnector); próbáld ki a {jettyServer.start (); assertThat (serverConnector.getLocalPort ()). isGreaterThan (0); } catch (e kivétel) {fail ("Nem sikerült elindítani a Jetty szervert"); } végül {jettyServer.stop (); jettyServer.destroy (); }

4.2. Kandúr

A Tomcat, egy másik népszerű Java beágyazott szerver, kicsit másképp működik. Megadhatunk egy explicit portszámot a setPort módszere Kandúr osztály. Abban az esetben, ha nulla portszámot adunk meg, a Tomcat automatikusan kioszt egy szabad portot. Ha azonban nem állítunk be portszámot, akkor a Tomcat az alapértelmezett 8080-as portot fogja használni. Vegye figyelembe, hogy az alapértelmezett Tomcat portot más alkalmazások is elfoglalhatják:

Tomcat tomcatServer = új Tomcat (); tomcatServer.setPort (0); próbáld ki a {tomcatServer.start (); assertThat (tomcatServer.getConnector (). getLocalPort ()). isGreaterThan (0); } catch (LifecycleException e) {fail ("Nem sikerült elindítani a Tomcat szervert"); } végül {tomcatServer.stop (); tomcatServer.destroy (); }

5. Következtetés

Ebben a cikkben azt kutattuk, hogyan lehet ellenőrizni egy adott port állapotát. Kitértünk arra is, hogy szabad portot találunk-e számos portszám közül, és elmagyaráztuk, hogyan kell használni az automatikusan kiosztott szabad portot.

A példákban kitértünk az alapra ServerSocket osztály a java.net API és más népszerű szerver implementációk, köztük a Jetty és a Tomcat.

Mint mindig, a teljes forráskód elérhető a GitHubon.