Les en InputStream ved hjelp av Java Server Socket

1. Oversikt

For å sende og motta data over et nettverk bruker vi ofte stikkontakter. Stikkontakter er bare en kombinasjon av en IP-adresse og et portnummer, som unikt kan identifisere et program som kjører på en gitt maskin.

I denne opplæringen viser vi hvordan vi kan lese data som sendes til oss via en stikkontakt.

2. Lese data fra en stikkontakt

La oss anta at vi har en grunnleggende forståelse av socket-programmering.

Nå skal vi grave dypere i å lese data på en port serveren vår lytter til.

For det første må vi erklære og initialisere ServerSocket, Socket, og DataInputStream variabler:

ServerSocket server = ny ServerSocket (port); Stikkontakt = server.accept (); DataInputStream in = ny DataInputStream (ny BufferedInputStream (socket.getInputStream ()));

Merk at vi har valgt å pakke kontaktene InputStream i en DataInputStream. Dette lar oss lese linjer i en tekst og primitive Java-datatyper på en bærbar måte.

Dette er fint siden nå, hvis vi vet hvilken type data vi vil motta, vi kan bruke spesialiserte metoder som readChar (), readInt (), readDouble (), og readLine ().

Det kan imidlertid være utfordrende hvis typen og lengden på data ikke er kjent på forhånd.

I så fall får vi en strøm av byte fra kontakten, i stedet for ved hjelp av det lavere nivået lese() funksjon. Men det er et lite problem i denne tilnærmingen: Hvordan vet vi lengden og typen data vi får?

La oss utforske dette scenariet i neste avsnitt.

3. Lese binære data fra en stikkontakt

Når vi leser data i byte, må vi definere vår egen protokoll for kommunikasjon mellom server og klient. Den enkleste protokollen som vi kan definere kalles TLV (Type Length Value). Det betyr at hver melding skrevet til kontakten er i form av Type Length Value.

Så vi definerer hver melding som sendes som:

  • A 1 byte tegn som representerer datatypen, som s til String
  • A 4 byte heltall som indikerer lengden på dataene
  • Og så de faktiske dataene, hvis lengde bare ble indikert

Når klienten og serveren har opprettet forbindelsen, vil hver melding følge dette formatet. Deretter kan vi skrive koden vår for å analysere hver melding og lese n byte med data av en bestemt type.

La oss se hvordan vi kan implementere dette ved hjelp av et enkelt eksempel med en String beskjed.

For det første må vi ringe readChar () funksjonen, for å lese datatypen og deretter ringe readInt () funksjon for å lese lengden på den:

char dataType = in.readChar (); int lengde = in.readInt ();

Etter det må vi lese dataene vi mottar. Et viktig poeng å merke seg her er at lese() funksjonen kan ikke lese alle dataene i en samtale. Så vi må ringe lese() i en stund løkke:

if (dataType == 's') {byte [] messageByte = ny byte [lengde]; boolsk ende = falsk; StringBuilder dataString = ny StringBuilder (lengde); int totalBytesRead = 0; while (! end) {int currentBytesRead = in.read (messageByte); totalBytesRead = currentBytesRead + totalBytesRead; hvis (totalBytesRead = lengde) {end = true; }}}

4. Kundekode for å sende data

Og hva med klientsidekoden? Egentlig er det ganske enkelt:

char type = 's'; // s for string String data = "Dette er en streng med lengde 29"; byte [] dataInBytes = data.getBytes (StandardCharsets.UTF_8); out.writeChar (type); out.writeInt (dataInBytes.length); out.write (dataInBytes);

Det er alt klienten vår gjør!

5. Konklusjon

I denne artikkelen diskuterte vi hvordan du leser data fra en stikkontakt. Vi så på forskjellige funksjoner som hjelper oss å lese data av en bestemt type. Vi så også hvordan vi skulle lese binære data.

Den fulle implementeringen av denne veiledningen finner du på GitHub.


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