Műsorszórás és multicasting Java-ban

1. Bemutatkozás

Ebben a cikkben leírjuk, hogy miként kezelhető az egy az összes (Broadcast) és az egy a sokhoz (Multicast) kommunikáció a Java-ban. Az ebben a cikkben felvázolt broadcast és multicast koncepciók az UDP protokollon alapulnak.

Kezdjük a datagrammak és a műsorszórás gyors összefoglalásával, valamint annak megvalósításával a Java-ban. Megvizsgáljuk a műsorszolgáltatás hátrányait is, és a multicastingot javasoljuk a műsorszolgáltatás alternatívájaként.

Végül a két címzési módszer támogatását tárgyaljuk mind az IPv4, mind az IPv6 esetében.

2. Datagram összefoglaló

A datagram hivatalos meghatározása szerint: „A datagram egy független, önálló üzenet, amelyet a hálózaton keresztül küldenek, és amelynek érkezése, érkezési ideje és tartalma nem garantált.”

Java-ban az java.net csomag kiteszi a DatagramPacket és DatagramSocket osztályok, amelyek az UDP protokollon keresztüli kommunikációhoz használhatók. Az UDP-t általában olyan esetekben használják, amikor az alacsony késés fontosabb, mint a garantált kézbesítés, például audio / video streaming, hálózati felfedezés stb.

Ha többet szeretne megtudni a Java UDP-ről és datagrammjairól, olvassa el az Útmutató a Java UDP-hez című cikket.

3. Műsorszórás

A műsorszórás az összes kommunikáció típusa, vagyis az a szándék, hogy az datagramot elküldjük a hálózat összes csomópontjára. A pont-pont kommunikációtól eltérőennem kell tudnunk a célállomás IP-címét. Ehelyett egy broadcast címet használnak.

Az IPv4 protokoll szerint a műsorszórási cím logikai cím, amelyen a hálózathoz csatlakozó eszközök engedélyezik a csomagok fogadását. Példánkban egy adott IP-címet használunk, 255.255.255.255, amely a helyi hálózat sugárzott címe.

Értelemszerűen a helyi hálózatot más hálózatokkal összekötő útválasztók nem továbbítják az alapértelmezett broadcast címre küldött csomagokat. Később azt is megmutatjuk, hogyan tudjuk iterálni az összeset NetworkInterfaces, és küldjön csomagokat a megfelelő adási címükre.

Először bemutatjuk, hogyan lehet üzenetet sugározni. Ennyire meg kell hívnunk a setBroadcast () módszer a socketen, hogy tudassa vele, hogy a csomagot sugározni kell:

public class BroadcastingClient {privát statikus DatagramSocket socket = null; public static void main ((String [] args)) dobja az IOException {broadcast ("Hello", InetAddress.getByName ("255.255.255.255")); } public static void broadcast (String broadcastMessage, InetAddress address) dobja az IOException {socket = new DatagramSocket (); socket.setBroadcast (true); bájt [] puffer = broadcastMessage.getBytes (); DatagramPacket packet = új DatagramPacket (puffer, puffer.hossz, cím, 4445); socket.send (csomag); socket.close (); }}

A következő részlet azt mutatja be, hogyan kell iterálni az összeset NetworkInterfaces adáscímük megtalálásához:

List listAllBroadcastAddresses () dobja a SocketException {List broadcastList = new ArrayList (); Felsorolási felületek = NetworkInterface.getNetworkInterfaces (); while (interfaces.hasMoreElements ()) {NetworkInterface networkInterface = interfaces.nextElement (); if (networkInterface.isLoopback () ||! networkInterface.isUp ()) {folytatás; } networkInterface.getInterfaceAddresses (). stream () .map (a -> a.getBroadcast ()) .filter (Objects :: nonNull) .forEach (broadcastList :: add); } return broadcastList; }

Miután megvan a sugárzott címek listája, végrehajthatjuk a kódot a adás() A fenti módszer mindegyik címre vonatkozik.

Van nincs szükség külön kódra a fogadó oldalon sugárzott üzenet fogadására. Újrafelhasználhatjuk ugyanazt a kódot, amely egy normál UDP datagramot fogad. A Java-ban található UDP útmutató tartalmaz további részleteket erről a témáról.

