一、回传协议接口和 TCP 方式实现:
1. 接口:
นำเข้า java.nio.channels.SelectionKey; นำเข้า java.io.ioException; ส่วนต่อประสานสาธารณะ echoprotocol {โมฆะ handleaccept (selectionKey key) พ่น IOException; โมฆะ Handleread (SelectionKey Key) พ่น IOException; Void HandleWrite (SelectionKey Key) พ่น IOException; -2. 实现:
นำเข้า java.nio.channels.*; นำเข้า java.nio.bytebuffer; นำเข้า java.io.ioException; ระดับสาธารณะ TCPechoselectorProtocol ใช้ echoprotocol {ส่วนตัว int bufsize; // ขนาดของ I/O บัฟเฟอร์สาธารณะ echoselectorProtocol (int bufsize) {this.bufsize = bufsize; } โมฆะสาธารณะ handleaccept (selectionKey key) พ่น IOException {SocketChannel clntchan = ((serversocketChannel) key.channel ()). ยอมรับ (); clntchan.configureblocking (เท็จ); // จะต้องไม่บล็อกเพื่อลงทะเบียน // ลงทะเบียนตัวเลือกด้วยช่องใหม่สำหรับการอ่านและแนบบัฟเฟอร์ไบต์ clntchan.register (key.selector (), selectionKey.op_read, byteBuffer.Allocate (bufSize)); } โมฆะสาธารณะ handleread (คีย์ selectionKey) พ่น IOException {// ช่องสัญญาณซ็อกเก็ตไคลเอ็นต์มีการรอการดำเนินการของ socketchannel clntchan = (socketchannel) key.channel (); bytebuffer buf = (bytebuffer) key.attachment (); long bytesRead = clntchan.read (buf); ถ้า (bytesRead == -1) {// อีกด้านปิดปิดหรือไม่? clntchan.close (); } อื่นถ้า (bytesRead> 0) {// ระบุผ่านคีย์ที่การอ่าน/การเขียนเป็นสิ่งที่น่าสนใจทั้งสองตอนนี้ key.interestops (selectionKey.op_read | selectionKey.op_write); }} โมฆะสาธารณะ HandleWrite (SelectionKey Key) พ่น IOException { / * * ช่องสามารถใช้งานได้และคีย์นั้นถูกต้อง (เช่นช่องไคลเอ็นต์ * ไม่ปิด) */ // ดึงข้อมูลที่อ่านก่อนหน้านี้ bytebuffer buf = (bytebuffer) key.attachment (); buf.flip (); // เตรียมบัฟเฟอร์สำหรับการเขียน socketchannel clntchan = (socketchannel) key.channel (); clntchan.write (buf); if (! buf.hasremaining ()) {// บัฟเฟอร์เขียนอย่างสมบูรณ์? // ไม่มีอะไรเหลืออยู่ดังนั้นจึงไม่สนใจที่จะเขียน key.interestops (selectionKey.op_read) อีกต่อไป; } buf.Compact (); // ทำให้มีที่ว่างสำหรับข้อมูลเพิ่มเติมที่จะอ่านใน}}二、 nio tcp 客户端:
นำเข้า java.net.inetsocketaddress; นำเข้า java.net.socketexception; นำเข้า java.nio.bytebuffer; นำเข้า java.nio.channels.socketChannel; คลาสสาธารณะ tcpechoclientNonblocking {โมฆะคงที่สาธารณะหลัก (สตริง args []) พ่นข้อยกเว้น {สตริงเซิร์ฟเวอร์ = "127.0.0.1"; // ชื่อเซิร์ฟเวอร์หรือที่อยู่ IP // แปลงสตริงอินพุตเป็นไบต์โดยใช้ charset byte [] อาร์กิวเมนต์ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" .getBytes (); int servport = 5500; // สร้างช่องและตั้งค่าเป็น socketchannel clntchan = socketchannel.open (); clntchan.configureblocking (เท็จ); // เริ่มการเชื่อมต่อกับเซิร์ฟเวอร์และสำรวจซ้ำ ๆ จนเสร็จถ้า (! clntchan.connect (ใหม่ inetSocketAddress (เซิร์ฟเวอร์, servport))) {ในขณะที่ (! clntchan.finishconnect ()) {system.out.print ("); // ทำอย่างอื่น}} byteBuffer writebuf = byteBuffer.wrap (อาร์กิวเมนต์); byteBuffer readBuf = byteBuffer.Allocate (ignal.length); int totalByTesRcvd = 0; // ไบต์ทั้งหมดที่ได้รับจนถึงตอนนี้ bytesrcvd; // ไบต์ที่ได้รับในการอ่านครั้งล่าสุดในขณะที่ (TotalByTesRcvd <argign.length) {ถ้า (writebuf.hasremaining ()) {clntchan.write (writebuf); } if ((bytesrcvd = clntchan.read (readbuf)) == -1) {โยน socketexception ใหม่ ("การเชื่อมต่อปิดก่อนกำหนด"); } TotalByTesRcvd += bytesrcvd; System.out.print ("."); // ทำอย่างอื่น} system.out.println ("ได้รับ:" + // แปลงเป็นสตริงต่อสตริงใหม่เริ่มต้น (readbuf.array (), 0, TotalByTesRcvd) .length ()); clntchan.close (); -三、 nio tcp 服务端:
นำเข้า java.io.ioException; นำเข้า java.net.inetsocketaddress; นำเข้า java.nio.channels.*; นำเข้า java.util.iterator; คลาสสาธารณะ TCPSERVERSELECTER {ส่วนตัวคงที่ int bufSize = 256; // ขนาดของบัฟเฟอร์ (ไบต์) การหมดเวลา int สุดท้ายคงที่ส่วนตัว = 3000; // รอหมดเวลา (มิลลิวินาที) โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น IOException {int [] พอร์ต = {5500}; // สร้างตัวเลือกไปยังซ็อกเก็ตฟังมัลติเพล็กซ์และตัวเลือกการเชื่อมต่อตัวเลือก = selector.open (); // สร้างช่องทางการฟังสำหรับแต่ละพอร์ตและลงทะเบียนตัวเลือกสำหรับ (พอร์ต int: พอร์ต) {serversocketChannel listnchannel = serversocketChannel.open (); listnchannel.socket (). ผูก (ใหม่ inetSocketAddress (พอร์ต)); listnchannel.configureblocking (เท็จ); // จะต้องไม่ปิดกั้นเพื่อลงทะเบียน // ลงทะเบียนตัวเลือกด้วยช่อง คีย์ที่ส่งคืนจะถูกละเว้น listnchannel.register (ตัวเลือก, selectionKey.op_accept); } // สร้างตัวจัดการที่จะใช้โปรโตคอลโปรโตคอล TCPPROTOCOL = ใหม่ TCPECHOSELECTIONPROTOCOL (BUFSIZE); ในขณะที่ (จริง) {// รันตลอดไปการประมวลผลการดำเนินการ I/O ที่มีอยู่ // รอช่องบางช่องให้พร้อม (หรือหมดเวลา) ถ้า (selector.select (หมดเวลา) == 0) {// ส่งคืน # ของ chans system.out.out.print ("."); ดำเนินการต่อ; } // รับตัววนซ้ำในชุดคีย์ด้วย I/O เพื่อประมวลผลตัววนซ้ำ <SelectionKey> keyIter = selector.selectedKeys (). iterator (); ในขณะที่ (keyiter.hasnext ()) {selectionKey key = keyiter.next (); // คีย์คือบิตหน้ากาก // ช่องซ็อกเก็ตเซิร์ฟเวอร์มีการร้องขอการเชื่อมต่อที่รอดำเนินการหรือไม่ if (key.isacceptable ()) {system.out.println ("---- ยอมรับ -----"); Protocol.handleaccept (คีย์); } // ช่องซ็อกเก็ตไคลเอนต์มีข้อมูลที่รอดำเนินการหรือไม่? if (key.isreadable ()) {system.out.println ("---- อ่าน -----"); Protocol.handleread (คีย์); } // ช่องสัญญาณซ็อกเก็ตไคลเอนต์พร้อมใช้งานสำหรับการเขียนและ // คีย์นั้นถูกต้อง (เช่นช่องไม่ปิด)? if (key.isvalid () && key.iswitable ()) {system.out.println ("---- เขียน -----"); Protocol.HandleWrite (คีย์); } keyiter.remove (); // ลบออกจากชุดของคีย์ที่เลือก}}}}以上就是本文的全部内容, 查看更多 Java 的语法, 大家可以关注: การคิดใน Java 中文手册》、《 Jdk 1.7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》, 也希望大家多多支持武林网。也希望大家多多支持武林网。也希望大家多多支持武林网。也希望大家多多支持武林网。