Olvasson el egy InputStream-et a Java Server Socket használatával

1. Áttekintés

Adatok hálózaton keresztül történő küldéséhez és fogadásához gyakran használunk aljzatokat. A foglalatok nem más, mint egy IP-cím és egy portszám kombinációja, amely egyedileg azonosíthatja az adott gépen futó programot.

Ebben az oktatóanyagban megmutatjuk, hogyan olvashatjuk el azokat az adatokat, amelyeket egy socketen keresztül kapunk.

2. Adatok olvasása egy aljzatból

Tegyük fel, hogy megértettük a socket programozást.

Most mélyebben elmélyülünk annak az adatnak az olvasásában, amelyet a szerverünk hallgat.

Először is deklarálnunk és inicializálnunk kell ServerSocket, Socket, és DataInputStream változók:

ServerSocket szerver = új ServerSocket (port); Socket socket = szerver.accept (); DataInputStream in = új DataInputStream (új BufferedInputStream (socket.getInputStream ()));

Ne feledje, hogy úgy döntöttünk, hogy becsomagoljuk az aljzatokat InputStream a DataInputStream. Ez lehetővé teszi számunkra, hogy egy szöveges és Java primitív adatsorokat hordozható módon olvassunk.

Ez jó, hiszen most már tudjuk, hogy milyen típusú adatokat kapunk, használhatunk olyan speciális módszereket, mint readChar (), readInt (), readDouble (), és readLine ().

Kihívást jelenthet azonban, ha az adatok típusa és hossza előzetesen nem ismert.

Ebben az esetben az aljzat használatával bájtfolyamot fogunk kapni a foglalatból olvas() funkció. De van egy kis probléma ebben a megközelítésben: Honnan tudhatjuk meg a kapott adatok hosszát és típusát?

Vizsgáljuk meg ezt a forgatókönyvet a következő szakaszban.

3. Bináris adatok olvasása egy foglalatból

Amikor az adatokat bájtokban olvassuk, meg kell határoznunk saját protokollunkat a szerver és az ügyfél közötti kommunikációhoz. A legegyszerűbb protokollt, amelyet meghatározhatunk, TLV-nek (Type Length Value) nevezzük. Ez azt jelenti, hogy minden, a socketbe írt üzenet a Type Length Value formátumú.

Tehát minden elküldött üzenetet így definiálunk:

  • A 1 byte karakter, amely az adattípust képviseli, mint a s mert Húr
  • A 4 byte egész szám, amely az adatok hosszát jelzi
  • És akkor a tényleges adatok, amelyek hosszát éppen feltüntették

Miután az ügyfél és a szerver létrehozta a kapcsolatot, minden üzenet ezt a formátumot fogja követni. Ezután megírhatjuk a kódunkat, hogy minden üzenetet elemezzünk és elolvassunk n meghatározott típusú adatok bájtjai.

Nézzük meg, hogyan tudjuk ezt megvalósítani egy egyszerű példa segítségével az a-val Húr üzenet.

Először hívnunk kell a readChar () függvény, az adatok típusának beolvasásához, majd a readInt () függvény hosszának leolvasására:

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

Ezt követően el kell olvasnunk a kapott adatokat. Fontos megjegyezni itt, hogy a olvas() Lehetséges, hogy a függvény nem tudja minden hívást elolvasni. Tehát, meg kell hívnunk a olvas() egy idő alatt:

if (dataType == 's') {byte [] messageByte = új byte [hossz]; logikai vég = hamis; StringBuilder dataString = új StringBuilder (hossz); int totalBytesRead = 0; while (! end) {int currentBytesRead = in.read (messageByte); totalBytesRead = currentBytesRead + totalBytesRead; if (totalBytesRead = hossz) {vég = igaz; }}}

4. Kliens kód az adatok küldéséhez

És mi a helyzet az ügyféloldali kóddal? Valójában ez nagyon egyszerű:

char type = 's'; // s for string String data = "Ez egy 29 hosszúságú karakterlánc"; bájt [] dataInBytes = data.getBytes (StandardCharsets.UTF_8); out.writeChar (típus); out.writeInt (dataInBytes.length); out.write (dataInBytes);

Ennyit csinál ügyfelünk!

5. Következtetés

Ebben a cikkben megvitattuk, hogyan lehet adatokat olvasni egy socketből. Különböző funkciókat vizsgáltunk, amelyek segítenek egy adott típusú adatok olvasásában. Láttuk, hogyan olvassuk le a bináris adatokat.

Az oktatóanyag teljes megvalósítása megtalálható a GitHub-on.