+8618733125097
ค้นหา
thภาษา

จะใช้ Java NIO สำหรับการสื่อสารระหว่างกระบวนการในระบบแบบกระจายได้อย่างไร

Oct 27, 2025

โซเฟียเทย์เลอร์
โซเฟียเทย์เลอร์
โซเฟียเป็นนักวิจัยการตลาดที่ Zelian เธอดำเนินการวิจัยเชิงลึกเกี่ยวกับตลาดรถยนต์ในกว่า 30 ประเทศและภูมิภาคที่ บริษัท ดำเนินงานให้ข้อมูลเชิงลึกที่มีคุณค่าสำหรับการตัดสินใจทางธุรกิจของ บริษัท

เฮ้! ในฐานะซัพพลายเออร์ของ NIO ฉันเคยจมอยู่ในโลกของระบบแบบกระจายและ Java NIO มาระยะหนึ่งแล้ว วันนี้ ผมจะแบ่งปันวิธีใช้ Java NIO สำหรับการสื่อสารระหว่างกระบวนการในระบบแบบกระจาย

Java NIO คืออะไร?

ก่อนอื่น เรามาพูดถึง Java NIO กันดีกว่า Java NIO (I/O ใหม่) เป็นทางเลือกแทน Java I/O API มาตรฐาน เปิดตัวใน Java 1.4 เพื่อให้มีวิธีการจัดการอินพุตและเอาต์พุตที่ปรับขนาดได้และมีประสิทธิภาพมากขึ้น ต่างจาก Java I/O แบบดั้งเดิมซึ่งใช้สตรีม แต่ Java NIO เป็นแบบบัฟเฟอร์ ซึ่งหมายความว่าข้อมูลจะถูกอ่านลงในบัฟเฟอร์ก่อน จากนั้นจึงประมวลผลจากที่นั่น

ในระบบแบบกระจาย ซึ่งกระบวนการต่างๆ ทำงานบนเครื่องที่แตกต่างกันหรือเครื่องเดียวกัน การสื่อสารระหว่างกระบวนการ (IPC) ถือเป็นสิ่งสำคัญ Java NIO สามารถเป็นเครื่องมือที่ยอดเยี่ยมสำหรับสิ่งนี้ เนื่องจากช่วยให้สามารถดำเนินการ I/O แบบไม่บล็อกได้ I/O ที่ไม่บล็อกหมายความว่าเธรดสามารถทำงานอื่นๆ ในขณะที่รอการดำเนินการ I/O ให้เสร็จสิ้น นี่เป็นสิ่งสำคัญอย่างยิ่งในระบบแบบกระจายที่คุณไม่ต้องการให้มีการดำเนินการ I/O เพียงครั้งเดียวเพื่อบล็อกกระบวนการทั้งหมด

การตั้งค่าสภาพแวดล้อม

ก่อนที่เราจะเจาะลึกโค้ด คุณต้องติดตั้ง Java บนเครื่องของคุณเสียก่อน คุณสามารถตรวจสอบว่าติดตั้ง Java ไว้หรือไม่โดยการรันชวา - เวอร์ชันในเทอร์มินัลของคุณ หากยังไม่ได้ติดตั้ง ให้ไปที่เว็บไซต์อย่างเป็นทางการของ Oracle หรือใช้ตัวจัดการแพ็คเกจเช่นฉลาดบน Ubuntu หรือชงบน macOS เพื่อติดตั้ง

Onvo L90 Pro Six Seat Edition 2025 suppliersOnvo L90 Max Six Seat Edition 2025 high quality

การสร้างเซิร์ฟเวอร์อย่างง่าย - โมเดลไคลเอนต์

เริ่มต้นด้วยการสร้างเซิร์ฟเวอร์แบบง่าย - โมเดลไคลเอนต์โดยใช้ Java NIO สำหรับ IPC เซิร์ฟเวอร์จะรับฟังการเชื่อมต่อขาเข้า และไคลเอนต์จะเชื่อมต่อกับเซิร์ฟเวอร์และส่งข้อมูลบางส่วน

