Rad s mrežnim sučeljima u Javi

1. Pregled

U ovom ćemo se članku usredotočiti na mrežna sučelja i kako im programski pristupiti na Javi.

Jednostavno rečeno, a mrežno sučelje točka je međusobne povezanosti uređaja i bilo koje njegove mrežne veze.

U svakodnevnom ih jeziku nazivamo pojmom Network Interface Cards (NIC) - ali ne moraju svi biti hardverskog oblika.

Na primjer, popularni localhost IP 127.0.0.1, koje često koristimo u testiranju web i mrežnih aplikacija, je sučelje povratne petlje - koje nije izravno hardversko sučelje.

Naravno, sustavi često imaju više aktivnih mrežnih veza, kao što su žičani ethernet, WIFI, Bluetooth itd.

U Javi je glavni API koji možemo koristiti za izravnu interakciju s njima java.net.NetworkInterface razred. I zato, da bismo brzo započeli, uvezimo cijeli paket:

import java.net. *;

2. Zašto pristupiti mrežnim sučeljima?

Većina Java programa vjerojatno neće izravno komunicirati s njima; postoje, međutim, posebni scenariji kada nam treba ovakav pristup na niskoj razini.

Najizvrsnije od njih je kada sustav ima više kartica, a vi biste željeli imati sloboda izbora određenog sučelja s kojim će se koristiti utičnica. U takvom scenariju obično znamo ime, ali ne nužno i IP adresu.

Obično, kada želimo uspostaviti socket vezu na određenu adresu poslužitelja:

Socket socket = nova Socket (); socket.connect (nova InetSocketAddress (adresa, priključak));

Na taj će način sustav odabrati prikladnu lokalnu adresu, povezati se s njom i komunicirati s poslužiteljem putem mrežnog sučelja. Međutim, ovaj nam pristup ne dopušta da sami biramo.

Ovdje ćemo iznijeti pretpostavku; ne znamo adresu, ali znamo ime. Samo u svrhu demonstracije, pretpostavimo da želimo vezu preko povratnog sučelja, prema dogovoru, njegovo je ime eto, barem na Linuxu i Windows sustavima, na OSX-u jest lo0:

NetworkInterface nif = NetworkInterface.getByName ("lo"); Nabrajanje nifAddresses = nif.getInetAddresses (); Socket socket = nova Socket (); socket.bind (nova InetSocketAddress (nifAddresses.nextElement (), 0)); socket.connect (nova InetSocketAddress (adresa, priključak));

Tako dohvaćamo mrežno sučelje priključeno na eto prvo dohvatite adrese povezane s njim, stvorite utičnicu, povežite je s bilo kojom od pobrojanih adresa koje čak niti ne znamo u vrijeme sastavljanja, a zatim spojite.

A NetworkInterface objekt sadrži ime i skup dodijeljenih mu IP adresa. Tako će vezivanje za bilo koju od ovih adresa zajamčiti komunikaciju putem ovog sučelja.

To zapravo ne govori ništa posebno o API-ju. Znamo da bi, ako želimo da naša lokalna adresa bude localhost, bio dovoljan prvi isječak ako bismo samo dodali vezni kôd.

Uz to, nikada ne bismo stvarno morali proći svih nekoliko koraka jer localhost ima jednu dobro poznatu adresu, 127.0.0.1 i na nju možemo lako povezati utičnicu.

Međutim, u vašem slučaju, eto mogao predstavljati druga sučelja poput Bluetootha - net1, bežična mreža - net0 ili ethernet - eth0. U takvim slučajevima ne biste znali IP adresu u vrijeme sastavljanja.

3. Dohvaćanje mrežnih sučelja

U ovom ćemo odjeljku istražiti druge dostupne API-je za dohvaćanje dostupnih sučelja. U prethodnom smo odjeljku vidjeli samo jedan od ovih pristupa; the getByName () statička metoda.

Vrijedno je napomenuti da NetworkInterface class nema nijedan javni konstruktor, pa naravno nismo u mogućnosti stvoriti novu instancu. Umjesto toga, upotrijebit ćemo dostupne API-je za njegovo preuzimanje.

API koji smo do sada pogledali koristi se za pretraživanje mrežnog sučelja pod navedenim imenom:

@Test javna praznina givenName_whenReturnsNetworkInterface_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("lo"); assertNotNull (nif); }

Vraća se null ako nijedno nije za ime:

@Test javna praznina givenInExistentName_whenReturnsNull_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("nepostojeće_ime"); assertNull (nif); }

Drugi API je getByInetAddress (), također zahtijeva da pružimo poznati parametar, ovaj put možemo pružiti IP adresu:

@Test javna praznina danaIP_whenReturnsNetworkInterface_thenCorrect () {byte [] ip = novi bajt [] {127, 0, 0, 1}; NetworkInterface nif = NetworkInterface.getByInetAddress (InetAddress.getByAddress (ip)); assertNotNull (nif); }

