Ahoj! Ako dodávateľ NIO som už nejaký čas po kolená vo svete distribuovaných systémov a Java NIO. Dnes sa s vami podelím o to, ako používať Java NIO na medziprocesovú komunikáciu v distribuovaných systémoch.
Čo je Java NIO?
Najprv si povedzme, čo je Java NIO. Java NIO (New I/O) je alternatívou k štandardnému Java I/O API. Bol predstavený v jazyku Java 1.4 s cieľom poskytnúť škálovateľnejší a efektívnejší spôsob spracovania vstupných a výstupných operácií. Na rozdiel od tradičného Java I/O, ktorý je založený na streame, Java NIO je založený na vyrovnávacej pamäti. To znamená, že údaje sa najskôr načítajú do vyrovnávacej pamäte a odtiaľ sa potom spracujú.
V distribuovanom systéme, kde na rôznych strojoch alebo na rovnakom stroji beží viacero procesov, je kľúčová medziprocesová komunikácia (IPC). Java NIO môže byť na to skvelým nástrojom, pretože umožňuje neblokujúce I/O operácie. Neblokovanie I/O znamená, že vlákno môže počas čakania na dokončenie I/O operácií vykonávať iné úlohy. Toto je mimoriadne dôležité v distribuovanom systéme, kde nechcete, aby jedna I/O operácia zablokovala celý proces.
Nastavenie prostredia
Predtým, ako sa ponoríme do kódu, musíte mať na svojom počítači nainštalovanú Javu. Môžete skontrolovať, či je Java nainštalovaná spustenímjava - verziavo vašom termináli. Ak nie je nainštalovaný, prejdite na oficiálnu webovú stránku Oracle alebo použite správcu balíkov, napraptna Ubuntu alebovariťv systéme macOS a nainštalovať ho.


Vytvorenie modelu jednoduchého servera - klienta
Začnime vytvorením jednoduchého modelu server - klient pomocou Java NIO pre IPC. Server bude počúvať prichádzajúce pripojenia a klient sa pripojí k serveru a odošle nejaké údaje.
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; public class NIOServer { public static void main(String[] args) { try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) { serverSocketChannel.socket().bind(new InetSocketAddress(8080)); System.out.println("Server počúva na porte 8080"); while (true) { SocketChannel socketChannel = serverSocketChannel.accept(); ByteBuffer buffer = ByteBuffer.allocate(1024); int bytesRead = socketChannel.read(buffer); while (bytesRead > 0) { buffer.flip(); byte[] data = new byte[buffer.limit()]; buffer.get(data); String message = new String(data); System.out.println("Prijaté: " + správa); buffer.clear(); bytesRead = socketChannel.read(buffer); } socketChannel.close(); } } catch (IOException e) { e.printStackTrace(); } } }
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; public class NIOClient { public static void main(String[] args) { try (SocketChannel socketChannel = SocketChannel.open()) { socketChannel.connect(new InetSocketAddress("localhost", 8080)); String message = "Dobrý deň, server! Toto je testovacia správa."; ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); socketChannel.write(buffer); System.out.println("Správa odoslaná na server."); } catch (IOException e) { e.printStackTrace(); } } }
V kóde servera najprv otvoríme aServerSocketChannela naviažeme ho na port 8080. Potom vstúpime do nekonečnej slučky na prijímanie prichádzajúcich spojení. Keď je spojenie prijaté, načítame údaje zSocketChanneldo aByteBuffer.
V kóde klienta otvoríme aSocketChannela pripojte ho k serveru, ktorý bežílocalhostna porte 8080. Potom zabalíme správu, ktorú chceme odoslať, do aByteBuffera napíšte to naSocketChannel.
Obsluha viacerých klientov
V reálnom distribuovanom systéme budete mať pravdepodobne viacero klientov pripojených k serveru. Java NIO uľahčuje obsluhu viacerých klientov pomocou selektorov. Selektor umožňuje jednému vláknu monitorovať viaceré kanály pre I/O udalosti, ako sú udalosti pripojenia, čítania a zápisu.
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; import java.util.Set; public class MultiClientServer { public static void main(String[] args) { try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) { serverSocketChannel.socket().bind(new InetSocketAddress(8080)); serverSocketChannel.configureBlocking(false); Selektor selektora = Selector.open(); serverSocketChannel.register(selektor, SelectionKey.OP_ACCEPT); System.out.println("Server počúva na porte 8080"); while (true) { int readyChannels = selector.select(); if (readyChannels == 0) pokračovať; Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if (key.isAcceptable()) { ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel(); SocketChannel socketChannel = serverChannel.accept(); socketChannel.configureBlocking(false); socketChannel.register(selektor, SelectionKey.OP_READ); } else if (key.isReadable()) { SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); int bytesRead = socketChannel.read(buffer); if (bytesRead > 0) { buffer.flip(); byte[] data = new byte[buffer.limit()]; buffer.get(data); String message = new String(data); System.out.println("Prijaté od klienta: " + správa); } } keyIterator.remove(); } } } catch (IOException e) { e.printStackTrace(); } } }
V tomto kóde najprv otvoríme aServerSocketChannela nakonfigurujte ho tak, aby bol neblokujúci. Potom otvoríme aSelektora zaregistrujte saServerSocketChannels tým preOP_ACCEPTudalosť.
V nekonečnej slučke volámeselector.select()čakať na I/O udalosti. Keď nastane udalosť, iterujeme cez vybrané klávesy. Ak je kľúč prijateľný, akceptujeme nové pripojenie a zaregistrujeme novéSocketChannels voličom preOP_READudalosť. Ak je kľúč čitateľný, načítame údaje zSocketChannel.
Používanie Java NIO v našich produktoch NIO
V našej spoločnosti používame Java NIO pre IPC v našich distribuovaných systémoch súvisiacich s elektrickými vozidlami. Napríklad vOnvo L90 Pro Six Seat Edition 2025,Onvo L90 Max Six Seat Edition 2025, aLedao L60 2025 Model 60kWh Verzia s pohonom zadných kolies, rôzne komponenty musia medzi sebou komunikovať. Java NIO nám pomáha dosiahnuť efektívnu a škálovateľnú komunikáciu medzi týmito komponentmi.
Záver
Java NIO je výkonný nástroj pre medziprocesovú komunikáciu v distribuovaných systémoch. Poskytuje neblokujúce I/O operácie, ktoré môžu výrazne zlepšiť výkon a škálovateľnosť vášho systému. Použitím selektorov môžete obsluhovať viacerých klientov pomocou jedného vlákna, vďaka čomu bude váš systém efektívnejší z hľadiska zdrojov.
Ak máte záujem o používanie Java NIO pre IPC vo vašich distribuovaných systémoch, najmä v súvislosti s produktmi elektrických vozidiel, ako sú naše, radi by sme sa porozprávali. Či už chcete optimalizovať svoje existujúce systémy alebo stavať nové úplne od začiatku, môžeme vám ponúknuť naše odborné znalosti a podporu. Neváhajte nás osloviť a začať diskusiu o obstarávaní a uvidíte, ako môžeme spolupracovať na dosiahnutí vašich cieľov.
Referencie
- "Java NIO" - oficiálna dokumentácia Oracle
- "Efektívna Java" od Joshuu Blocha