一、回传协议接口和 TCP 方式实现 :
1. : :
Импорт java.nio.channels.selectionKey; импортировать java.io.ioexception; Общедоступный интерфейс Echoprotocol {void handleAccept (celectionKey) бросает ioException; void handleread (keection -key) бросает ioException; void ручка (клавиша SelectionKey) бросает ioException; }2. 实现 :
импортировать java.nio.channels.*; Импорт java.nio.bytebuffer; импортировать java.io.ioexception; Общедоступный класс tcpechoselectorprotocol реализует эхопротокол {private int bufsize; // размер буфера ввода/вывода Public EchoselectorProtocol (int bufsize) {this.bufsize = bufsize; } public void handleAccept (key selectionKey) бросает ioException {socketchannel clntchan = (((serversocketchannel) key.channel ()). Accept (); clntchan.configureblocking (false); // Должен быть неблокирующий, чтобы зарегистрировать // регистрация селектора новым каналом для чтения и прикрепления байтового буфера clntchan.register (key.selector (), selectionkey.op_read, bytebuffer.allocate (bufsize)); } public void handleread (key key keeke) throws ioException {// Клиентский канал сокета имеет ожидание данных socketchannel clntchan = (socketchannel) key.channel (); Bytebuffer buf = (bytebuffer) key.attachment (); long bytesread = clntchan.read (buf); if (bytesread == -1) {// закроется другой конец? clntchan.close (); } else if (bytesRead> 0) {// укажите через ключ, что чтение/письмо теперь представляют интерес. key.interestops (selectionKey.op_read | selectionKey.op_write); }} public void Руководство (клавиша SelectionKey) бросает ioException { / * * канал доступен для написания, а ключ действителен (т.е. не закрыт клиент * не закрыт). */ // Получить данные, прочитанные ранее bytebuffer buf = (bytebuffer) key.attachment (); buf.flip (); // Подготовка буфера для написания socketchannel clntchan = (socketchannel) key.channel (); clntchan.write (buf); if (! buf.hasreming ()) {// Буфер полностью написан? // ничего не осталось, поэтому больше не интересует wrises key.interestops (selectionkey.op_read); } buf.compact (); // освободить место для получения дополнительных данных в}}二、 nio tcp 客户端 :
Импорт java.net.inetsocketAddress; Импорт java.net.socketException; Импорт java.nio.bytebuffer; импортировать java.nio.channels.socketchannel; открытый класс tcpechoclientnonblocking {public static void main (string args []) бросает исключение {String server = "127.0.0.1"; // Имя сервера или IP -адрес // Конвертировать входную строку в байты с использованием по умолчанию charset byte [] argirt = "0123456789abcdefghijklmnopqrstuvwxyz" .getbytes (); int servport = 5500; // Создать канал и установить для неблокирующего Socketchannel Clntchan = socketchannel.open (); clntchan.configureblocking (false); // инициировать подключение к серверу и многократно опросить до завершения if (! Clntchan.connect (new inetsocketAddress (server, servport)) {while (! Clntchan.finishConnect ()) {System.out.print ("."); // Сделай что -нибудь еще}} bytebuffer writebuf = bytebuffer.wrap (argery); Bytebuffer readbuf = bytebuffer.allocate (argery.length); int totalbytesrcvd = 0; // общее количество байтов, полученных до сих пор int bytesrcvd; // байты, полученные в последнем чтении, пока (totalbytesrcvd <argys.length) {if (writebuf.hasreming ()) {clntchan.write (writebuf); } if ((bytesrcvd = clntchan.read (readbuf)) == -1) {throw new SocketException ("Соединение закрыто преждевременно"); } totalBytesrcvd += bytesrcvd; System.out.print ("."); // Сделать что -то еще} System.out.println ("Получен:" + // конвертировать в строку в течение по умолчанию charset new String (readbuf.array (), 0, totalbytesrcvd) .length ()); clntchan.close (); }}三、 nio tcp 服务端 :
импортировать java.io.ioexception; Импорт java.net.inetsocketAddress; импортировать java.nio.channels.*; импортировать java.util.iterator; Public Class Tcpserverselector {Private Static Final int bufsize = 256; // размер буфера (байты) Частный статический финальный тайм -аут = 3000; // Тайм -аут ожидания (миллисекунды) public static void main (string [] args) бросает ioException {int [] ports = {5500}; // Создать селектор для мультиплексного прослушивания сокетов и селектора соединений = selector.open (); // Создать канал сокета прослушивания для каждого селектора порта и регистра для (int port: ports) {sercrovocketchannel listnChannel = serversocketchEnkannel.open (); listnchannel.socket (). Bind (new InetsocketAddress (порт)); listnchannel.configureblocking (false); // Должен быть неблокирующий для регистрации // Селектор регистрации с каналом. Возвращенный ключ игнорируется listnchannel.register (selector, selectionkey.op_accte); } // Создать обработчик, который будет реализовать протокол TCPPROTOCOL Protocol = new TCPeChoSelectorProtocol (Bufsize); while (true) {// запустить навсегда, обработка доступна операции ввода/вывода // ждать, пока какой -то канал будет готов (или тайм -аут) if (selector.select (timeout) == 0) {// Возвращает # of Ready Chans System.out.print ("."); продолжать; } // Получить итератор на наборе клавиш с I/O для обработки итератора <selectionKey> keyter = selector.selectedKeys (). Iterator (); while (keyiter.hasnext ()) {selectionKey key = keyiter.next (); // Ключ - это битовая маска // Server Socket Channel имеет ожидающие запросы на подключение? if (key.isaceceptable ()) {System.out.println ("---- Принять -----"); Protocol.handleAccept (Key); } // Клиентский канал сокета имеет ожидающие данные? if (key.isReadable ()) {System.out.println ("---- Read -----"); Protocol.handleread (Key); } // Клиентский канал сокета доступен для написания, а ключ // ключ действителен (т.е. канал не закрыт)? if (key.isvalid () && key.iswrite ()) {system.out.println ("---- write -----"); Protocol.HandleWrite (Key); } keyiter.remove (); // Удалить из набора выбранных клавиш}}}}以上就是本文的全部内容 , 查看更多 java 的语法 大家可以关注 : : 《Мышление в Java 中文手册》、《 JDK 1,7 参考手册官方英文版》、《 JDK 1.6 API Java 中文参考手册》、《 JDK 1,5 API Java 中文参考手册》 , 也希望大家多多支持武林网。