Bok tamo! Kao NIO dobavljač, bio sam do koljena u svijetu distribuiranih sustava i Java NIO već neko vrijeme. Danas ću s vama podijeliti kako koristiti Java NIO za međuprocesnu komunikaciju u distribuiranim sustavima.
Što je Java NIO?
Kao prvo, razgovarajmo o tome što je Java NIO. Java NIO (New I/O) alternativa je standardnom Java I/O API-ju. Predstavljen je u Javi 1.4 kako bi pružio skalabilniji i učinkovitiji način rukovanja ulaznim i izlaznim operacijama. Za razliku od tradicionalnog Java I/O, koji se temelji na streamu, Java NIO se temelji na međuspremniku. To znači da se podaci prvo čitaju u međuspremnik, a zatim se iz njega obrađuju.
U distribuiranom sustavu, gdje se više procesa izvodi na različitim strojevima ili na istom stroju, međuprocesna komunikacija (IPC) je ključna. Java NIO može biti izvrstan alat za to jer dopušta neblokirajuće I/O operacije. Neblokirajući I/O znači da nit može obavljati druge zadatke dok čeka da se I/O operacije završe. Ovo je jako važno u distribuiranom sustavu gdje ne želite da jedna I/O operacija blokira cijeli proces.
Postavljanje okoline
Prije nego što zaronimo u kod, morate imati instaliranu Javu na vašem računalu. Možete provjeriti je li Java instalirana pokretanjemjava - verzijau vašem terminalu. Ako nije instaliran, prijeđite na službenu Oracle web stranicu ili upotrijebite upravitelj paketa poputprikladanna Ubuntu iliskuhatina macOS da biste ga instalirali.


Stvaranje jednostavnog modela poslužitelja - klijenta
Započnimo stvaranjem jednostavnog modela poslužitelj - klijent koristeći Java NIO za IPC. Poslužitelj će osluškivati dolazne veze, a klijent će se spojiti na poslužitelj i poslati neke podatke.
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("Poslužitelj sluša port 8080"); while (true) { SocketChannel socketChannel = serverSocketChannel.accept(); Međuspremnik ByteBuffer = ByteBuffer.allocate(1024); int bytesRead = socketChannel.read(buffer); while (bytesRead > 0) { buffer.flip(); bajt[] podaci = novi bajt[buffer.limit()]; međuspremnik.get(podaci); String poruka = novi niz(podaci); System.out.println("Primljeno: " + poruka); međuspremnik.očisti(); 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 = "Hello, server! Ovo je probna poruka."; ByteBuffer međuspremnik = ByteBuffer.wrap(message.getBytes()); socketChannel.write(buffer); System.out.println("Poruka poslana poslužitelju."); } catch (IOException e) { e.printStackTrace(); } } }
U kodu poslužitelja prvo otvaramo aServerSocketChanneli vežemo ga na port 8080. Zatim ulazimo u beskonačnu petlju za prihvaćanje dolaznih veza. Kada je veza prihvaćena, čitamo podatke izSocketChannelu aByteBuffer.
U kodu klijenta otvaramo aSocketChanneli spojite ga na poslužitelj koji radilokalni domaćinna portu 8080. Zatim, omotamo poruku koju želimo poslati u aByteBufferi napiši to naSocketChannel.
Rukovanje s više klijenata
U distribuiranom sustavu u stvarnom svijetu, vjerojatno ćete imati više klijenata koji se povezuju na poslužitelj. Java NIO olakšava rukovanje višestrukim klijentima pomoću selektora. Selektor omogućuje jednoj niti da prati više kanala za I/O događaje kao što su događaji veze, čitanja i pisanja.
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); Selector selector = Selector.open(); serverSocketChannel.register(selektor, SelectionKey.OP_ACCEPT); System.out.println("Poslužitelj sluša port 8080"); while (true) { int readyChannels = selector.select(); if (readyChannels == 0) nastaviti; Postavi<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(); Međuspremnik ByteBuffer = ByteBuffer.allocate(1024); int bytesRead = socketChannel.read(buffer); if (bytesRead > 0) { buffer.flip(); bajt[] podaci = novi bajt[buffer.limit()]; međuspremnik.get(podaci); String poruka = novi niz(podaci); System.out.println("Primljeno od klijenta: " + poruka); } } keyIterator.remove(); } } } catch (IOException e) { e.printStackTrace(); } } }
U ovom kodu prvo otvaramo aServerSocketChanneli konfigurirajte ga da ne blokira. Zatim otvaramo aSelektori registrirajteServerSocketChannels njim zaOP_ACCEPTdogađaj.
U beskonačnoj petlji pozivamoselektor.select()čekati I/O događaje. Kada se dogodi događaj, ponavljamo odabrane ključeve. Ako je ključ prihvatljiv, prihvaćamo novu vezu i registriramo novuSocketChannelsa selektorom zaOP_READdogađaj. Ako je ključ čitljiv, čitamo podatke izSocketChannel.
Korištenje Java NIO-a u našim NIO proizvodima
U našoj tvrtki koristimo Java NIO za IPC u našim distribuiranim sustavima vezanim uz električna vozila. Na primjer, uOnvo L90 Pro Six Seat Edition 2025,Onvo L90 Max Six Seat Edition 2025, iLedao L60 2025 Model 60kWh Verzija sa stražnjim pogonom, različite komponente moraju međusobno komunicirati. Java NIO nam pomaže postići učinkovitu i skalabilnu komunikaciju između ovih komponenti.
Zaključak
Java NIO je moćan alat za međuprocesnu komunikaciju u distribuiranim sustavima. Omogućuje neblokirajuće I/O operacije, koje mogu značajno poboljšati performanse i skalabilnost vašeg sustava. Korištenjem selektora, možete upravljati s više klijenata s jednom niti, čineći vaš sustav resursno učinkovitijim.
Ako ste zainteresirani za korištenje Java NIO za IPC u vašim distribuiranim sustavima, posebno u kontekstu proizvoda za električna vozila poput našeg, voljeli bismo razgovarati. Bilo da želite optimizirati svoje postojeće sustave ili izgraditi nove od nule, možemo vam ponuditi našu stručnost i podršku. Slobodno nam se obratite kako bismo započeli raspravu o nabavi i vidjeli kako možemo zajedno raditi na postizanju vaših ciljeva.
Reference
- "Java NIO" - Oracle službena dokumentacija
- "Učinkovita Java" Joshue Blocha