一、回传协议接口和 UDP 方式实现 :
1. : :
Импорт java.nio.channels.selectionKey; импортировать java.io.ioexception; Общедоступный интерфейс Echoprotocol {void handleAccept (celectionKey) бросает ioException; void handleread (keection -key) бросает ioException; void ручка (клавиша SelectionKey) бросает 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 = "font-size: 1em; line-height: 1,5;"> {</span> частное статическое окончательное окончательное окончательное значение = 255; // максимальный размер Echo Datagram Static Class ClientRecord {public socketAddress clientAddress; Общественный буфер Bytebuffer = bytebuffer.allocate (echomax); } public void handleAccept (key selectionKey) бросает ioException {} public void handleread (key selectionKey) throws ioException {datagramChannel Channel = (datagramChannel) key.channel (); ClientRecord clntrec = (clientRecord) key.attachment (); clntrec.buffer.clear (); // Подготовка буфера для получения clntrec.clientaddress = channel.receive (clntrec.buffer); if (clntrec.clientaddress! = null) {// Мы что -то получили? // зарегистрировать записи с помощью селектора. }} public void Руководство (клавиша SelectionKey) бросает ioException {datagramChannel Channel = (datagramChannel) key.channel (); ClientRecord clntrec = (clientRecord) key.attachment (); clntrec.buffer.flip (); // Подготовка буфера для отправки int bytessent = channel.send (clntrec.buffer, clntrec.clientaddress); if (bytessent! = 0) {// Буфер полностью написан? // больше не заинтересована в записи key.interestops (selectionkey.op_read); }}}二、 nio udp 客户端 :
Импорт java.net.inetsocketAddress; Импорт java.net.socketException; Импорт java.nio.bytebuffer; импортировать java.nio.channels.datagramChannel; открытый класс udpechoclientnonblocking {private static final int timeout = 3000; // Вторжение тайм -аута (миллисекунды) Частный статический окончательный финал int maxtries = 255; // максимальные ретрансмиссии public static void main (String args []) бросает исключение {// преобразование входной строки в байты с использованием байта charset по умолчанию [] bytestosend = "0123456789abcdefghijklmnopqrStuvwxyz" .getBytes (); // Создать канал и установить для неблокирующего DatagramChannel DatagramChannel = datagramChannel.open (); datagramChannel.configureblocking (false); datagramChannel.socket (). setSotimeout (timeout); Bytebuffer writebuf = bytebuffer.wrap (bytestosend); Bytebuffer readbuf = bytebuffer.allocate (maxtries); datagramChannel = datagramChannel.connect (new InetSocketAddress ("127.0.0.1", 5500)); int totalbytesrcvd = 0; // общее количество байтов, полученных до сих пор int bytesrcvd; // байты, полученные в последнем чтении, пока (totalbytesrcvd <bytestosend.length) {if (writebuf.hasreming ()) {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 {private static final int timeout = 3000; // Тайм -аут ожидания (миллисекунды) Public static void Main (String [] args) бросает ioException {// Создание селектора для мультиплексных клиентских соединений. Селектор SELECTER = SELECTER.OPEN (); DatagramChannel Channel = datagramChannel.open (); Channel.configureblocking (false); channel.socket (). bind (new inetsocketaddress (5500)); channel.register (selector, selectionkey.op_read, new udpechoselectorprotocol.clientRecord ()); Udpechoselectorprotocol echoselectorprotocol = new udpechoselectorprotocol (); while (true) {// запустить навсегда, получая и эхо -документы // ждать задачи или до тех пор, пока не истекает времени, если (selector.select (timeout) == 0) {System.out.print ("."); продолжать; } // Получить итератор на наборе клавиш с I/O для обработки итератора <selectionKey> keyter = selector.selectedKeys (). Iterator (); while (keyiter.hasnext ()) {selectionKey key = keyiter.next (); // Ключ - это битовая маска // Клиентский канал сокета имеет ожидающие данные? if (key.isReadable ()) echoselectorprotocol.handleread (key); // Клиентский канал сокета доступен для написания, а ключ // ключ действителен (т.е., канал не закрыт). if (key.isvalid () && key.iswrite ()) echoselectorprotocol.handlewrite (key); keyiter.remove (); }}}}以上就是本文的全部内容 , 查看更多 java 的语法 大家可以关注 : : 《Мышление в Java 中文手册》、《 JDK 1,7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1,5 API Java 中文参考手册》 , 也希望大家多多支持武林网。