Java NIO (Non-blocking I/O) พร้อมตัวอย่างเซิร์ฟเวอร์-ไคลเอ็นต์ – java.nio.ByteBuffer และช่องสัญญาณ ตัวเลือก – Java NIO Vs. IO

เผยแพร่แล้ว: 2021-08-06
Java NIO (ไม่บล็อก I:O) พร้อมตัวอย่างเซิร์ฟเวอร์ - ไคลเอนต์ - CrunchifyNIOServer.java

Java NIO เป็นหัวข้อที่ฉันชอบ ฉันทำงานกับ NIO มาตั้งแต่ 2 ปีที่แล้ว และต้องการแชร์ Server-Client code แบบง่ายสำหรับผู้อ่านของฉันที่สามารถใช้รหัสนี้ในสภาพแวดล้อมที่ใช้งานจริงได้ฟรี

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

ในบทช่วยสอนนี้ เราจะพูดถึงไลบรารี java.nio.channels และ java.nio.channels.Selector

  • channels แสดงถึงการเชื่อมต่อกับเอนทิตีที่สามารถดำเนินการ I/O เช่น ไฟล์และซ็อกเก็ต กำหนด selectors สำหรับการดำเนินการ I/O แบบมัลติเพล็กซ์ที่ไม่ปิดกั้น
  • selector อาจถูกสร้างขึ้นโดยเรียกใช้ open method ของคลาสนี้ ซึ่งจะใช้ผู้ให้บริการตัวเลือกเริ่มต้นของระบบเพื่อสร้างตัวเลือกใหม่
คำอธิบายแพ็คเกจ java.nio พร้อมรายละเอียด API

หากคุณมี below questions แสดงว่าคุณมาถูกที่แล้ว:

  • วิธีเริ่มต้นใช้งาน Java NIO
  • บทช่วยสอน Java NIO และ Java NIO คืออะไร
  • Java NIO แบบอะซิงโครนัส
  • การใช้งานที่แน่นอนของแพ็คเกจ java nio คืออะไร
  • Java NIO บทช่วยสอน
  • วิธีการใช้ I/O ประสิทธิภาพสูงกับ Java NIO

มาเริ่มกันเลย:

ขั้นตอนที่ 1

  • สร้าง CrunchifyNIOServer.java ซึ่งเปิดการเชื่อมต่อบน port 1111
  • ใช้ isAcceptable() เพื่อตรวจสอบว่าช่องพร้อมที่จะยอมรับการเชื่อมต่อซ็อกเก็ตใหม่หรือไม่
    • ถ้าใช่ – เชื่อมต่อ
  • ใช้ isReadable() เพื่อตรวจสอบว่าช่องพร้อมสำหรับการอ่านหรือไม่
    • ถ้าใช่ – อ่านจากบัฟเฟอร์และพิมพ์บน Eclipse console
  • เมื่อคุณได้ชื่อบริษัทว่า “crunchify”
    • การเชื่อมต่ออย่างใกล้ชิด

ขั้นตอนที่ 2

  • สร้าง CrunchifyNIOClient.java ซึ่งพยายามเชื่อมต่อกับเซิร์ฟเวอร์บน port 1111
  • สร้าง ArrayList ด้วยชื่อบริษัท 5 บริษัท
  • วนซ้ำผ่าน ArrayList และส่งแต่ละบริษัทไปยังเซิร์ฟเวอร์
  • ปิดการเชื่อมต่อหลังจากเสร็จสิ้นภารกิจ

ดูโค้ด Java นี้:

รหัสเซิร์ฟเวอร์ – CrunchifyNIOServer.java


รหัสลูกค้า – CrunchifyNIOClient.java

Java NIO (ไม่บล็อก I:O) พร้อมตัวอย่างเซิร์ฟเวอร์ - ไคลเอนต์ - CrunchifyNIOClient.java

ผลลัพธ์ที่ฝั่งเซิร์ฟเวอร์:

ผลลัพธ์ที่ฝั่งไคลเอ็นต์:


คำถามที่พบบ่อย:

  1. จากลูกค้า ฉันจะรักษาการเชื่อมต่อแบบถาวรได้อย่างไร
    • คุณสามารถใช้ socket.setKeepAlive(true); เพื่อให้มีการเชื่อมต่อจากฝั่งไคลเอ็นต์
  2. ฉันจะอ่านการตอบกลับข้อความที่ฉันส่งไปยังเซิร์ฟเวอร์ได้อย่างไร เซิร์ฟเวอร์ยังคงสร้างข้อความทุกๆ 10 วินาที ฉันแค่ต้องอ่านการตอบกลับคำขอของฉัน จากสิ่งที่ฉันเข้าใจ ข้อมูล TCP "สตรีม" แทนการสิ้นสุดการบันทึก ฯลฯ
    • สำหรับการสื่อสารกับเซิร์ฟเวอร์ไคลเอ็นต์ ต้องมีการกำหนดโปรโตคอลให้ชัดเจน การโทร readLine() จะถูกบล็อกจนกว่าข้อมูลทั้งหมดจะถูกส่งคืน ดังนั้นอย่าใช้ Try reading bytes from the stream until -1 is returned.

แจ้งให้เราทราบหากใช้งานได้