Sprievodca po UDP v Jave

1. Prehľad

V tomto článku sa budeme venovať sieťovej komunikácii s Javou prostredníctvom protokolu User Datagram Protocol (UDP).

UDP je komunikačný protokol, ktorý prenáša nezávislé pakety po sieti bez záruky príchodu a záruky doručenia.

Väčšina komunikácie cez internet sa uskutočňuje cez protokol Transmission Control Protocol (TCP), avšak UDP má svoje miesto, ktoré budeme skúmať v nasledujúcej časti.

2. Prečo používať UDP?

UDP sa dosť líši od bežnejšieho TCP. Ale skôr, ako zvážime nevýhody povrchovej úrovne UDP, je dôležité si uvedomiť, že nedostatok réžie ju môže výrazne zrýchliť ako TCP.

Okrem rýchlosti si musíme tiež uvedomiť, že niektoré druhy komunikácie nevyžadujú spoľahlivosť TCP, ale namiesto toho si cenia nízku latenciu. Video je dobrým príkladom aplikácie, ktorej by mohlo prospieť spustenie protokolu UDP namiesto protokolu TCP.

3. Vytváranie aplikácií UDP

Budovanie aplikácií UDP je veľmi podobné budovaniu systému TCP; jediný rozdiel je v tom, že medzi klientom a serverom nevytvoríme spojenie typu point to point.

Aj nastavenie je veľmi priame. Java sa dodáva so zabudovanou sieťovou podporou pre UDP - ktorá je súčasťou java.net balíček. Preto, aby sme mohli vykonávať sieťové operácie cez UDP, musíme iba importovať triedy z java.net balenie: java.net.DatagramSocket a java.net.DatagramPacket.

V nasledujúcich častiach sa naučíme, ako navrhovať aplikácie, ktoré komunikujú cez UDP; pre túto aplikáciu použijeme populárny echo protokol.

Najskôr postavíme echo server, ktorý odošle späť každú správu, ktorá mu bude zaslaná, potom echo klient, ktorý iba odošle ľubovoľnú správu na server a nakoniec aplikáciu otestujeme, aby sme zistili, či všetko funguje dobre.

4. Server

V komunikácii UDP je jediná správa zapuzdrená v a DatagramPacket ktorá sa posiela cez a DatagramSocket.

Začnime nastavením jednoduchého servera:

verejná trieda EchoServer rozširuje vlákno {súkromná zásuvka DatagramSocket; súkromný booleovský beh; súkromný bajt [] buf = nový bajt [256]; public EchoServer () {socket = new DatagramSocket (4445); } public void run () {running = true; while (running) {DatagramPacket packet = new DatagramPacket (buf, buf.length); socket.receive (paket); InetAddress address = packet.getAddress (); int port = packet.getPort (); paket = novy DatagramPacket (buf, buf.length, adresa, port); Prijatý reťazec = nový reťazec (packet.getData (), 0, packet.getLength ()); if (receive.equals ("end")) {running = false; ďalej; } socket.send (paket); } socket.close (); }}

Vytvárame globálny DatagramSocket ktoré budeme používať na odosielanie paketov, bajtové pole na zabalenie našich správ a stavovú premennú s názvom bežiaci.

Pre jednoduchosť sa server rozširuje Závit, takže môžeme implementovať všetko vo vnútri bežať metóda.

Vo vnútri bežať, vytvoríme while slučku, ktorá beží až do bežiaci sa zmení na nepravdivý chybou alebo ukončovacou správou od klienta.

V hornej časti slučky vytvoríme inštanciu a DatagramPacket prijímať prichádzajúce správy.

Ďalej voláme prijímať metóda na zásuvke. Táto metóda blokuje, kým nepríde správa, ktorá ju uloží do bajtového poľa súboru DatagramPacket prešlo na to.

Po prijatí správy získame adresu a port klienta, pretože sa chystáme poslať odpoveď

späť.

Ďalej vytvoríme a DatagramPacket za zaslanie správy klientovi. Všimnite si rozdiel v podpise prijímajúceho paketu. Tento tiež vyžaduje adresu a port klienta, ktorému správu odosielame.

5. Klient

Teraz uvedieme jednoduchého klienta pre tento nový server:

verejná trieda EchoClient {súkromná zásuvka DatagramSocket; súkromná adresa InetAddress; súkromný bajt [] buf; public EchoClient () {socket = new DatagramSocket (); address = InetAddress.getByName ("localhost"); } public String sendEcho (String msg) {buf = msg.getBytes (); Paket DatagramPacket = nový DatagramPacket (buf, buf.length, adresa, 4445); socket.send (paket); paket = novy DatagramPacket (buf, buf.length); socket.receive (paket); Prijatý reťazec = nový reťazec (packet.getData (), 0, packet.getLength ()); prijatý návrat; } public void close () {socket.close (); }}

Kód sa nelíši od kódu servera. Máme svoju globálnu DatagramSocket a adresa servera. Tieto vytvoríme inštanciou vo vnútri konštruktora.

Máme samostatnú metódu, ktorá odosiela správy na server a vracia odpovede.

Reťazcovú správu najskôr prevedieme na bajtové pole a potom vytvoríme a DatagramPacket na odosielanie správ.

Ďalej - správu odošleme. Okamžite konvertujeme DatagramPacket do prijímacieho.

Keď dorazí ozvena, prevedieme bajty na reťazec a reťazec vrátime.

6. Test

V triede UDPTest.java, jednoducho vytvoríme jeden test na kontrolu schopnosti ozveny našich dvoch aplikácií:

verejná trieda UDPTest {klient EchoClient; @ Pred public void setup () {new EchoServer (). Start (); klient = nový EchoClient (); } @Test public void whenCanSendAndReceivePacket_thenCorrect () {String echo = client.sendEcho ("ahoj server"); assertEquals ("ahoj server", echo); echo = client.sendEcho ("server funguje"); assertFalse (echo.equals ("ahoj server")); } @After public void tearDown () {client.sendEcho ("end"); client.close (); }}

V nastaviť, spustíme server a tiež vytvoríme klienta. Zatiaľ čo v strhnúť metódou, pošleme na server správu o ukončení, aby sa mohol zavrieť, a zároveň zavrieme klienta.

7. Záver

V tomto článku sme sa dozvedeli o protokole User Datagram Protocol a úspešne sme vytvorili vlastné aplikácie typu klient-server, ktoré komunikujú cez UDP.

Ak chcete získať úplný zdrojový kód príkladov použitých v tomto článku, môžete si vyskúšať projekt GitHub.