一、回传协议接口和 UDP 方式实现:
1. 接口:
นำเข้า java.nio.channels.SelectionKey; นำเข้า java.io.ioException; ส่วนต่อประสานสาธารณะ echoprotocol {โมฆะ handleaccept (selectionKey key) พ่น IOException; โมฆะ Handleread (SelectionKey Key) พ่น IOException; Void HandleWrite (SelectionKey Key) พ่น IOException; -2. 实现:
นำเข้า java.net.socketaddress; นำเข้า java.nio.channels.*; นำเข้า java.nio.bytebuffer; นำเข้า java.io.ioException; ชั้นเรียนสาธารณะ UDPechoselectorProtocol ใช้ <span style = "font-size: 1em; line-height: 1.5;"> echoprotocol </span> <span style = "ตัวอักษรขนาด: 1em; จุดสูง: 1.5;"> {</span> // ขนาดสูงสุดของ Echo DataGram class class Static clientRecord {socketaddress สาธารณะ clientaddress; Bytebuffer Buffer = byteBuffer.Allocate (ECHOMAX); } โมฆะสาธารณะ handleaccept (selectionKey key) พ่น IOException {} โมฆะสาธารณะ handleread (คีย์ตัวเลือกคีย์) พ่น IOException {dataGramChannel channel = (datagramChannel) key.channel (); clientRecord clntrec = (clientRecord) key.attachment (); clntrec.buffer.clear (); // เตรียมบัฟเฟอร์สำหรับการรับ clntrec.clientaddress = channel.receive (clntrec.buffer); ถ้า (clntrec.clientaddress! = null) {// เราได้รับบางสิ่งบางอย่างหรือไม่? // ลงทะเบียนเขียนด้วยคีย์ตัวเลือก ininterestops (selectionKey.op_write); }} โมฆะสาธารณะ HandleWrite (SelectionKey Key) พ่น IOException {dataGramChannel channel = (dataGramChannel) key.channel (); clientRecord clntrec = (clientRecord) key.attachment (); clntrec.buffer.flip (); // เตรียมบัฟเฟอร์สำหรับการส่ง int bytessent = channel.send (clntrec.buffer, clntrec.clientaddress); ถ้า (bytessent! = 0) {// บัฟเฟอร์เขียนอย่างสมบูรณ์? // ไม่สนใจในการเขียน key.interestops (selectionKey.op_read) อีกต่อไป; -二、 nio udp 客户端:
นำเข้า java.net.inetsocketaddress; นำเข้า java.net.socketexception; นำเข้า java.nio.bytebuffer; นำเข้า java.nio.channels.datagramchannel; ชั้นเรียนสาธารณะ UdPechoclientNonblocking {ส่วนตัวคงที่ครั้งสุดท้าย Int Timeout = 3000; // ส่งหมดเวลากลับ (มิลลิวินาที) ส่วนบุคคลสุดท้ายคงที่ maxtries = 255; // สูงสุด retransmissions โมฆะคงที่สาธารณะหลัก (String args []) โยนข้อยกเว้น {// แปลงสตริงอินพุตเป็นไบต์โดยใช้ byte charset เริ่มต้น [] bytestosend = "0123456789abcdefghijklmnopqrstuvwxyz" // สร้างช่องและตั้งค่าเป็น dataGramChannel dataGramChannel = dataGramChannel.open (); DataGramChannel.ConfigureBlocking (เท็จ); dataGramChannel.socket (). setSotimeout (หมดเวลา); bytebuffer writebuf = byteBuffer.wrap (bytestosend); bytebuffer readBuf = byteBuffer.Allocate (MaxTries); dataGramChannel = dataGramChannel.Connect (ใหม่ inetSocketAddress ("127.0.0.1", 5500)); int totalByTesRcvd = 0; // ไบต์ทั้งหมดที่ได้รับจนถึงตอนนี้ bytesrcvd; // ไบต์ที่ได้รับในการอ่านล่าสุดในขณะที่ (TotalByTesRcvd <bytestosend.length) {ถ้า (writebuf.hasremaining ()) {datagramchannel.write (writebuf); } if ((bytesrcvd = dataGramChannel.read (readBuf)) == -1) {โยน socketException ใหม่ ("การเชื่อมต่อปิดก่อนกำหนดก่อนกำหนด"); } TotalByTesRcvd += bytesrcvd; System.out.print ("."); // ทำอย่างอื่น} system.out.println ("ได้รับ:" + สตริงใหม่ (readbuf.array (), 0, TotalByTesRcvd)); dataGramChannel.close (); -三、 nio udp 服务端:
นำเข้า java.io.ioException; นำเข้า java.net.inetsocketaddress; นำเข้า java.nio.channels.*; นำเข้า java.util.iterator; ชั้นเรียนสาธารณะ UDPechoserversElector {ส่วนตัวคงที่ครั้งสุดท้าย Int Timeout = 3000; // รอหมดเวลา (มิลลิวินาที) โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น IOException {// สร้างตัวเลือกไปยังการเชื่อมต่อไคลเอ็นต์มัลติเพล็กซ์ ตัวเลือกตัวเลือก = selector.open (); dataGramChannel channel = dataGramChannel.open (); channel.configureblocking (เท็จ); channel.socket (). ผูก (ใหม่ inetSocketAddress (5500)); channel.register (selector, selectionKey.op_read, udpechoselectorprotocol.clientrecord ใหม่ ()); UDPechoselectorProtocol echoselectorProtocol = ใหม่ UDPechoselectorProtocol (); ในขณะที่ (จริง) {// ทำงานตลอดไปรับและสะท้อนดาต้าแกรม // รองานหรือจนกว่าการหมดเวลาจะหมดอายุถ้า (selector.select (หมดเวลา) == 0) {system.out.print ("."); ดำเนินการต่อ; } // รับตัววนซ้ำในชุดคีย์ด้วย I/O เพื่อประมวลผลตัววนซ้ำ <SelectionKey> keyIter = selector.selectedKeys (). iterator (); ในขณะที่ (keyiter.hasnext ()) {selectionKey key = keyiter.next (); // คีย์คือ Bit Mask // Channel Channel Client มีข้อมูลที่รอดำเนินการหรือไม่? if (key.isreadable ()) echoselectorprotocol.handleread (คีย์); // ช่องสัญญาณซ็อกเก็ตไคลเอนต์พร้อมใช้งานสำหรับการเขียนและ // คีย์นั้นถูกต้อง (เช่นช่องไม่ปิด) if (key.isvalid () && key.iswitable ()) echoselectorprotocol.handlewrite (คีย์); keyiter.remove (); -以上就是本文的全部内容, 查看更多 Java 的语法, 大家可以关注: การคิดใน Java 中文手册》、《 Jdk 1.7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1.5 API Java 中文参考手册》, 也希望大家多多支持武林网。也希望大家多多支持武林网。也希望大家多多支持武林网。也希望大家多多支持武林网。