นำเข้า java.io.IOException; นำเข้า java.net.InetSocketAddress; นำเข้า java.nio.ByteBuffer; นำเข้า java.nio.channels.ServerSocketChannel; นำเข้า java.nio.channels.SocketChannel; NIOServer ระดับสาธารณะ { โมฆะสาธารณะคงหลัก (สตริง [] args) { ลอง (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) { serverSocketChannel.socket().bind (ใหม่ InetSocketAddress (8080)); System.out.println("เซิร์ฟเวอร์กำลังฟังพอร์ต 8080"); ในขณะที่ (จริง) { SocketChannel socketChannel = serverSocketChannel.accept (); ByteBuffer buffer = ByteBuffer.allocate (1024); int bytesRead = socketChannel.read (บัฟเฟอร์); ในขณะที่ (bytesRead > 0) { buffer.flip(); ไบต์ [] ข้อมูล = ไบต์ใหม่ [buffer.limit()]; buffer.get(ข้อมูล); ข้อความสตริง = สตริงใหม่ (ข้อมูล); System.out.println("ได้รับ: " + ข้อความ); บัฟเฟอร์.ชัดเจน(); bytesRead = socketChannel.read (บัฟเฟอร์); } socketChannel.close(); } } catch (IOException e) { e.printStackTrace(); -
นำเข้า java.io.IOException; นำเข้า java.net.InetSocketAddress; นำเข้า java.nio.ByteBuffer; นำเข้า java.nio.channels.SocketChannel; NIOClient ระดับสาธารณะ { โมฆะสาธารณะหลัก (สตริง [] args) { ลอง (SocketChannel socketChannel = SocketChannel.open()) { socketChannel.connect (ใหม่ InetSocketAddress ("localhost", 8080)); String message = "สวัสดีเซิร์ฟเวอร์! นี่คือข้อความทดสอบ"; ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); socketChannel.write (บัฟเฟอร์); System.out.println("ข้อความที่ส่งไปยังเซิร์ฟเวอร์"); } จับ (IOException e) { e.printStackTrace(); -

ในรหัสเซิร์ฟเวอร์ อันดับแรกเราจะเปิด aServerSocketChannelและผูกเข้ากับพอร์ต 8080 จากนั้นเราเข้าสู่วงวนไม่สิ้นสุดเพื่อยอมรับการเชื่อมต่อขาเข้า เมื่อการเชื่อมต่อได้รับการยอมรับ เราจะอ่านข้อมูลจากซ็อกเก็ตช่องเข้าไปในByteBuffer-

ในรหัสลูกค้า เราจะเปิดไฟล์ซ็อกเก็ตช่องและเชื่อมต่อกับเซิร์ฟเวอร์ที่ทำงานอยู่โลคัลโฮสต์ที่พอร์ต 8080 จากนั้นเราก็ Wrap ข้อความที่ต้องการส่งเข้าไปByteBufferและเขียนมันไปที่ซ็อกเก็ตช่อง-

การจัดการลูกค้าหลายราย

ในระบบแบบกระจายในโลกแห่งความเป็นจริง คุณน่าจะมีไคลเอนต์หลายตัวเชื่อมต่อกับเซิร์ฟเวอร์ Java NIO ทำให้ง่ายต่อการจัดการไคลเอนต์หลายตัวโดยใช้ตัวเลือก ตัวเลือกอนุญาตให้เธรดเดียวตรวจสอบหลายช่องสำหรับเหตุการณ์ I/O เช่น การเชื่อมต่อ การอ่าน และการเขียนเหตุการณ์

นำเข้า java.io.IOException; นำเข้า java.net.InetSocketAddress; นำเข้า java.nio.ByteBuffer; นำเข้า java.nio.channels.SelectionKey; นำเข้า java.nio.channels.Selector; นำเข้า java.nio.channels.ServerSocketChannel; นำเข้า java.nio.channels.SocketChannel; นำเข้า java.util.Iterator; นำเข้า java.util.Set; MultiClientServer ระดับสาธารณะ { โมฆะสาธารณะคงหลัก (สตริง [] args) { ลอง (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) { serverSocketChannel.socket().bind (ใหม่ InetSocketAddress (8080)); serverSocketChannel.configureBlocking (เท็จ); ตัวเลือก ตัวเลือก = Selector.open(); serverSocketChannel.register (ตัวเลือก, SelectionKey.OP_ACCEPT); System.out.println("เซิร์ฟเวอร์กำลังฟังพอร์ต 8080"); ในขณะที่ (จริง) { int readyChannels = selector.select(); ถ้า (readyChannels == 0) ดำเนินการต่อ; ตั้งค่า <SelectionKey> คีย์ที่เลือก = selector.selectedKeys(); ตัววนซ้ำ<SelectionKey> keyIterator = SelectedKeys.iterator(); ในขณะที่ (keyIterator.hasNext()) { คีย์ SelectionKey = keyIterator.next(); ถ้า (key.isAcceptable()) { ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel(); SocketChannel socketChannel = serverChannel.accept(); socketChannel.configureBlocking (เท็จ); socketChannel.register (ตัวเลือก, SelectionKey.OP_READ); } อื่น ๆ ถ้า (key.isReadable()) { SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate (1024); int bytesRead = socketChannel.read (บัฟเฟอร์); ถ้า (bytesRead > 0) { buffer.flip(); ไบต์ [] ข้อมูล = ไบต์ใหม่ [buffer.limit()]; buffer.get(ข้อมูล); ข้อความสตริง = สตริงใหม่ (ข้อมูล); System.out.println("ได้รับจากไคลเอนต์: " + ข้อความ); } } keyIterator.remove(); } } } catch (IOException e) { e.printStackTrace(); -

ในโค้ดนี้ เราจะเปิดไฟล์ aServerSocketChannelและกำหนดค่าให้ไม่ปิดกั้น จากนั้นเราก็เปิดกตัวเลือกและลงทะเบียนServerSocketChannelกับมันเพื่อOP_ยอมรับเหตุการณ์.

ในวงวนอนันต์เราเรียกว่าตัวเลือก.เลือก()เพื่อรอเหตุการณ์ I/O เมื่อมีเหตุการณ์เกิดขึ้น เราจะวนซ้ำคีย์ที่เลือก หากยอมรับคีย์ได้ เราจะยอมรับการเชื่อมต่อใหม่และลงทะเบียนการเชื่อมต่อใหม่ซ็อกเก็ตช่องด้วยตัวเลือกสำหรับOP_READเหตุการณ์. หากคีย์สามารถอ่านได้ เราจะอ่านข้อมูลจากซ็อกเก็ตช่อง-

การใช้ Java NIO ในผลิตภัณฑ์ NIO ของเรา

ที่บริษัทของเรา เราใช้ Java NIO สำหรับ IPC ในระบบแบบกระจายที่เกี่ยวข้องกับยานพาหนะไฟฟ้า ตัวอย่างเช่นในOnvo L90 Pro รุ่นหกที่นั่ง ปี 2025-Onvo L90 รุ่น Max หกที่นั่ง ปี 2025, และLedao L60 2025 รุ่น 60kWh รุ่นขับเคลื่อนล้อหลังส่วนประกอบที่แตกต่างกันจำเป็นต้องสื่อสารถึงกัน Java NIO ช่วยให้เราบรรลุการสื่อสารที่มีประสิทธิภาพและปรับขนาดได้ระหว่างส่วนประกอบเหล่านี้

บทสรุป

Java NIO เป็นเครื่องมืออันทรงพลังสำหรับการสื่อสารระหว่างกระบวนการในระบบแบบกระจาย โดยให้การดำเนินการ I/O แบบไม่ปิดกั้น ซึ่งสามารถปรับปรุงประสิทธิภาพและความสามารถในการปรับขนาดของระบบของคุณได้อย่างมาก ด้วยการใช้ตัวเลือก คุณสามารถจัดการไคลเอนต์หลายตัวด้วยเธรดเดียว ทำให้ระบบของคุณมีประสิทธิภาพด้านทรัพยากรมากขึ้น

หากคุณสนใจที่จะใช้ Java NIO สำหรับ IPC ในระบบแบบกระจายของคุณ โดยเฉพาะอย่างยิ่งในบริบทของผลิตภัณฑ์รถยนต์ไฟฟ้าเช่นเรา เรายินดีเป็นอย่างยิ่งที่จะพูดคุยกัน ไม่ว่าคุณกำลังมองหาการเพิ่มประสิทธิภาพระบบที่มีอยู่ของคุณหรือสร้างระบบใหม่ตั้งแต่ต้น เราก็สามารถเสนอความเชี่ยวชาญและการสนับสนุนของเราได้ โปรดติดต่อเราเพื่อเริ่มการสนทนาเรื่องการจัดซื้อจัดจ้างและดูว่าเราจะทำงานร่วมกันเพื่อบรรลุเป้าหมายของคุณได้อย่างไร

อ้างอิง

  • "Java NIO" - เอกสารอย่างเป็นทางการของ Oracle
  • "Effective Java" โดย Joshua Bloch

ส่งคำถาม