Pročitajte InputStream pomoću utičnice Java Server

1. Pregled

Za slanje i primanje podataka putem mreže često koristimo utičnice. Utičnice nisu ništa drugo nego kombinacija IP adrese i broja priključka, koji mogu jedinstveno identificirati program pokrenut na bilo kojem danom računalu.

U ovom uputstvu pokazat ćemo kako možemo čitati podatke koji nam se šalju putem utičnice.

2. Čitanje podataka iz utičnice

Pretpostavimo, imamo osnovno razumijevanje programiranja soketa.

Sad ćemo dublje pročitati podatke na priključku koji naš poslužitelj sluša.

Prvo, moramo deklarirati i inicijalizirati ServerSocket, Socket, i DataInputStream varijable:

ServerSocket server = novi ServerSocket (port); Socket socket = server.accept (); DataInputStream u = new DataInputStream (novi BufferedInputStream (socket.getInputStream ()));

Imajte na umu da smo odlučili zamotati utičnice InputStream u DataInputStream. To nam omogućuje čitanje redaka teksta i Java primitivnih vrsta podataka na prijenosni način.

Ovo je lijepo od sada, ako znamo vrstu podataka koje ćemo dobiti, možemo koristiti specijalizirane metode poput readChar (), readInt (), readDouble (), i readLine ().

Međutim, može biti izazov ako vrsta i duljina podataka nisu unaprijed poznati.

U tom ćemo slučaju dobiti tok bajtova iz utičnice, umjesto toga, koristeći nižu razinu čitati() funkcija. Ali, u ovom pristupu postoji mali problem: Kako znati dužinu i vrstu podataka koje ćemo dobiti?

Istražimo ovaj scenarij u sljedećem odjeljku.

3. Čitanje binarnih podataka iz utičnice

Kada čitamo podatke u bajtovima, moramo definirati vlastiti protokol za komunikaciju između poslužitelja i klijenta. Najjednostavniji protokol koji možemo definirati zove se TLV (Type Length Value). To znači da je svaka poruka napisana u utičnici u obliku Vrijednosti duljine tipa.

Dakle, svaku poslanu poruku definiramo kao:

  • A 1 bajt znak koji predstavlja tip podataka, poput s za Niz
  • A 4 bajt cijeli broj koji označava duljinu podataka
  • A onda stvarni podaci čija je duljina upravo naznačena

Jednom kada klijent i poslužitelj uspostave vezu, svaka će poruka slijediti ovaj format. Zatim možemo napisati naš kôd da raščlanimo svaku poruku i pročitamo n bajtova podataka određene vrste.

Pogledajmo kako to možemo primijeniti na jednostavnom primjeru s a Niz poruka.

Prvo, moramo nazvati readChar () funkcija, za čitanje vrste podataka i zatim pozivanje readInt () funkcija za čitanje duljine:

char dataType = in.readChar (); int dužina = in.readInt ();

Nakon toga moramo pročitati podatke koje dobivamo. Ovdje je važno napomenuti da čitati() funkcija možda neće moći čitati sve podatke u jednom pozivu. Dakle, moramo nazvati čitati() u neko vrijeme petlja:

if (dataType == 's') {byte [] messageByte = novi bajt [duljina]; boolean end = false; StringBuilder dataString = novi StringBuilder (duljina); int totalBytesRead = 0; while (! end) {int currentBytesRead = in.read (messageByte); totalBytesRead = currentBytesRead + totalBytesRead; if (totalBytesRead = dužina) {end = true; }}}

4. Klijentski kod za slanje podataka

I što je s kodom na strani klijenta? Zapravo je vrlo jednostavno:

char tip = 's'; // s za niz String data = "Ovo je niz duljine 29"; bajt [] dataInBytes = data.getBytes (StandardCharsets.UTF_8); out.writeChar (vrsta); out.writeInt (dataInBytes.length); out.write (dataInBytes);

To je sve što radi naš klijent!

5. Zaključak

U ovom smo članku razgovarali o tome kako čitati podatke iz utičnice. Pregledali smo različite funkcije koje nam pomažu čitati podatke određene vrste. Također, vidjeli smo kako čitati binarne podatke.

Potpuna implementacija ovog vodiča može se naći na GitHubu.


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