4. Multicasting

A műsorszolgáltatás nem hatékony, mivel a csomagokat a hálózat minden csomópontjára elküldik, függetlenül attól, hogy érdekli-e őket a kommunikáció. Ez erőforrások pazarlása lehet.

A multicasting megoldja ezt a problémát, és csomagokat csak azoknak a fogyasztóknak küld, akik érdeklődnek. A multicasting a csoporttagság koncepcióján alapszik, ahol minden csoportot egy multicast cím képvisel.

Az IPv4-ben a 224.0.0.0 és a 239.255.255.255 közötti bármely cím használható multicast címként. Csak a csoporthoz előfizető csomópontok fogadnak csomaggal kommunikált csomagokat.

Java-ban MulticastSocket a multicast IP-re küldött csomagok fogadására szolgál. A következő példa bemutatja a MulticastSocket:

public class MulticastReceiver kiterjeszti a Thread-t {védett MulticastSocket socket = null; védett bájt [] buf = új bájt [256]; public void run () {socket = új MulticastSocket (4446); InetAddress csoport = InetAddress.getByName ("230.0.0.0"); socket.joinGroup (csoport); while (true) {DatagramPacket csomag = új DatagramPacket (buf, buf.length); socket.receive (csomag); String kapott = új karakterlánc (packet.getData (), 0, packet.getLength ()); if ("vége" .egyenlő (kapott)) {törés; }} socket.leaveGroup (csoport); socket.close (); }}

Megkötése után a MulticastSocket kikötőbe hívjuk a csapathoz csatlakozni() metódus, argumentumként a multicast IP. Erre azért van szükség, hogy meg tudjuk fogadni az ebben a csoportban közzétett csomagokat. A kilépés a csoportból() módszerrel lehet kilépni a csoportból.

A következő példa bemutatja, hogyan kell közzétenni egy multicast IP-n:

public class MulticastPublisher {private DatagramSocket socket; privát InetAddress csoport; privát bájt [] buf; public void multicast (String multicastMessage) dobja az IOException {socket = new DatagramSocket (); csoport = InetAddress.getByName ("230.0.0.0"); buf = multicastMessage.getBytes (); DatagramPacket packet = új DatagramPacket (buf, buf.length, group, 4446); socket.send (csomag); socket.close (); }}

5. Broadcast és IPv6

Az IPv4 háromféle címzést támogat: unicast, broadcast és multicast. A műsorszórás elméletileg egy az összes kommunikáció, vagyis egy eszközről küldött csomagnak lehetősége van elérni az egész internetet.

Mivel ez nyilvánvaló okokból nem kívánatos, az IPv4 sugárzás terjedelme jelentősen csökkent. A multicast, amely a közvetítés jobb alternatívájaként is szolgál, sokkal később érkezett, és ezért késett az elfogadásban.

Az IPv6-ban a multicast támogatást kötelezővé tették, és nincs kifejezett fogalma a műsorszolgáltatásnak. A multicast kibővítették és továbbfejlesztették, így az összes műsorszolgáltatási funkció megvalósítható valamilyen csoportos küldéssel.

Az IPv6-ban a cím bal szélső bitjeivel határozzák meg a típusát. Multicast cím esetén az első 8 bit mindegyike, azaz FF00 :: / 8. Ezenkívül a 113-116 bit a cím hatókörét jelöli, amely lehet a következő 4 vagy egyik: Globális, Helyi-helyi, Link-helyi, Csomópont-helyi.

Az unicast és a multicast mellett az IPv6 az anycast-ot is támogatja, amelyben csomagot küldhet a csoport bármely tagjának, de nem kell minden tagnak elküldeni.

6. Összefoglalás

Ebben a cikkben feltártuk az egy az összeset és az egy a sokhoz típusú kommunikáció fogalmait az UDP protokoll használatával. Láttunk példákat arra, hogyan lehet ezeket a koncepciókat Java-ban megvalósítani.

Végül feltártuk az IPv4 és az IPv6 támogatását is.

A teljes példakód elérhető a Github oldalon.