一、回传协议接口和 TCP 方式实现:
1. 接口:
importar java.nio.channels.selectionKey; importar java.io.ioException; interface pública ecoprotocolo {void handleaccept (chave de seleção) lança ioexception; Void HandleRead (chave de seleção) lança a ioException; Void HandleWrite (seleção Key Key) lança IoException; }2. 实现:
importar java.nio.channels.*; importar java.nio.byteBuffer; importar java.io.ioException; classe pública tcPechosElectorProtocol implementa ecoprotocolo {private int bufsize; // Tamanho do buffer de E/S Buffer ECHOSELECTERSPROTOCOL (INT bufSize) {this.bufsize = bufsize; } public void handleAccept (chave de seleção) lança a ioexception {socketchannel clntchan = ((serversocketchannel) key.channel ()). aceit (); clntchan.configureblocking (falso); // deve não estar bloqueando para registrar // registrar o seletor no novo canal para leitura e anexo byte buffer clntchan.register (key.selector (), SelectionKey.op_read, bytebuffer.Allocate (bufsize)); } public void HandleRead (tecla seleção) lança IoException {// O canal de soquete do cliente possui Data Socketchannel Clntchan = (Socketchannel) key.Channel (); BYTEBUFFER BUF = (BYTEBUFFER) key.attachment (); bytesread longo = clntchan.read (buf); if (bytesread == -1) {// O outro final fechou? clntchan.close (); } else if (bytesread> 0) {// indicar através da chave que a leitura/escrita é de interesse agora. key.inteSTOPS (SelectionKey.op_Read | SelectionKey.OP_WRITE); }} public void HandleWrite (seleção KEYKEN) lança IoException { / * * O canal está disponível para gravação, e Key é válido (ou seja, canal do cliente * não fechado). */ // Recuperar dados lidos anteriores bytebuffer buf = (bytebuffer) key.attachment (); buf.flip (); // Prepare o buffer para escrever Socketchannel clntchan = (Socketchannel) key.Channel (); clntchan.write (buf); if (! buf.hasRemaining ()) {// buffer completamente escrito? // Nada restante, então não está mais interessado em gravar key.inteSTOps (SelectionKey.op_read); } buf.compact (); // abre espaço para que mais dados sejam lidos em}}二、 nio tcp 客户端:
importar java.net.inetsocketaddress; importar java.net.socketexception; importar java.nio.byteBuffer; importar java.nio.channels.socketchannel; classe pública tcPechoclientNonBlocking {public static void main (string args []) lança exceção {string server = "127.0.0.1"; // Nome do servidor ou endereço IP // Converta a string de entrada em bytes usando o Charset padrão byte [] argument = "0123456789abcdefghijklmnopqrstStuvwxyz" .getBytes (); int servport = 5500; // Crie canal e defina como Socketchannel não bloqueador clntchan = socketchannel.open (); clntchan.configureblocking (falso); // inicia a conexão com o servidor e pesquise repetidamente até concluir se (! Clntchan.connect (new inetSocketAddress (servidor, servport))) {while (! Clntchan.finishconnect ()) {System.out.print ("."); // faça outra coisa}} bytebuffer writeBuf = bytebuffer.wrap (argumento); Bytebuffer readBuf = bytebuffer.allocate (argument.length); int totalbytesrcvd = 0; // bytes totais recebidos até agora int bytesrcvd; // bytes recebidos na última leitura while (totalbytesrcvd <argum argument.length) {if (writebuf.hasRemaining ()) {clntchan.write (writebuf); } if ((bytesrcvd = clntchan.read (readbuf)) == -1) {lança a nova demora ("conexão fechada prematuramente"); } totalbytesrcvd += bytesrcvd; System.out.print ("."); // Faça outra coisa} System.out.println ("Recebido:" + // converte em string por string padrão novo string (readbuf.array (), 0, totalbytesrcvd) .length ()); clntchan.close (); }}三、 nio tcp 服务端:
importar java.io.ioException; importar java.net.inetsocketaddress; importar java.nio.channels.*; importar java.util.iterator; classe pública TCPSERVERSELECTOR {private estático final int bufsize = 256; // tamanho do buffer (bytes) private estático final int timeout = 3000; // Tempo limite de espera (milissegundos) public static void main (string [] args) lança ioexception {int [] portas = {5500}; // Crie um seletor para soquetes de escuta e conexões seletor seletor = seletor.open (); // Crie canal de soquete de escuta para cada porta e registre seletor para (porta int: portas) {serverSocketchannel listNChannel = serversocketchannel.open (); listNChannel.socket (). Bind (new inetSocketAddress (porta)); listNchannel.configureblocking (false); // deve não estar bloqueando para se registrar // registrar seletor no canal. A tecla retornada é ignorada listNChannel.register (Selector, SelectionKey.OP_ACECT); } // Crie um manipulador que implemente o protocolo tcpprotocol protocolo = new tcPechosElectorProtocol (bufsize); enquanto (true) {// executa para sempre, processando operações de E/S disponíveis // aguarde que algum canal esteja pronto (ou tempo limite) se (selettor.select (timeout) == 0) {// retorna # de prontos chans system.out.print ("". "); continuar; } // Obtenha o iterador no conjunto de chaves com a E/S para processar o iterador <setionKeyKey> keyiter = selector.lectectedkeys (). Iterator (); while (keyiter.hasNext ()) {SelectionKey key = keyiter.Next (); // key é bit máscara // canal de soquete de servidor tem solicitações de conexão pendentes? if (key.isAceptable ()) {System.out.println ("---- Aceitar -----"); protocol.handleaccept (key); } // O canal de soquete do cliente tem dados pendentes? if (key.isReADable ()) {System.out.println ("---- Read -----"); protocol.HandleRead (chave); } // O canal de soquete do cliente está disponível para escrever e // key é válido (ou seja, canal não fechado)? if (key.isValid () && key.iswritable ()) {System.out.println ("---- write -----"); protocol.HandleWrite (chave); } keyiter.remove (); // Remova do conjunto de teclas selecionadas}}}}以上就是本文的全部内容 , Java 的语法 , 大家可以关注 : : Pensando em Java 中文手册》、《 jdk 1.7 参考手册官方英文版》、《 jdk 1.6 api java 中文参考手册》、《 jdk 1.5 api java 中文参考手册》 , 也希望大家多多支持武林网。 也希望大家多多支持武林网。