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.