一、回传协议接口和 UDP 方式实现:
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.net.socketAddress; importar java.nio.channels.*; importar java.nio.byteBuffer; importar java.io.ioException; Classe pública udPechoseSelectorProtocol implementos <span style = "font-size: 1em; altura de linha: 1.5;"> echoprotocol </span> <span style = "font-size: 1em; linha-altura: 1.5;"> {</span> estática privada int echomax = 255; // Tamanho máximo da classe estática eco datagrama clientrecord {public SocketAddress ClientAddress; public bytebuffer buffer = bytebuffer.allocate (Echomax); } public void handleaccept (chave de seleção) lança ioexception {} public void handleRead (selectionKey key) lança ioexception {datagramchannel canal = (datagramchannel) key.channel (); ClientRecord clntrec = (clientrecord) key.attachment (); clntrec.buffer.clear (); // Prepare o buffer para receber clntrec.clientaddress = canal.receive (clntrec.buffer); if (clntrec.clientaddress! = null) {// recebemos algo? // registre gravação com o seletor key.inteSTOPS (SelectionKey.op_write); }} public void handleWrite (seleção chave) lança IoException {DataGramChannel Channel = (DataGramChannel) key.Channel (); ClientRecord clntrec = (clientrecord) key.attachment (); clntrec.buffer.flip (); // Prepare o buffer para enviar int byTessent = canal.send (clntrec.buffer, clntrec.clientaddress); if (byTessent! = 0) {// buffer completamente escrito? // não está mais interessado em gravações key.interoSTOps (SelectionKey.op_read); }}}二、 nio udp 客户端:
importar java.net.inetsocketaddress; importar java.net.socketexception; importar java.nio.byteBuffer; importar java.nio.channels.datagramchannel; classe pública udPechoclientNonBlocking {private estático final int timeout = 3000; // reenviar o tempo limite (milissegundos) private estático final int maxtries = 255; // A máxima retransmissões public estática void main (string args []) lança a exceção {// converte a string de entrada em bytes usando o charset padrão byte [] byTestosend = "0123456789AbcdefghijklmnopqrStuvwxyzzzzzyz". // Crie canal e defina como não bloqueio 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; // bytes totais recebidos até agora int bytesrcvd; // bytes recebidos na última leitura while (totalbytesrcvd <bytestosend.length) {if (writebuf.hasRemaining ()) {datagramchannel.write (writebuf); } if ((bytesrcvd = datagramchannel.read (readbuf)) == -1) {tire nova democência ("conexão fechada prematuramente"); } totalbytesrcvd += bytesrcvd; System.out.print ("."); // faça outra coisa} System.out.println ("Recebido:" + new String (readbuf.array (), 0, totalbytesrcvd)); datagramchannel.close (); }}三、 nio udp 服务端:
importar java.io.ioException; importar java.net.inetsocketaddress; importar java.nio.channels.*; importar java.util.iterator; classe pública udPechoserVerSelector {private estático final int timeout = 3000; // Tempo limite de espera (milissegundos) public static void main (string [] args) lança ioexception {// cria um seletor para conexões de cliente multiplex. Seletor seletor = selettor.open (); DataGramChannel Channel = DataGramChannel.open (); canal.configureblocking (false); Channel.socket (). Bind (New InetSocketAddress (5500)); Channel.Register (Selector, SelectionKey.OP_READ, novo UDPechosElectorProtocol.clientRecord ()); UdPechosElectorProtocol echosElectorProtocol = new UDCechosElectorProtocol (); while (true) {// executa para sempre, receber e ecoar datagramas // aguarde a tarefa ou até que o tempo limite expire se (selettor.select (timeout) == 0) {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 do cliente tem dados pendentes? if (key.isReADable ()) echosElectorProtocol.HandleRead (key); // O canal de soquete do cliente está disponível para escrever e // a chave é válida (ou seja, canal não fechado). if (key.isValid () && key.iswritable ()) echosElectorprotocol.HandleWrite (key); keyiter.remove (); }}}}以上就是本文的全部内容 , Java 的语法 , 大家可以关注 : : Pensando em Java 中文手册》、《 jdk 1.7 参考手册官方英文版》、《 jdk 1.6 api java 中文参考手册》、《 jdk 1.5 api java 中文参考手册》 , 也希望大家多多支持武林网。 也希望大家多多支持武林网。