Ili ime domaćina:

@Test javna praznina givenHostName_whenReturnsNetworkInterface_thenCorrect () {NetworkInterface nif = NetworkInterface.getByInetAddress (InetAddress.getByName ("localhost")); assertNotNull (nif); }

Ili ako ste specifični za localhost:

@Test javna praznina givenLocalHost_whenReturnsNetworkInterface_thenCorrect () {NetworkInterface nif = NetworkInterface.getByInetAddress (InetAddress.getLocalHost ()); assertNotNull (nif); }

Druga je alternativa također eksplicitna upotreba povratnog sučelja:

@Test javna praznina givenLoopBack_whenReturnsNetworkInterface_thenCorrect () {NetworkInterface nif = NetworkInterface.getByInetAddress (InetAddress.getLoopbackAddress ()); assertNotNull (nif); }

Treći pristup koji je dostupan tek od Jave 7 jest dobivanje mrežnog sučelja prema njegovom indeksu:

NetworkInterface nif = NetworkInterface.getByIndex (int indeks);

Konačni pristup uključuje upotrebu getNetworkInterfaces API. Vraća Nabrajanje svih dostupnih mrežnih sučelja u sustavu. Na nama je da vratimo vraćene objekte u petlju, standardni idiom koristi a Popis:

Mreže za nabrajanje = NetworkInterface.getNetworkInterfaces (); for (NetworkInterface nif: Collections.list (nets)) {// učiniti nešto s mrežnim sučeljem}

4. Parametri mrežnog sučelja

Mnogo je dragocjenih podataka koje možemo dobiti od jednog nakon dohvaćanja njegovog predmeta. Jedan od najkorisnijih je popis IP adresa koje su mu dodijeljene.

IP adrese možemo dobiti pomoću dva API-ja. Prvi API je getInetAddresses (). Vraća Nabrajanje od InetAddress slučajevi koje možemo obraditi kako smatramo potrebnima:

@Test javna praznina givenInterface_whenReturnsInetAddresses_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("lo"); Adresa enumeracijeEnum = nif.getInetAddresses (); InetAddress adresa = addressEnum.nextElement (); assertEquals ("127.0.0.1", address.getHostAddress ()); }

Drugi API je getInterfaceAddresses (). Vraća a Popis od Adresa sučelja slučajevi koji su moćniji od InetAddress instance. Na primjer, osim IP adrese, možda će vas zanimati adresa emitiranja:

@Test javna praznina givenInterface_whenReturnsInterfaceAddresses_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("lo"); Popis addressEnum = nif.getInterfaceAddresses (); Adresa sučelja sučelja = addressEnum.get (0); InetAddress localAddress = address.getAddress (); InetAddress broadCastAddress = address.getBroadcast (); assertEquals ("127.0.0.1", localAddress.getHostAddress ()); assertEquals ("127.255.255.255", broadCastAddress.getHostAddress ()); }

Možemo pristupiti mrežnim parametrima o sučelju izvan imena i IP adresa koje su mu dodijeljene. Da biste provjerili radi li i radi:

@Test javna praznina givenInterface_whenChecksIfUp_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("lo"); assertTrue (nif.isUp ()); }

Da biste provjerili radi li se o povratnom sučelju:

@Test javna praznina givenInterface_whenChecksIfLoopback_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("lo"); assertTrue (nif.isLoopback ()); }

Da biste provjerili predstavlja li mrežnu vezu od točke do točke:

@Test javna praznina givenInterface_whenChecksIfPointToPoint_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("lo"); assertFalse (nif.isPointToPoint ()); }

Ili ako se radi o virtualnom sučelju:

@Test javna praznina givenInterface_whenChecksIfVirtual_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("lo"); assertFalse (nif.isVirtual ()); }

Da biste provjerili je li podržano multicasting:

@Test javna praznina givenInterface_whenChecksMulticastSupport_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("lo"); assertTrue (nif.supportsMulticast ()); }

Ili da biste dohvatili njegovu fizičku adresu, koja se obično naziva MAC adresa:

@Test javna praznina givenInterface_whenGetsMacAddress_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("lo"); bajt [] bajtova = nif.getHardwareAddress (); assertNotNull (bajtovi); }

Sljedeći je parametar Maksimalna prijenosna jedinica koja definira najveću veličinu paketa koja se može prenijeti putem ovog sučelja:

@Test javna praznina givenInterface_whenGetsMTU_thenCorrect () {NetworkInterface nif = NetworkInterface.getByName ("net0"); int mtu = nif.getMTU (); assertEquals (1500, mtu); }

5. Zaključak

U ovom smo članku prikazali mrežna sučelja, kako im programski pristupiti i zašto bismo im trebali pristupiti.

Potpuni izvorni kod i uzorci korišteni u ovom članku dostupni su u projektu Github.


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